MTU u BLE-u: šta je to, veličina paketa i usaglašavanje

Аутор: IT Sectr Објављено: 2026-07-15 Време читања: 10 мин

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

  • MTU — maksimalna veličina podataka u jednom BLE paketu, od 23 bajta (BLE 4.x) do 251 bajta (BLE 5.0).
  • Usaglašavanje MTU-a odvija se putem MTU Size Request/Response nakon uspostavljanja GATT veze.
  • Veliki MTU (247 bajtova) povećava brzinu prenosa podataka 5–10 puta u poređenju sa standardnih 23 bajta.
  • Android automatski zahteva MTU od 517 bajtova sa BLE 5.0, iOS — 512 bajtova preko requestMTU.
  • Kod OTA ažuriranja firmvera, veliki MTU skraćuje vreme prenosa sa minuta na sekunde.

Šta je MTU u BLE-u?

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.

Usaglašavanje MTU-a: procedura i protokol

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.

swift
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 ograničenja: zašto MTU ne može biti veći od 251 bajta

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 verzijaMaks. MTUMaks. DLEATT MTU limit
BLE 4.0 / 4.123 bajta27 bajtovaATT fiksan
BLE 4.2247 bajtova251 bajt257 bajtova
BLE 5.0251 bajt251 bajt257 bajtova
Android + iOS512 / 517251 bajtPrekorač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.

Uticaj MTU-a na performanse

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.

Podešavanje MTU-a u iOS-u i Android-u

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.

kotlin
// 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.

MTU i OTA ažuriranja

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

Šta se dešava ako ne usaglasim MTU?

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.

Može li se MTU promeniti nakon početka prenosa podataka?

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.

Zašto Android zahteva MTU 517 bajtova, a iOS samo 512?

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.

Kako je MTU povezan sa Data Length Extension (DLE)?

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.

Koji MTU izabrati za fitness tracker?

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

  • MTU — maksimalna veličina podataka u jednom GATT zahtevu: od 23 bajta (podrazumevano) do 251 bajta (BLE 5.0).
  • Usaglašavanje MTU-a odvija se putem MTU Size Request/Response, koje pokreće Central nakon povezivanja.
  • ATT protokol ograničava MTU na 257 bajtova, ali iOS i Android zahtevaju do 512–517 bajtova sa automatskom fragmentacijom.
  • Povećanje MTU-a sa 23 na 247 bajtova povećava propusni opseg 5–10 puta pri optimalnom connection interval-u.
  • Za maksimalnu brzinu potrebno je usaglasiti MTU + DLE + connection interval od 7.5 ms.
  • U iOS-u MTU se usaglašava automatski, u Android-u — putem requestMtu, preporučuje se zahtevanje 247–517 bajtova.
  • OTA ažuriranja — scenario koji najviše zahteva: pravilan MTU skraćuje vreme prenosa sa minuta na sekunde.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође