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 پیکٹ کا سائز بڑا ہو سکتا ہے (BLE 4.0 میں 27 بائٹس تک، Data Length Extension کے ساتھ BLE 5.0 میں 257 بائٹس تک)، لیکن GATT پرت محدود کرتی ہے کہ فی لین دین کتنا ڈیٹا منتقل ہوتا ہے۔ Data Length Extension (DLE) ایک علیحدہ لنک لیئر میکانزم ہے جو جسمانی پیکٹ کو 251 بائٹس تک بڑھاتا ہے، اور اسے علیحدہ سے گفت و شنید کرنا ہوتی ہے۔
MTU اور DLE کے درمیان فرق: ATT MTU — فی GATT درخواست کتنا ڈیٹا منتقل ہوتا ہے، DLE — ایک لنک لیئر پیکٹ میں کتنا ڈیٹا فٹ ہوتا ہے۔ زیادہ سے زیادہ رفتار کے لیے، دونوں پیرامیٹرز پر گفت و شنید کرنا ضروری ہے۔ DLE کے بغیر، MTU 247 بائٹس کے باوجود بھی، ڈیٹا متعدد 27-بائٹ لنک لیئر پیکٹوں میں تقسیم ہو جائے گا، جس سے تھرو پٹ کم ہو جائے گا۔
MTU Size Request — ایک طریقہ کار جو GATT کنکشن قائم کرنے کے بعد Central شروع کرتا ہے۔ Central اپنی MTU صلاحیت (زیادہ سے زیادہ سائز جسے وہ قبول کر سکتا ہے) بتاتے ہوئے MTU Request بھیجتا ہے۔ Peripheral اپنی قدر کے ساتھ MTU Response کے ساتھ جواب دیتا ہے۔ نتیجے میں MTU دونوں قدروں میں سے کم سے کم ہوتا ہے۔ اگر Central MTU 512 پیش کرتا ہے اور Peripheral صرف 128 کی حمایت کرتا ہے، تو کنکشن MTU 128 استعمال کرے گا۔
import CoreBluetooth
// iOS پر زیادہ سے زیادہ MTU کی درخواست کریں
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS کنکشن پر خود بخود MTU گفت و شنید کرتا ہے
// BLE 5.0 آلات کے لیے MTU = 512
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 ہے۔ لہذا، ATT تصریح کے ذریعہ اجازت شدہ زیادہ سے زیادہ MTU 257 بائٹس ہے (لیکن عملی طور پر 251 بائٹس تک استعمال ہوتا ہے، کیونکہ کچھ اوور ہیڈ فیلڈز اب بھی ضروری ہیں)۔
MTU سے بڑا ڈیٹا بھیجنے کے لیے، ایپلیکیشن سطح پر تقسیم (fragmentation) استعمال کی جاتی ہے۔ ڈویلپر دستی طور پر ڈیٹا کو ≤ 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 اسٹیک اس طرح کے ڈیٹا کو خود بخود تقسیم کرتا ہے، انہیں ہر ایک زیادہ سے زیادہ 251 بائٹس کی متعدد ترتیب وار GATT درخواستوں کے طور پر بھیجتا ہے۔ ڈویلپر کے لیے، فرق شفاف ہے — iOS پر writeValue 512 بائٹس تک کسی بھی سائز کے ساتھ کام کرتا ہے۔
MTU کا سائز براہ راست BLE کنکشن کے تھرو پٹ کو متاثر کرتا ہے۔ MTU 23 بائٹس کے ساتھ، مثالی حالات میں زیادہ سے زیادہ مفید منتقلی کی شرح تقریباً 7–10 KB/s ہے۔ MTU کو 247 بائٹس تک بڑھانے سے رفتار 60–90 KB/s (DLE اور بہترین کنکشن وقفہ کے ساتھ) تک پہنچ جاتی ہے۔ یہ خاص طور پر ان ایپلی کیشنز کے لیے اہم ہے جو تصاویر، آڈیو ٹکڑے یا لاگ منتقل کرتی ہیں۔
BLE منتقلی کی کارکردگی تین عوامل پر منحصر ہے: MTU (فی ATT درخواست کتنا ڈیٹا)، کنکشن وقفہ (تبادلے کے واقعات کتنی بار ہوتے ہیں)، اور DLE (فی لنک لیئر پیکٹ کتنا ڈیٹا)۔ زیادہ سے زیادہ رفتار کے لیے بہترین ترتیب: MTU = 247، DLE = 251، کنکشن وقفہ = 7.5 ms (کم سے کم قدر)۔
Bluetooth SIG White Paper (2023) کے مطابق، 30 ms کنکشن وقفہ کے ساتھ MTU کو 23 سے 247 بائٹس تک بڑھانے سے تھرو پٹ 8 KB/s سے 42 KB/s تک بڑھ جاتا ہے — 5 گنا اضافہ۔ 7.5 ms کنکشن وقفہ کے ساتھ، تھرو پٹ 88 KB/s تک پہنچ جاتا ہے۔ ان ایپلی کیشنز کے لیے جنہیں تیز رفتار کی ضرورت نہیں ہے (درجہ حرارت سینسر، BLE بیکن)، معیاری 23 بائٹس MTU کافی ہے۔
iOS Core Bluetooth کسی Peripheral سے کنکشن پر خود بخود MTU گفت و شنید کرتا ہے۔ ڈویلپر maximumWriteValueLength کے ذریعے موجودہ MTU معلوم کر سکتا ہے، لیکن اسے دستی طور پر سیٹ نہیں کر سکتا۔ iOS BLE 5.0 آلات کے لیے 512 بائٹس تک اور BLE 4.2 کے لیے 247 بائٹس تک MTU استعمال کرتا ہے۔ ڈیٹا کی بڑی مقدار لکھنے کے لیے، یقینی ترسیل کے لیے writeType: .withResponse استعمال کریں۔
// Android (Kotlin) میں MTU کی درخواست کریں
val bluetoothGatt: BluetoothGatt = ...
// MTU 517 بائٹس کی درخواست کریں
bluetoothGatt.requestMtu(517)
// کال بیک میں نتیجہ کو ہینڈل کریں
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android BluetoothGatt.requestMtu(int) فراہم کرتا ہے، جو 517 بائٹس تک کسی بھی MTU کی درخواست کرنے کی اجازت دیتا ہے۔ حقیقی MTU پیریفرل ڈیوائس کے ذریعے متعین کیا جاتا ہے — اگر یہ صرف 23 بائٹس کی حمایت کرتا ہے، تو Android MTU 23 واپس کرے گا۔ موجودہ MTU کا تعین کرنے کے لیے، gatt.requestMtu(0) استعمال کریں — یہ اسے تبدیل کرنے کی کوشش کیے بغیر موجودہ قدر واپس کرتا ہے۔ Android 12+ TRANSPORT_LE کے ذریعے کنکشن پر خودکار MTU گفت و شنید کی حمایت کرتا ہے۔
کراس پلیٹ فارم فریم ورک (Flutter, React Native) عام طور پر requestMTU کے لیے API فراہم کرتے ہیں۔ FlutterBlue Plus لائبریری میں، MTU کو کنکشن پیرامیٹر کے طور پر سیٹ کیا جاتا ہے۔ RxAndroidBle میں — requestMtu طریقہ کے ذریعے۔ ڈیٹا کی ترسیل شروع ہونے سے پہلے، سروس کی دریافت کے فوراً بعد ہمیشہ زیادہ سے زیادہ MTU پر گفت و شنید کرنے کی سفارش کی جاتی ہے، تاکہ ایپلیکیشن سطح پر تقسیم سے بچا جا سکے۔
OTA (Over-The-Air) فرم ویئر اپ ڈیٹس — BLE میں سب سے زیادہ MTU طلب کرنے والا منظر نامہ ہے۔ IoT ڈیوائس کے فرم ویئر کا عام سائز 100–500 KB ہے۔ MTU 23 بائٹس اور 30 ms کنکشن وقفہ کے ساتھ، 100 KB کی منتقلی میں تقریباً 2–3 منٹ لگتے ہیں۔ MTU 247 بائٹس اور DLE 251 بائٹس کے ساتھ — 20–40 سیکنڈ۔ اور MTU 512 بائٹس (iOS) کے ساتھ — 10–15 سیکنڈ۔
OTA اپ ڈیٹ کے عمل میں عام طور پر شامل ہے: فرم ویئر کو ≤ MTU سائز کے پیکٹوں میں تقسیم، Notify/Write کے ذریعے ترتیب وار ترسیل، ہر پیکٹ پر چیکسم کی تصدیق، اور وصولی کی تصدیق۔ اگر کوئی پیکٹ کھو جاتا ہے، تو ڈیوائس دوبارہ ترسیل کی درخواست کرتی ہے۔ OTA کی وشوسنییتا MTU اور کنکشن وقفہ کے صحیح انتخاب پر اہم طور پر منحصر ہے۔
OTA کے لیے سفارشات: زیادہ سے زیادہ MTU (247–512 بائٹس) پر گفت و شنید کریں، کنکشن وقفہ 7.5–15 ms (اگر ڈیوائس سپورٹ کرتی ہے) سیٹ کریں، جسمانی پیکٹ کو 251 بائٹس تک بڑھانے کے لیے DLE (Data Length Extension) استعمال کریں۔ محدود بفر میموری والے آلات (مثال کے طور پر، nRF52 پر مبنی BLE ماڈیولز) کے لیے، چپ کی تصریح میں زیادہ سے زیادہ MTU چیک کریں۔
اکثر پوچھے گئے سوالات
کنکشن ڈیفالٹ MTU — 23 بائٹس استعمال کرے گا۔ زیادہ تر IoT منظرناموں (سینسر ریڈنگ کی ترسیل) کے لیے یہ کافی ہے۔ ڈیٹا کی بڑی مقدار کی منتقلی کے لیے، رفتار 247 بائٹس کے گفت و شنید شدہ MTU کے مقابلے میں 5–10 گنا کم ہوگی۔
نہیں، MTU کنکشن کے بعد ایک بار گفت و شنید ہوتا ہے اور منقطع اور دوبارہ منسلک کیے بغیر تبدیل نہیں کیا جا سکتا۔ لہذا، فعال ڈیٹا کی ترسیل شروع ہونے سے پہلے، سروس کی دریافت کے فوراً بعد MTU پر گفت و شنید کرنے کی سفارش کی جاتی ہے۔
یہ ہر اسٹیک کے لیے تاریخی طور پر قائم کردہ تجرباتی زیادہ سے زیادہ حدود ہیں۔ حقیقی ATT MTU اب بھی تصریح کے ذریعہ 257 بائٹس تک محدود ہے۔ اسٹیک 251 بائٹس سے بڑے ڈیٹا کو خود بخود متعدد پیکٹوں میں تقسیم کرتے ہیں، لہذا 512 اور 517 کے درمیان فرق غیر اہم ہے۔
MTU — ATT سطح پر GATT درخواست کا سائز۔ DLE — لنک لیئر پر جسمانی پیکٹ کا سائز۔ DLE کے بغیر، ہر GATT درخواست (247 بائٹس تک) 27 بائٹس کے پیکٹوں میں تقسیم ہوتی ہے۔ DLE کے ساتھ، یہ ایک ہی پیکٹ میں منتقل ہوتی ہے۔ زیادہ سے زیادہ رفتار کے لیے، دونوں پیرامیٹرز پر گفت و شنید کرنا ضروری ہے۔
فٹنس ٹریکر کے لیے جو دل کی دھڑکن اور قدموں کی ریڈنگ منتقل کرتا ہے، معیاری 23 بائٹس MTU کافی ہے۔ اگر آپ کو ورزش کی تاریخ (10–50 KB سائز) منتقل کرنے کی ضرورت ہے، تو اسمارٹ فون سے کنکشن پر ڈیٹا کی مطابقت پذیری تیز کرنے کے لیے MTU 247 بائٹس پر گفت و شنید کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں