MTU (Maximum Transmission Unit) — este dimensiunea maximă a datelor utile într-un singur pachet BLE care poate fi transmis între dispozitive într-o singură tranzacție GATT. În BLE Classic (4.x) MTU este fixat la 23 de octeți, suficient pentru citiri mici de la senzori, dar insuficient pentru transferul de fișiere sau actualizări OTA. Bluetooth Core Specification 4.2 (2014) a introdus procedura MTU Size Request, permițând negocierea unui MTU mai mare — până la 247 de octeți (BLE 5.0 — până la 251 de octeți). Configurarea corectă a MTU este unul dintre factorii cheie de performanță ai aplicațiilor BLE care transmit volume mari de date.
Principalele puncte
Maximum Transmission Unit (MTU) în contextul BLE — este dimensiunea maximă a Application Protocol Data Unit (APDU) pe care un dispozitiv o poate primi într-o singură cerere GATT. MTU este definit la nivelul ATT (Attribute Protocol) și include header-ul ATT (1 octet) + date utile. În mod implicit, toate dispozitivele BLE suportă un MTU de 23 de octeți (23 = 1 octet header ATT + 22 de octeți de date).
MTU nu este o limită fizică a canalului radio, ci un acord între dispozitive la nivel GATT. Dimensiunea fizică a pachetului BLE la nivelul Link Layer poate fi mai mare (până la 27 de octeți în BLE 4.0, până la 257 de octeți în BLE 5.0 cu Data Length Extension), dar nivelul GATT limitează câte date sunt transmise într-o singură tranzacție. Data Length Extension (DLE) — este un mecanism separat la nivelul Link Layer care mărește pachetul fizic la 251 de octeți și trebuie negociat separat.
Diferența dintre MTU și DLE: ATT MTU — câte date sunt transmise într-o singură cerere GATT, DLE — câte date încap într-un singur pachet Link Layer. Pentru viteză maximă, ambii parametri trebuie negociați. Fără DLE, chiar și la un MTU de 247 de octeți, datele vor fi fragmentate în mai multe pachete Link Layer de 27 de octeți, reducând lățimea de bandă.
MTU Size Request — procedură inițiată de Central după stabilirea conexiunii GATT. Central trimite MTU Request specificând capacitatea sa MTU (dimensiunea maximă pe care o poate primi). Peripheral răspunde cu MTU Response cu propria valoare. MTU utilizat este minimul dintre cele două valori. Dacă Central propune un MTU de 512, iar Peripheral suportă doar 128, conexiunea va utiliza MTU 128.
import CoreBluetooth
// Solicitare MTU maxim în iOS
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS negociază automat MTU la conectare
// MTU = 512 pentru dispozitive BLE 5.0
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("MTU negociat: " +
String(mtu))
}
Momentul negocierii: MTU Request trebuie trimis după descoperirea serviciilor (discoverServices), dar înainte de începerea transmiterii active a datelor. În iOS Core Bluetooth negociază automat MTU la conectare — dezvoltatorul nu trebuie să trimită manual MTU Request. În Android trebuie apelat explicit requestMTU. După negociere, MTU rămâne fix pentru această conexiune — o renegociere este imposibilă fără deconectare și reconectare.
ATT (Attribute Protocol) — protocolul pe care este construit GATT. Pachetul ATT are o dimensiune maximă de 257 de octeți (ATT_MTU-1). Din aceștia, 1 octet este Opcode (tipul operației), 1 octet este Handle, iar până la 255 de octeți sunt Value. Astfel, MTU maxim permis de specificația ATT este de 257 de octeți (în practică se utilizează până la 251 de octeți, deoarece unele câmpuri de serviciu sunt totuși necesare).
Pentru trimiterea de date mai mari decât MTU se utilizează fragmentarea la nivelul aplicației. Dezvoltatorul împarte singur datele în bucăți de dimensiune ≤ MTU și le trimite secvențial. Fiecare bucată este formal o cerere GATT Write Request separată. Partea receptoare asamblează bucățile într-un singur buffer. Nu există suport încorporat pentru fragmentare în GATT — aceasta este sarcina dezvoltatorului.
| Versiunea BLE | MTU max. | DLE max. | Limită ATT MTU |
|---|---|---|---|
| BLE 4.0 / 4.1 | 23 de octeți | 27 de octeți | ATT fix |
| BLE 4.2 | 247 de octeți | 251 de octeți | 257 de octeți |
| BLE 5.0 | 251 de octeți | 251 de octeți | 257 de octeți |
| Android + iOS | 512 / 517 | 251 de octeți | Depășire ATT |
Fapt interesant: iOS și Android solicită MTU de 512 și respectiv 517 octeți, dar această valoare depășește limita ATT. În practică, stiva BLE fragmentează automat astfel de date, trimițându-le ca mai multe cereri GATT secvențiale de maxim 251 de octeți. Pentru dezvoltator, diferența este imperceptibilă — writeValue funcționează cu orice dimensiune de până la 512 octeți în iOS.
Dimensiunea MTU influențează direct lățimea de bandă a conexiunii BLE. La un MTU de 23 de octeți, viteza maximă utilă de transmisie este de aproximativ 7–10 KB/s în condiții ideale. Creșterea MTU la 247 de octeți ridică viteza la 60–90 KB/s (cu DLE și connection interval optim). Acest lucru este deosebit de important pentru aplicațiile care transmit imagini, fragmente audio sau loguri.
Performanța transmisiei BLE depinde de trei factori: MTU (câte date într-o singură cerere ATT), connection interval (cât de des au loc evenimentele de schimb) și DLE (câte date într-un singur pachet Link Layer). Configurația optimă pentru viteză maximă: MTU = 247, DLE = 251, connection interval = 7.5 ms (valoare minimă).
Conform datelor Bluetooth SIG White Paper (2023), creșterea MTU de la 23 la 247 de octeți la un connection interval de 30 ms mărește lățimea de bandă de la 8 KB/s la 42 KB/s — o creștere de 5 ori. La un connection interval de 7.5 ms, lățimea de bandă atinge 88 KB/s. Pentru aplicațiile care nu necesită viteză mare (senzori de temperatură, beacon-uri BLE), MTU standard de 23 de octeți rămâne suficient.
iOS Core Bluetooth negociază automat MTU la conectarea la Peripheral. Dezvoltatorul poate verifica MTU-ul curent prin maximumWriteValueLength, dar nu îl poate seta manual. iOS utilizează un MTU de până la 512 octeți pentru dispozitivele BLE 5.0 și până la 247 pentru BLE 4.2. Pentru scrierea unor volume mari de date, utilizați writeType: .withResponse pentru livrare garantată.
// Solicitare MTU în Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...
// Solicitare MTU 517 octeți
bluetoothGatt.requestMtu(517)
// Gestionarea rezultatului în callback
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android oferă BluetoothGatt.requestMtu(int), care permite solicitarea oricărui MTU de până la 517 octeți. MTU-ul real este determinat de dispozitivul periferic — dacă acesta suportă doar 23 de octeți, Android va returna MTU 23. Pentru a determina MTU-ul curent, utilizați gatt.requestMtu(0) — aceasta va returna valoarea curentă fără a încerca să o modifice. Android 12+ suportă negocierea automată a MTU la conectare prin TRANSPORT_LE.
Framework-urile cross-platform (Flutter, React Native) oferă de obicei o API pentru requestMTU. În biblioteca FlutterBlue Plus, MTU este setat ca parametru de conectare. În RxAndroidBle — prin metoda requestMtu. Se recomandă să negociați întotdeauna MTU-ul maxim imediat după descoperirea serviciilor, înainte de începerea transmiterii datelor, pentru a evita fragmentarea la nivelul aplicației.
Actualizările OTA (Over-The-Air) ale firmware-ului — scenariul cel mai exigent în privința MTU în BLE. Dimensiunea tipică a firmware-ului unui dispozitiv IoT este de 100–500 KB. La un MTU de 23 de octeți și un connection interval de 30 ms, transmiterea a 100 KB durează aproximativ 2–3 minute. La un MTU de 247 de octeți și DLE de 251 de octeți — 20–40 de secunde. Iar la un MTU de 512 octeți (iOS) — 10–15 secunde.
Procesul de actualizare OTA include de obicei: fragmentarea firmware-ului în pachete de dimensiune ≤ MTU, trimiterea secvențială prin Notify/Write, verificarea sumei de control pe fiecare pachet și confirmarea recepției. Dacă un pachet se pierde, dispozitivul solicită retransmiterea. Fiabilitatea OTA depinde critic de alegerea corectă a MTU și a connection interval-ului.
Recomandări pentru OTA: negociați MTU-ul maxim (247–512 octeți), setați connection interval la 7.5–15 ms (dacă dispozitivul suportă), utilizați DLE (Data Length Extension) pentru a mări pachetul fizic la 251 de octeți. Pentru dispozitivele cu memorie tampon limitată (de exemplu, modulele BLE bazate pe nRF52), verificați MTU-ul maxim în specificația cipului.
Întrebări frecvente
Conexiunea va utiliza MTU-ul implicit — 23 de octeți. Pentru majoritatea scenariilor IoT (transmiterea citirilor de la senzori) acest lucru este suficient. Pentru transmiterea unor volume mari de date, viteza va fi de 5–10 ori mai mică decât cu un MTU negociat de 247 de octeți.
Nu, MTU este negociat o singură dată după conectare și nu poate fi modificat fără deconectare și reconectare. De aceea, se recomandă negocierea MTU imediat după descoperirea serviciilor, înainte de începerea transmiterii active a datelor.
Acestea sunt maximele empirice stabilite istoric pentru fiecare stivă. ATT MTU real este totuși limitat la 257 de octeți conform specificației. Stivele fragmentează automat datele mai mari de 251 de octeți în mai multe pachete, așa că diferența dintre 512 și 517 este nesemnificativă.
MTU — dimensiunea cererii GATT la nivel ATT. DLE — dimensiunea pachetului fizic la nivelul Link Layer. Fără DLE, fiecare cerere GATT (de până la 247 de octeți) este fragmentată în pachete de 27 de octeți. Cu DLE — este transmisă într-un singur pachet. Pentru viteză maximă, ambii parametri trebuie negociați.
Pentru un tracker de fitness care transmite citiri ale pulsului și pași, MTU-ul standard 23 de octeți este suficient. Dacă este necesară transmiterea istoricului antrenamentelor (volum de 10–50 KB) — negociați un MTU de 247 de octeți pentru a accelera sincronizarea datelor la conectarea cu smartphone-ul.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și