MTU v BLE: co to je, velikost paketu a vyjednávání

Autor: IT Sectr Publikováno: 2026-07-15 Doba čtení: 10 min

MTU (Maximum Transmission Unit) je maximální velikost užitečných dat v jednom BLE paketu, která může být přenesena mezi zařízeními v jedné GATT transakci. V BLE Classic (4.x) je MTU fixní na 23 bytech, což stačí pro malé čtení senzorů, ale nestačí pro přenos souborů nebo OTA aktualizace. Bluetooth Core Specification 4.2 (2014) zavedla proceduru MTU Size Request, umožňující vyjednat větší MTU — až 247 bytů (BLE 5.0 — až 251 bytů). Správné nastavení MTU je jedním z klíčových faktorů výkonu BLE aplikací přenášejících velké objemy dat.

Hlavní body

  • MTU — maximální velikost dat v jednom BLE paketu, od 23 bytů (BLE 4.x) do 251 bytů (BLE 5.0).
  • Vyjednávání MTU probíhá prostřednictvím MTU Size Request/Response po navázání GATT spojení.
  • Velké MTU (247 bytů) zvyšuje rychlost přenosu dat 5–10krát ve srovnání se standardními 23 byty.
  • Android automaticky požaduje MTU 517 bytů s BLE 5.0, iOS — 512 bytů přes requestMTU.
  • Při OTA aktualizacích firmwaru zkracuje velké MTU dobu přenosu z minut na sekundy.

Co je MTU v BLE?

Maximum Transmission Unit (MTU) v kontextu BLE — je maximální velikost Application Protocol Data Unit (APDU), kterou může zařízení přijmout v jednom GATT požadavku. MTU je definováno na úrovni ATT (Attribute Protocol) a zahrnuje hlavičku ATT (1 byte) + užitečná data. Ve výchozím nastavení všechna zařízení BLE podporují MTU 23 bytů (23 = 1 byte hlavičky ATT + 22 bytů dat).

MTU není fyzickým omezením rádiového kanálu, ale dohodou mezi zařízeními na úrovni GATT. Fyzická velikost BLE paketu na úrovni Link Layer může být větší (až 27 bytů v BLE 4.0, až 257 bytů v BLE 5.0 s Data Length Extension), ale úraveň GATT omezuje, kolik dat je přeneseno v jedné transakci. Data Length Extension (DLE) — je samostatný mechanismus na úrovni Link Layer, který zvyšuje fyzický paket na 251 bytů a musí být vyjednán samostatně.

Rozdíl mezi MTU a DLE: ATT MTU — kolik dat je přeneseno v jednom GATT požadavku, DLE — kolik dat se vejde do jednoho Link Layer paketu. Pro maximální rychlost je třeba vyjednat oba parametry. Bez DLE budou data i při MTU 247 bytů fragmentována do několika Link Layer paketů po 27 bytech, což snižuje šířku pásma.

Vyjednávání MTU: procedura a protokol

MTU Size Request — procedura iniciovaná Centralem po navázání GATT spojení. Central odešle MTU Request s uvedením své kapacity MTU (maximální velikost, kterou může přijmout). Peripheral odpovídá MTU Response svou hodnotou. Použité MTU je minimum z obou hodnot. Pokud Central navrhne MTU 512 a Peripheral podporuje pouze 128, spojení bude používat MTU 128.

swift
import CoreBluetooth

// Požadavek na maximální MTU v iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS automaticky vyjednává MTU při připojení
            // MTU = 512 pro zařízení BLE 5.0
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("Vyjednané MTU: " +
          String(mtu))
}

Načasování vyjednávání: MTU Request by měl být odeslán po objevení služeb (discoverServices), ale před zahájením aktivního přenosu dat. V iOS Core Bluetooth vyjednává MTU automaticky při připojení — vývojář nemusí ručně odesílat MTU Request. V Androidu je třeba explicitně zavolat requestMTU. Po vyjednání zůstává MTU fixní pro toto spojení — opětovné vyjednání je možné pouze po přerušení a novém připojení.

Omezení ATT: proč MTU nemůže být větší než 251 bytů

ATT (Attribute Protocol) — protokol, na kterém je GATT postaven. ATT paket má maximální velikost 257 bytů (ATT_MTU-1). Z toho 1 byte je Opcode (typ operace), 1 byte je Handle a až 255 bytů je Value. Maximální MTU povolené specifikací ATT je tedy 257 bytů (v praxi se používá až 251 bytů, protože některá servisní pole jsou stejně potřebná).

Pro odesílání dat větších než MTU se používá fragmentace na úrovni aplikace. Vývojář sám rozdělí data na kousky o velikosti ≤ MTU a odesílá je sekvenčně. Každý kousek je formálně samostatný požadavek GATT Write Request. Přijímací strana skládá kousky do jednoho bufferu. Vestavěná podpora fragmentace v GATT neexistuje — to je úkol vývojáře.

Verze BLEMax. MTUMax. DLELimit ATT MTU
BLE 4.0 / 4.123 bytů27 bytůATT fixní
BLE 4.2247 bytů251 bytů257 bytů
BLE 5.0251 bytů251 bytů257 bytů
Android + iOS512 / 517251 bytůPřekročení ATT

Zajímavý fakt: iOS a Android požadují MTU 512 a 517 bytů, ale tato hodnota překračuje limit ATT. V praxi BLE stack automaticky fragmentuje taková data a odesílá je jako několik sekvenčních GATT požadavků po maximálně 251 bytech. Pro vývojáře je rozdíl nepostřehnutelný — writeValue funguje s jakoukoli velikostí až do 512 bytů v iOS.

Vliv MTU na výkon

Velikost MTU přímo ovlivňuje šířku pásma BLE spojení. Při MTU 23 bytů je maximální užitečná rychlost přenosu asi 7–10 KB/s v ideálních podmínkách. Zvýšení MTU na 247 bytů zvyšuje rychlost na 60–90 KB/s (s DLE a optimálním connection interval). To je důležité zejména pro aplikace přenášející obrázky, audio fragmenty nebo logy.

Výkon BLE přenosu závisí na třech faktorech: MTU (kolik dat v jednom ATT požadavku), connection interval (jak často dochází k událostem výměny) a DLE (kolik dat v jednom Link Layer paketu). Optimální konfigurace pro maximální rychlost: MTU = 247, DLE = 251, connection interval = 7.5 ms (minimální hodnota).

Podle údajů Bluetooth SIG White Paper (2023) zvýšení MTU z 23 na 247 bytů při connection interval 30 ms zvyšuje šířku pásma z 8 KB/s na 42 KB/s — pětinásobný nárůst. Při connection interval 7.5 ms dosahuje šířka pásma 88 KB/s. Pro aplikace, které nevyžadují vysokou rychlost (teplotní senzory, BLE majáky), standardní MTU 23 bytů zůstává dostačující.

Nastavení MTU v iOS a Androidu

iOS Core Bluetooth automaticky vyjednává MTU při připojení k Peripheral. Vývojář může zkontrolovat aktuální MTU pomocí maximumWriteValueLength, ale nemůže jej ručně nastavit. iOS používá MTU až 512 bytů pro zařízení BLE 5.0 a až 247 pro BLE 4.2. Pro zápis velkých objemů dat použijte writeType: .withResponse pro garantované doručení.

kotlin
// Požadavek na MTU v Androidu (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// Požadavek na MTU 517 bytů
bluetoothGatt.requestMtu(517)

// Zpracování výsledku v callback
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android poskytuje BluetoothGatt.requestMtu(int), který umožňuje požadovat libovolné MTU až do 517 bytů. Skutečné MTU určuje periferní zařízení — pokud podporuje pouze 23 bytů, Android vrátí MTU 23. Pro určení aktuálního MTU použijte gatt.requestMtu(0) — to vrátí aktuální hodnotu bez pokusu o změnu. Android 12+ podporuje automatické vyjednávání MTU při připojení prostřednictvím TRANSPORT_LE.

Meziplatformové frameworky (Flutter, React Native) obvykle poskytují API pro requestMTU. V knihovně FlutterBlue Plus se MTU nastavuje jako parametr připojení. V RxAndroidBle — prostřednictvím metody requestMtu. Doporučuje se vždy vyjednat maximální MTU ihned po objevení služeb, před zahájením přenosu dat, aby se zabránilo fragmentaci na úrovni aplikace.

MTU a OTA aktualizace

OTA (Over-The-Air) aktualizace firmwaru — scénář nejnáročnější na MTU v BLE. Typická velikost firmwaru IoT zařízení je 100–500 KB. Při MTU 23 bytů a connection interval 30 ms trvá přenos 100 KB asi 2–3 minuty. Při MTU 247 bytů a DLE 251 bytů — 20–40 sekund. A při MTU 512 bytů (iOS) — 10–15 sekund.

Proces OTA aktualizace obvykle zahrnuje: fragmentaci firmwaru na pakety o velikosti ≤ MTU, sekvenční odesílání prostřednictvím Notify/Write, ověření kontrolního součtu na každém paketu a potvrzení příjmu. Pokud se nějaký paket ztratí, zařízení požaduje opětovné odeslání. Spolehlivost OTA kriticky závisí na správném výběru MTU a connection interval.

Doporučení pro OTA: vyjednejte maximální MTU (247–512 bytů), nastavte connection interval na 7.5–15 ms (pokud to zařízení podporuje), použijte DLE (Data Length Extension) pro zvýšení fyzického paketu na 251 bytů. Pro zařízení s omezenou vyrovnávací pamětí (např. BLE moduly založené na nRF52) zkontrolujte maximální MTU ve specifikaci čipu.

Často kladené otázky

Co se stane, pokud nevyjednám MTU?

Spojení bude používat výchozí MTU — 23 bytů. Pro většinu IoT scénářů (přenos čtení senzorů) to stačí. Pro přenos velkých objemů dat bude rychlost 5–10krát nižší než s vyjednaným MTU 247 bytů.

Lze změnit MTU po zahájení přenosu dat?

Ne, MTU se vyjednává jednou po připojení a nelze jej změnit bez přerušení a nového připojení. Proto se doporučuje vyjednat MTU ihned po objevení služeb, před zahájením aktivního přenosu dat.

Proč Android požaduje MTU 517 bytů a iOS pouze 512?

To jsou historicky stanovené empirické maximum pro každý stack. Skutečné ATT MTU je stejně omezeno na 257 bytů podle specifikace. Stacky automaticky fragmentují data větší než 251 bytů do několika paketů, takže rozdíl mezi 512 a 517 je zanedbatelný.

Jak MTU souvisí s Data Length Extension (DLE)?

MTU — velikost GATT požadavku na úrovni ATT. DLE — velikost fyzického paketu na úrovni Link Layer. Bez DLE je každý GATT požadavek (až 247 bytů) fragmentován na pakety po 27 bytech. S DLE — je přenášen v jednom paketu. Pro maximální rychlost je třeba vyjednat oba parametry.

Jaké MTU zvolit pro fitness tracker?

Pro fitness tracker přenášející tepovou frekvenci a kroky stačí standardní MTU 23 bytů. Pokud je třeba přenášet historii tréninků (objem 10–50 KB) — vyjednejte MTU 247 bytů pro urychlení synchronizace dat při připojení k chytrému telefonu.

Shrnutí

  • MTU — maximální velikost dat v jednom GATT požadavku: od 23 bytů (výchozí) do 251 bytů (BLE 5.0).
  • Vyjednávání MTU probíhá prostřednictvím MTU Size Request/Response, iniciované Centralem po připojení.
  • Protokol ATT omezuje MTU na 257 bytů, ale iOS a Android požadují až 512–517 bytů s automatickou fragmentací.
  • Zvýšení MTU z 23 na 247 bytů zvyšuje šířku pásma 5–10krát při optimálním connection interval.
  • Pro maximální rychlost je třeba vyjednat MTU + DLE + connection interval 7.5 ms.
  • V iOS je MTU vyjednáváno automaticky, v Androidu — prostřednictvím requestMtu, doporučuje se požadovat 247–517 bytů.
  • OTA aktualizace — nejnáročnější scénář: správné MTU zkracuje dobu přenosu z minut na sekundy.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také