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 است که حجم زیادی از داده را انتقال میدهند.
نکات اصلی
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 Size Request — رویهای که توسط Central پس از برقراری اتصال GATT آغاز میشود. Central MTU Request را با مشخص کردن ظرفیت MTU خود (حداکثر اندازهای که میتواند دریافت کند) ارسال میکند. Peripheral با MTU Response با مقدار خود پاسخ میدهد. MTU استفاده شده حداقل دو مقدار است. اگر Central MTU 512 را پیشنهاد کند و Peripheral فقط 128 را پشتیبانی کند، اتصال از MTU 128 استفاده خواهد کرد.
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 (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.1 | 23 بایت | 27 بایت | ATT ثابت |
| BLE 4.2 | 247 بایت | 251 بایت | 257 بایت |
| BLE 5.0 | 251 بایت | 251 بایت | 257 بایت |
| Android + iOS | 512 / 517 | 251 بایت | تجاوز از ATT |
نکته جالب: iOS و Android به ترتیب MTU 512 و 517 بایت درخواست میکنند، اما این مقدار از محدودیت ATT فراتر میرود. در عمل، پشته BLE چنین دادههایی را به طور خودکار تکهتکه کرده و به صورت چندین درخواست GATT متوالی حداکثر 251 بایتی ارسال میکند. برای توسعهدهنده تفاوت قابل مشاهده نیست — writeValue با هر اندازه تا 512 بایت در iOS کار میکند.
اندازه 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 بایت کافی است.
iOS Core Bluetooth به طور خودکار MTU را هنگام اتصال به Peripheral توافق میکند. توسعهدهنده میتواند MTU جاری را از طریق maximumWriteValueLength بررسی کند، اما نمیتواند آن را دستی تنظیم کند. iOS از MTU تا 512 بایت برای دستگاههای BLE 5.0 و تا 247 برای BLE 4.2 استفاده میکند. برای نوشتن حجم زیادی از داده از writeType: .withResponse برای تحویل تضمینی استفاده کنید.
// درخواست 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 را بلافاصله پس از کشف سرویسها، قبل از شروع انتقال داده، توافق کنید تا از تکهتکهسازی در سطح برنامه جلوگیری شود.
بهروزرسانیهای 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 پیشفرض — 23 بایت استفاده خواهد کرد. برای اکثر سناریوهای IoT (انتقال خواندن سنسورها) این کافی است. برای انتقال حجم زیادی از داده، سرعت 5–10 برابر کمتر از MTU توافق شده 247 بایت خواهد بود.
خیر، MTU یک بار پس از اتصال توافق میشود و بدون قطع و اتصال مجدد قابل تغییر نیست. بنابراین توصیه میشود MTU را بلافاصله پس از کشف سرویسها، قبل از شروع انتقال فعال داده توافق کنید.
اینها حداکثرهای تجربی تاریخی برای هر پشته هستند. ATT MTU واقعی طبق مشخصات همچنان به 257 بایت محدود است. پشتهها به طور خودکار دادههای بزرگتر از 251 بایت را به چند بسته تکهتکه میکنند، بنابراین تفاوت بین 512 و 517 ناچیز است.
MTU — اندازه درخواست GATT در سطح ATT. DLE — اندازه بسته فیزیکی در لایه Link Layer. بدون DLE هر درخواست GATT (تا 247 بایت) به بستههای 27 بایتی تکهتکه میشود. با DLE — در یک بسته منتقل میشود. برای حداکثر سرعت باید هر دو پارامتر توافق شوند.
برای ردیاب تناسب اندام که ضربان قلب و گامها را انتقال میدهد، MTU استاندارد 23 بایت کافی است. اگر نیاز به انتقال تاریخچه تمرینات (حجم 10–50 کیلوبایت) باشد — MTU 247 بایت را برای تسریع همگامسازی داده هنگام اتصال به گوشی هوشمند توافق کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید