MTU در BLE: چیست، اندازه بسته و توافق

نویسنده: IT Sectr منتشر شده: 2026-07-15 زمان مطالعه: 10 دقیقه

MTU (Maximum Transmission Unit) — حداکثر اندازه داده‌های مفید در یک بسته BLE است که می‌تواند در یک تراکنش GATT بین دستگاه‌ها منتقل شود. در BLE Classic (4.x) MTU در سطح 23 بایت ثابت است که برای خواندن‌های کوچک سنسورها کافی است، اما برای انتقال فایل‌ها یا به‌روزرسانی‌های OTA ناکافی است. Bluetooth Core Specification 4.2 (2014) رویه MTU Size Request را معرفی کرد که امکان توافق بر سر MTU بزرگتر — تا 247 بایت (BLE 5.0 — تا 251 بایت) را فراهم می‌کند. پیکربندی صحیح MTU یکی از عوامل کلیدی عملکرد برنامه‌های BLE است که حجم زیادی از داده را انتقال می‌دهند.

نکات اصلی

  • MTU — حداکثر اندازه داده در یک بسته BLE، از 23 بایت (BLE 4.x) تا 251 بایت (BLE 5.0).
  • توافق MTU از طریق MTU Size Request/Response پس از برقراری اتصال GATT انجام می‌شود.
  • MTU بزرگ (247 بایت) سرعت انتقال داده را در مقایسه با 23 بایت استاندارد 5–10 برابر افزایش می‌دهد.
  • Android به طور خودکار با BLE 5.0 517 بایت MTU درخواست می‌کند، iOS — 512 بایت از طریق requestMTU.
  • در به‌روزرسانی‌های OTA فریم‌ویر، MTU بزرگ زمان انتقال را از دقیقه به ثانیه کاهش می‌دهد.

MTU در BLE چیست؟

Maximum Transmission Unit (MTU) در زمینه BLE — حداکثر اندازه Application Protocol Data Unit (APDU) است که یک دستگاه می‌تواند در یک درخواست GATT دریافت کند. MTU در سطح ATT (Attribute Protocol) تعریف می‌شود و شامل هدر ATT (1 بایت) + داده‌های مفید است. به طور پیش‌فرض همه دستگاه‌های BLE از MTU 23 بایت پشتیبانی می‌کنند (23 = 1 بایت هدر ATT + 22 بایت داده).

MTU محدودیت فیزیکی کانال رادیویی نیست، بلکه توافقی بین دستگاه‌ها در سطح GATT است. اندازه فیزیکی بسته BLE در لایه Link Layer می‌تواند بزرگتر باشد (تا 27 بایت در BLE 4.0، تا 257 بایت در BLE 5.0 با Data Length Extension)، اما لایه GATT محدود می‌کند که چقدر داده در یک تراکنش منتقل می‌شود. Data Length Extension (DLE) — مکانیزم جداگانه‌ای در لایه Link Layer است که بسته فیزیکی را تا 251 بایت افزایش می‌دهد و باید جداگانه توافق شود.

تفاوت بین MTU و DLE: ATT MTU — چقدر داده در یک درخواست GATT منتقل می‌شود، DLE — چقدر داده در یک بسته Link Layer جا می‌شود. برای حداکثر سرعت، هر دو پارامتر باید توافق شوند. بدون DLE حتی با MTU 247 بایت، داده‌ها به چندین بسته Link Layer 27 بایتی تکه‌تکه می‌شوند و پهنای باند را کاهش می‌دهند.

توافق MTU: رویه و پروتکل

MTU Size Request — رویه‌ای که توسط Central پس از برقراری اتصال GATT آغاز می‌شود. Central MTU Request را با مشخص کردن ظرفیت MTU خود (حداکثر اندازه‌ای که می‌تواند دریافت کند) ارسال می‌کند. Peripheral با MTU Response با مقدار خود پاسخ می‌دهد. MTU استفاده شده حداقل دو مقدار است. اگر Central MTU 512 را پیشنهاد کند و Peripheral فقط 128 را پشتیبانی کند، اتصال از MTU 128 استفاده خواهد کرد.

swift
import CoreBluetooth

// درخواست حداکثر MTU در iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS به طور خودکار MTU را هنگام اتصال توافق می‌کند
            // MTU = 512 برای دستگاه‌های BLE 5.0
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("MTU توافق شده: " +
          String(mtu))
}

زمان‌بندی توافق: MTU Request باید پس از کشف سرویس‌ها (discoverServices)، اما قبل از شروع انتقال فعال داده ارسال شود. در iOS Core Bluetooth به طور خودکار MTU را هنگام اتصال توافق می‌کند — توسعه‌دهنده نیازی به ارسال دستی MTU Request ندارد. در Android باید به صراحت requestMTU فراخوانی شود. پس از توافق، MTU برای این اتصال ثابت می‌ماند — توافق مجدد بدون قطع و اتصال مجدد امکان‌پذیر نیست.

محدودیت‌های ATT: چرا MTU نمی‌تواند بیشتر از 251 بایت باشد

ATT (Attribute Protocol) — پروتکلی که GATT بر اساس آن ساخته شده است. بسته ATT حداکثر اندازه 257 بایت دارد (ATT_MTU-1). از این مقدار، 1 بایت Opcode (نوع عملیات)، 1 بایت Handle، و تا 255 بایت Value است. بنابراین، حداکثر MTU مجاز توسط مشخصات ATT 257 بایت است (در عمل تا 251 بایت استفاده می‌شود، زیرا برخی فیلدهای خدماتی همچنان مورد نیاز هستند).

برای ارسال داده‌های بزرگتر از MTU از تکه‌تکه‌سازی در سطح برنامه استفاده می‌شود. توسعه‌دهنده خود داده‌ها را به تکه‌هایی با اندازه ≤ MTU تقسیم کرده و به صورت متوالی ارسال می‌کند. هر تکه به عنوان یک درخواست GATT Write Request جداگانه ارائه می‌شود. طرف دریافت‌کننده تکه‌ها را در یک بافر واحد جمع می‌کند. پشتیبانی داخلی از تکه‌تکه‌سازی در GATT وجود ندارد — این وظیفه توسعه‌دهنده است.

نسخه BLEحداکثر MTUحداکثر DLEمحدودیت ATT MTU
BLE 4.0 / 4.123 بایت27 بایتATT ثابت
BLE 4.2247 بایت251 بایت257 بایت
BLE 5.0251 بایت251 بایت257 بایت
Android + iOS512 / 517251 بایتتجاوز از ATT

نکته جالب: iOS و Android به ترتیب MTU 512 و 517 بایت درخواست می‌کنند، اما این مقدار از محدودیت ATT فراتر می‌رود. در عمل، پشته BLE چنین داده‌هایی را به طور خودکار تکه‌تکه کرده و به صورت چندین درخواست GATT متوالی حداکثر 251 بایتی ارسال می‌کند. برای توسعه‌دهنده تفاوت قابل مشاهده نیست — writeValue با هر اندازه تا 512 بایت در iOS کار می‌کند.

تأثیر MTU بر عملکرد

اندازه MTU مستقیماً بر پهنای باند اتصال BLE تأثیر می‌گذارد. با MTU 23 بایت، حداکثر سرعت مفید انتقال در شرایط ایده‌آل حدود 7–10 کیلوبایت بر ثانیه است. افزایش MTU به 247 بایت سرعت را به 60–90 کیلوبایت بر ثانیه می‌رساند (با DLE و connection interval بهینه). این به ویژه برای برنامه‌هایی که تصاویر، قطعات صوتی یا لاگ‌ها را انتقال می‌دهند مهم است.

عملکرد انتقال BLE به سه عامل بستگی دارد: MTU (چقدر داده در یک درخواست ATT)، connection interval (چند وقت یکبار رویدادهای تبادل رخ می‌دهد) و DLE (چقدر داده در یک بسته Link Layer). پیکربندی بهینه برای حداکثر سرعت: MTU = 247، DLE = 251، connection interval = 7.5 ms (حداقل مقدار).

بر اساس داده‌های Bluetooth SIG White Paper (2023)، افزایش MTU از 23 به 247 بایت با connection interval 30 ms پهنای باند را از 8 کیلوبایت بر ثانیه به 42 کیلوبایت بر ثانیه — افزایش 5 برابری — می‌رساند. با connection interval 7.5 ms پهنای باند به 88 کیلوبایت بر ثانیه می‌رسد. برای برنامه‌هایی که سرعت بالا نیاز ندارند (سنسورهای دما، بیکن‌های BLE)، MTU استاندارد 23 بایت کافی است.

پیکربندی MTU در iOS و Android

iOS Core Bluetooth به طور خودکار MTU را هنگام اتصال به Peripheral توافق می‌کند. توسعه‌دهنده می‌تواند MTU جاری را از طریق maximumWriteValueLength بررسی کند، اما نمی‌تواند آن را دستی تنظیم کند. iOS از MTU تا 512 بایت برای دستگاه‌های BLE 5.0 و تا 247 برای BLE 4.2 استفاده می‌کند. برای نوشتن حجم زیادی از داده از writeType: .withResponse برای تحویل تضمینی استفاده کنید.

kotlin
// درخواست MTU در Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// درخواست MTU 517 بایت
bluetoothGatt.requestMtu(517)

// مدیریت نتیجه در callback
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android BluetoothGatt.requestMtu(int) را ارائه می‌دهد که امکان درخواست هر MTU تا 517 بایت را فراهم می‌کند. MTU واقعی توسط دستگاه جانبی تعیین می‌شود — اگر فقط 23 بایت را پشتیبانی کند، Android MTU 23 را برمی‌گرداند. برای تعیین MTU جاری از gatt.requestMtu(0) استفاده کنید — این مقدار جاری را بدون تلاش برای تغییر برمی‌گرداند. Android 12+ از توافق خودکار MTU هنگام اتصال از طریق TRANSPORT_LE پشتیبانی می‌کند.

فریم‌ورک‌های بین پلتفرمی (Flutter, React Native) معمولاً API برای requestMTU ارائه می‌دهند. در کتابخانه FlutterBlue Plus MTU به عنوان پارامتر اتصال تنظیم می‌شود. در RxAndroidBle — از طریق متد requestMtu. توصیه می‌شود همیشه حداکثر MTU را بلافاصله پس از کشف سرویس‌ها، قبل از شروع انتقال داده، توافق کنید تا از تکه‌تکه‌سازی در سطح برنامه جلوگیری شود.

MTU و به‌روزرسانی‌های OTA

به‌روزرسانی‌های OTA (Over-The-Air) فریم‌ویر — پرتقاضاترین سناریو از نظر MTU در BLE. اندازه معمول فریم‌ویر دستگاه IoT 100–500 کیلوبایت است. با MTU 23 بایت و connection interval 30 ms انتقال 100 کیلوبایت حدود 2–3 دقیقه طول می‌کشد. با MTU 247 بایت و DLE 251 بایت — 20–40 ثانیه. و با MTU 512 بایت (iOS) — 10–15 ثانیه.

فرآیند به‌روزرسانی OTA معمولاً شامل: تکه‌تکه‌سازی فریم‌ویر به بسته‌هایی با اندازه ≤ MTU، ارسال متوالی از طریق Notify/Write، تأیید جمع کنترلی هر بسته و تأیید دریافت است. اگر بسته‌ای گم شود، دستگاه درخواست ارسال مجدد می‌کند. قابلیت اطمینان OTA به طور بحرانی به انتخاب صحیح MTU و connection interval بستگی دارد.

توصیه‌هایی برای OTA: حداکثر MTU (247–512 بایت) را توافق کنید، connection interval را 7.5–15 ms تنظیم کنید (اگر دستگاه پشتیبانی می‌کند)، از DLE (Data Length Extension) برای افزایش بسته فیزیکی به 251 بایت استفاده کنید. برای دستگاه‌هایی با حافظه بافر محدود (مانند ماژول‌های BLE مبتنی بر nRF52) حداکثر MTU را در مشخصات تراشه بررسی کنید.

سوالات متداول

اگر MTU توافق نشود چه اتفاقی می‌افتد؟

اتصال از MTU پیش‌فرض — 23 بایت استفاده خواهد کرد. برای اکثر سناریوهای IoT (انتقال خواندن سنسورها) این کافی است. برای انتقال حجم زیادی از داده، سرعت 5–10 برابر کمتر از MTU توافق شده 247 بایت خواهد بود.

آیا می‌توان MTU را پس از شروع انتقال داده تغییر داد؟

خیر، MTU یک بار پس از اتصال توافق می‌شود و بدون قطع و اتصال مجدد قابل تغییر نیست. بنابراین توصیه می‌شود MTU را بلافاصله پس از کشف سرویس‌ها، قبل از شروع انتقال فعال داده توافق کنید.

چرا Android MTU 517 بایت و iOS فقط 512 بایت درخواست می‌کند؟

اینها حداکثرهای تجربی تاریخی برای هر پشته هستند. ATT MTU واقعی طبق مشخصات همچنان به 257 بایت محدود است. پشته‌ها به طور خودکار داده‌های بزرگتر از 251 بایت را به چند بسته تکه‌تکه می‌کنند، بنابراین تفاوت بین 512 و 517 ناچیز است.

MTU چگونه با Data Length Extension (DLE) مرتبط است؟

MTU — اندازه درخواست GATT در سطح ATT. DLE — اندازه بسته فیزیکی در لایه Link Layer. بدون DLE هر درخواست GATT (تا 247 بایت) به بسته‌های 27 بایتی تکه‌تکه می‌شود. با DLE — در یک بسته منتقل می‌شود. برای حداکثر سرعت باید هر دو پارامتر توافق شوند.

چه MTU برای ردیاب تناسب اندام انتخاب کنیم؟

برای ردیاب تناسب اندام که ضربان قلب و گام‌ها را انتقال می‌دهد، MTU استاندارد 23 بایت کافی است. اگر نیاز به انتقال تاریخچه تمرینات (حجم 10–50 کیلوبایت) باشد — MTU 247 بایت را برای تسریع همگام‌سازی داده هنگام اتصال به گوشی هوشمند توافق کنید.

خلاصه

  • MTU — حداکثر اندازه داده در یک درخواست GATT: از 23 بایت (پیش‌فرض) تا 251 بایت (BLE 5.0).
  • توافق MTU از طریق MTU Size Request/Response انجام می‌شود که توسط Central پس از اتصال آغاز می‌شود.
  • پروتکل ATT MTU را به 257 بایت محدود می‌کند، اما iOS و Android تا 512–517 بایت با تکه‌تکه‌سازی خودکار درخواست می‌کنند.
  • افزایش MTU از 23 به 247 بایت پهنای باند را 5–10 برابر با connection interval بهینه افزایش می‌دهد.
  • برای حداکثر سرعت باید MTU + DLE + connection interval 7.5 ms توافق شود.
  • در iOS MTU به طور خودکار توافق می‌شود، در Android — از طریق requestMtu، توصیه می‌شود 247–517 بایت درخواست شود.
  • به‌روزرسانی‌های OTA — پرتقاضاترین سناریو: MTU صحیح زمان انتقال را از دقیقه به ثانیه کاهش می‌دهد.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید