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 के संदर्भ में एक एप्लिकेशन प्रोटोकॉल डेटा यूनिट (APDU) का अधिकतम आकार है जिसे एक उपकरण एक GATT अनुरोध में स्वीकार कर सकता है। MTU ATT (Attribute Protocol) स्तर पर परिभाषित किया गया है और इसमें ATT हेडर (1 बाइट) + उपयोगी डेटा शामिल है। डिफ़ॉल्ट रूप से, सभी BLE उपकरण MTU 23 बाइट्स का समर्थन करते हैं (23 = 1 बाइट ATT हेडर + 22 बाइट्स डेटा)।
MTU रेडियो चैनल की भौतिक सीमा नहीं है, बल्कि GATT स्तर पर उपकरणों के बीच एक समझौता है। लिंक लेयर पर भौतिक BLE पैकेट का आकार बड़ा हो सकता है (BLE 4.0 में 27 बाइट्स तक, BLE 5.0 में Data Length Extension के साथ 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))
}
बातचीत का समय: सेवा खोज (discoverServices) के बाद, लेकिन सक्रिय डेटा प्रेषण शुरू होने से पहले MTU Request भेजा जाना चाहिए। 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 बीकन), मानक MTU 23 बाइट्स पर्याप्त रहता है।
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 के साथ, यह एक ही पैकेट में प्रेषित होता है। अधिकतम गति के लिए, दोनों मापदंडों पर बातचीत करने की आवश्यकता है।
हृदय गति और कदम रीडिंग प्रेषित करने वाले फिटनेस ट्रैकर के लिए, मानक MTU 23 बाइट्स पर्याप्त है। यदि आपको वर्कआउट इतिहास (10–50 KB आकार) स्थानांतरित करने की आवश्यकता है, तो स्मार्टफोन से कनेक्ट होने पर डेटा सिंक्रनाइज़ेशन को गति देने के लिए MTU 247 बाइट्स पर बातचीत करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें