MTU (Maximum Transmission Unit) — maksimalna veličina korisnih podataka u jednom BLE paketu koja se može preneti između uređaja u jednoj GATT transakciji. U BLE Classic (4.x) MTU je fiksiran na 23 bajta, što je dovoljno za mala očitavanja senzora, ali nedovoljno za prenos datoteka ili OTA ažuriranja. Bluetooth Core Specification 4.2 (2014) uvela je proceduru MTU Size Request, omogućavajući usaglašavanje većeg MTU-a — do 247 bajtova (BLE 5.0 — do 251 bajta). Pravilno podešavanje MTU-a je jedan od ključnih faktora performansi BLE aplikacija koje prenose velike količine podataka.
Glavno
Maximum Transmission Unit (MTU) u kontekstu BLE-a — maksimalna veličina Application Protocol Data Unit (APDU) koju uređaj može primiti u jednom GATT zahtevu. MTU se definiše na nivou ATT (Attribute Protocol) i uključuje ATT zaglavlje (1 bajt) + korisne podatke. Podrazumevano, svi BLE uređaji podržavaju MTU od 23 bajta (23 = 1 bajt ATT zaglavlja + 22 bajta podataka).
MTU nije fizičko ograničenje radio kanala, već dogovor između uređaja na GATT nivou. Fizička veličina BLE paketa na Link Layer nivou može biti veća (do 27 bajtova u BLE 4.0, do 257 bajtova u BLE 5.0 sa Data Length Extension), ali GATT nivo ograničava koliko podataka se prenosi u jednoj transakciji. Data Length Extension (DLE) — poseban mehanizam na Link Layer nivou koji povećava fizički paket na 251 bajt i mora biti posebno usaglašen.
Razlika između MTU-a i DLE: ATT MTU — koliko podataka se prenosi u jednom GATT zahtevu, DLE — koliko podataka stane u jedan Link Layer paket. Za maksimalnu brzinu potrebno je usaglasiti oba parametra. Bez DLE-a čak i pri MTU od 247 bajtova, podaci će se fragmentisati na nekoliko Link Layer paketa od 27 bajtova, smanjujući propusni opseg.
MTU Size Request — procedura koju pokreće Central nakon uspostavljanja GATT veze. Central šalje MTU Request sa navođenjem svog MTU kapaciteta (maksimalna veličina koju može primiti). Peripheral odgovara MTU Response-om sa svojom vrednošću. Korišćeni MTU je minimum od dve vrednosti. Ako Central predloži MTU 512, a Peripheral podržava samo 128, veza će koristiti MTU 128.
import CoreBluetooth
// Zahtev za maksimalnim MTU-om u iOS-u
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS automatski usaglašava MTU pri povezivanju
// MTU = 512 za BLE 5.0 uređaje
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("Usaglašeni MTU: " +
String(mtu))
}
Vreme usaglašavanja: MTU Request treba poslati nakon otkrivanja servisa (discoverServices), ali pre početka aktivnog prenosa podataka. U iOS-u Core Bluetooth automatski usaglašava MTU pri povezivanju — programer ne mora ručno da šalje MTU Request. U Android-u je potrebno eksplicitno pozvati requestMTU. Nakon usaglašavanja, MTU ostaje fiksan za datu vezu — ponovno usaglašavanje nije moguće bez prekida i ponovnog povezivanja.
ATT (Attribute Protocol) — protokol na kome je izgrađen GATT. ATT paket ima maksimalnu veličinu od 257 bajtova (ATT_MTU-1). Od toga 1 bajt je Opcode (tip operacije), 1 bajt je Handle, do 255 bajtova je Value. Dakle, maksimalni MTU dozvoljen ATT specifikacijom je 257 bajtova (u praksi se koristi do 251 bajta, jer su neka pomoćna polja ipak potrebna).
Za slanje podataka većih od MTU-a koristi se fragmentacija na nivou aplikacije. Programer sam deli podatke na delove veličine ≤ MTU i šalje ih sekvencijalno. Svaki deo je formalno poseban GATT Write Request. Prijemna strana sastavlja delove u jedinstveni bafer. Ugrađena podrška za fragmentaciju u GATT-u ne postoji — to je zadatak programera.
| BLE verzija | Maks. MTU | Maks. DLE | ATT MTU limit |
|---|---|---|---|
| BLE 4.0 / 4.1 | 23 bajta | 27 bajtova | ATT fiksan |
| BLE 4.2 | 247 bajtova | 251 bajt | 257 bajtova |
| BLE 5.0 | 251 bajt | 251 bajt | 257 bajtova |
| Android + iOS | 512 / 517 | 251 bajt | Prekoračenje ATT |
Zanimljiva činjenica: iOS i Android zahtevaju MTU od 512 i 517 bajtova respektivno, ali ova vrednost premašuje ATT limit. U praksi, BLE stack automatski fragmentiše takve podatke, šaljući ih kao nekoliko sekvencijalnih GATT zahteva od maksimalno 251 bajta. Za programera razlika je neprimetna — writeValue radi sa bilo kojom veličinom do 512 bajtova u iOS-u.
Veličina MTU-a direktno utiče na propusni opseg BLE veze. Pri MTU od 23 bajta, maksimalna korisna brzina prenosa iznosi oko 7–10 KB/s u idealnim uslovima. Povećanje MTU-a na 247 bajtova podiže brzinu na 60–90 KB/s (sa DLE i optimalnim connection interval-om). Ovo je posebno važno za aplikacije koje prenose slike, audio fragmente ili logove.
Performanse BLE prenosa zavise od tri faktora: MTU (koliko podataka u jednom ATT zahtevu), connection interval (koliko često se dešavaju događaji razmene) i DLE (koliko podataka u jednom Link Layer paketu). Optimalna konfiguracija za maksimalnu brzinu: MTU = 247, DLE = 251, connection interval = 7.5 ms (minimalna vrednost).
Prema podacima Bluetooth SIG White Paper (2023), povećanje MTU-a sa 23 na 247 bajtova pri connection interval-u od 30 ms povećava propusni opseg sa 8 KB/s na 42 KB/s — rast od 5 puta. Pri connection interval-u od 7.5 ms propusni opseg dostiže 88 KB/s. Za aplikacije koje ne zahtevaju veliku brzinu (senzori temperature, BLE beacon-i), standardni MTU od 23 bajta ostaje dovoljan.
iOS Core Bluetooth automatski usaglašava MTU pri povezivanju sa Peripheral-om. Programer može proveriti trenutni MTU putem maximumWriteValueLength, ali ga ne može ručno podesiti. iOS koristi MTU do 512 bajtova za BLE 5.0 uređaje i do 247 za BLE 4.2. Za upis velikih količina podataka koristite writeType: .withResponse za garantovanu isporuku.
// Zahtev za MTU u Android-u (Kotlin)
val bluetoothGatt: BluetoothGatt = ...
// Zahtev za MTU od 517 bajtova
bluetoothGatt.requestMtu(517)
// Obrada rezultata u callback-u
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android pruža BluetoothGatt.requestMtu(int), koji omogućava zahtevanje bilo kog MTU-a do 517 bajtova. Stvarni MTU određuje periferni uređaj — ako podržava samo 23 bajta, Android će vratiti MTU 23. Za određivanje trenutnog MTU-a koristite gatt.requestMtu(0) — ovo vraća trenutnu vrednost bez pokušaja promene. Android 12+ podržava automatsko usaglašavanje MTU-a pri povezivanju putem TRANSPORT_LE.
Međuplatformski okviri (Flutter, React Native) obično pružaju API za requestMTU. U biblioteci FlutterBlue Plus MTU se podešava kao parametar povezivanja. U RxAndroidBle — putem metode requestMtu. Preporučuje se uvek usaglasiti maksimalni MTU odmah nakon otkrivanja servisa, pre početka prenosa podataka, kako bi se izbegla fragmentacija na nivou aplikacije.
OTA (Over-The-Air) ažuriranja firmvera — scenario koji najviše zahteva od MTU-a u BLE-u. Tipična veličina firmvera IoT uređaja je 100–500 KB. Pri MTU od 23 bajta i connection interval-u od 30 ms, prenos 100 KB traje oko 2–3 minuta. Pri MTU od 247 bajtova i DLE od 251 bajta — 20–40 sekundi. A pri MTU od 512 bajtova (iOS) — 10–15 sekundi.
Proces OTA ažuriranja obično uključuje: fragmentaciju firmvera na pakete veličine ≤ MTU, sekvencijalno slanje putem Notify/Write, verifikaciju kontrolne sume na svakom paketu i potvrdu prijema. Ako se neki paket izgubi, uređaj zahteva ponovno slanje. Pouzdanost OTA kritično zavisi od pravilnog izbora MTU-a i connection interval-a.
Preporuke za OTA: usaglasite maksimalni MTU (247–512 bajtova), podesite connection interval na 7.5–15 ms (ako uređaj podržava), koristite DLE (Data Length Extension) za povećanje fizičkog paketa na 251 bajt. Za uređaje sa ograničenom bafer memorijom (npr. BLE moduli zasnovani na nRF52) proverite maksimalni MTU u specifikaciji čipa.
Često postavljana pitanja
Veza će koristiti podrazumevani MTU — 23 bajta. Za većinu IoT scenarija (prenos očitavanja senzora) ovo je dovoljno. Za prenos velikih količina podataka, brzina će biti 5–10 puta manja nego sa usaglašenim MTU-om od 247 bajtova.
Ne, MTU se usaglašava jednom nakon povezivanja i ne može se promeniti bez prekida i ponovnog povezivanja. Zbog toga se preporučuje usaglašavanje MTU-a odmah nakon otkrivanja servisa, pre početka aktivnog prenosa podataka.
To su istorijski utvrđeni empirijski maksimumi za svaki stack. Pravi ATT MTU je ipak ograničen na 257 bajtova prema specifikaciji. Stackovi automatski fragmentišu podatke veće od 251 bajta na nekoliko paketa, tako da je razlika između 512 i 517 zanemarljiva.
MTU — veličina GATT zahteva na ATT nivou. DLE — veličina fizičkog paketa na Link Layer nivou. Bez DLE-a, svaki GATT zahtev (do 247 bajtova) se fragmentiše na pakete od 27 bajtova. Sa DLE-om — prenosi se u jednom paketu. Za maksimalnu brzinu potrebno je usaglasiti oba parametra.
Za fitness tracker koji prenosi očitavanja pulsa i korake, standardni MTU od 23 bajta je dovoljan. Ako je potrebno prenositi istoriju treninga (obima 10–50 KB) — usaglasite MTU od 247 bajtova da biste ubrzali sinhronizaciju podataka pri povezivanju sa pametnim telefonom.
Zaključak
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође