MTU i BLE: vad är det, paketstorlek och förhandling

Författare: IT Sectr Publicerad: 2026-07-15 Lästid: 10 min

MTU (Maximum Transmission Unit) är den maximala storleken på användbara data i ett BLE-paket som kan överföras mellan enheter i en GATT-transaktion. I BLE Classic (4.x) är MTU fixerat till 23 byte, tillräckligt för små sensoravläsningar men otillräckligt för filöverföring eller OTA-uppdateringar. Bluetooth Core Specification 4.2 (2014) införde proceduren MTU Size Request, som möjliggör förhandling av större MTU — upp till 247 byte (BLE 5.0 — upp till 251 byte). Korrekt konfiguration av MTU är en av nyckelfaktorerna för prestanda hos BLE-applikationer som överför stora datamängder.

Huvudpunkter

  • MTU — maximal datastorlek i ett BLE-paket, från 23 byte (BLE 4.x) till 251 byte (BLE 5.0).
  • MTU-förhandling sker via MTU Size Request/Response efter att GATT-anslutning har upprättats.
  • Stort MTU (247 byte) ökar dataöverföringshastigheten 5–10 gånger jämfört med standard 23 byte.
  • Android begär automatiskt MTU 517 byte med BLE 5.0, iOS — 512 byte via requestMTU.
  • Vid OTA-uppdateringar av firmware förkortar stort MTU överföringstiden från minuter till sekunder.

Vad är MTU i BLE?

Maximum Transmission Unit (MTU) i BLE-sammanhang — är den maximala storleken på Application Protocol Data Unit (APDU) som en enhet kan ta emot i en GATT-begäran. MTU definieras på ATT-nivå (Attribute Protocol) och inkluderar ATT-huvud (1 byte) + användbara data. Som standard stöder alla BLE-enheter MTU 23 byte (23 = 1 byte ATT-huvud + 22 byte data).

MTU är inte en fysisk begränsning av radiokanalen, utan ett avtal mellan enheter på GATT-nivå. Den fysiska storleken på ett BLE-paket på Link Layer-nivå kan vara större (upp till 27 byte i BLE 4.0, upp till 257 byte i BLE 5.0 med Data Length Extension), men GATT-skiktet begränsar hur mycket data som överförs i en transaktion. Data Length Extension (DLE) — är en separat mekanism på Link Layer-nivå som ökar det fysiska paketet till 251 byte och måste förhandlas separat.

Skillnad mellan MTU och DLE: ATT MTU — hur mycket data som överförs i en GATT-begäran, DLE — hur mycket data som får plats i ett Link Layer-paket. För maximal hastighet måste båda parametrarna förhandlas. Utan DLE kommer data även vid MTU 247 byte att fragmenteras i flera Link Layer-paket om 27 byte, vilket minskar bandbredden.

MTU-förhandling: procedur och protokoll

MTU Size Request — procedur som initieras av Central efter att GATT-anslutning har upprättats. Central skickar en MTU Request med sin MTU-kapacitet (den maximala storlek den kan ta emot). Peripheral svarar med en MTU Response med sitt värde. Det använda MTU är minimivärdet av de två. Om Central föreslår MTU 512 och Peripheral endast stödjer 128, kommer anslutningen att använda MTU 128.

swift
import CoreBluetooth

// Begär maximalt MTU i iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS förhandlar automatiskt MTU vid anslutning
            // MTU = 512 för BLE 5.0-enheter
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("Förhandlat MTU: " +
          String(mtu))
}

Timing för förhandling: MTU Request bör skickas efter upptäckt av tjänster (discoverServices), men innan aktiv dataöverföring påbörjas. I iOS förhandlar Core Bluetooth automatiskt MTU vid anslutning — utvecklaren behöver inte skicka MTU Request manuellt. I Android måste requestMTU anropas explicit. Efter förhandling förblir MTU fixerat för denna anslutning — omförhandling är omöjlig utan frånkoppling och återanslutning.

ATT-begränsningar: varför MTU inte kan vara större än 251 byte

ATT (Attribute Protocol) — protokollet som GATT är byggt på. Ett ATT-paket har en maximal storlek på 257 byte (ATT_MTU-1). Av dessa är 1 byte Opcode (operationstyp), 1 byte är Handle och upp till 255 byte är Value. Således är det maximala MTU som tillåts av ATT-specifikationen 257 byte (i praktiken används upp till 251 byte eftersom vissa tjänstefält ändå behövs).

För att skicka data större än MTU används fragmentering på applikationsnivå. Utvecklaren delar själv upp data i bitar av storlek ≤ MTU och skickar dem sekventiellt. Varje bit är formellt en separat GATT Write Request. Den mottagande sidan assemblerar bitarna till en enda buffert. Inbyggt stöd för fragmentering i GATT finns inte — detta är utvecklarens uppgift.

BLE-versionMax. MTUMax. DLEATT MTU-gräns
BLE 4.0 / 4.123 byte27 byteATT fix
BLE 4.2247 byte251 byte257 byte
BLE 5.0251 byte251 byte257 byte
Android + iOS512 / 517251 byteATT överskriden

Intressant faktum: iOS och Android begär MTU på 512 respektive 517 byte, men detta värde överskrider ATT-gränsen. I praktiken fragmenterar BLE-stacken automatiskt sådan data och skickar den som flera sekventiella GATT-begäran om maximalt 251 byte. För utvecklaren är skillnaden omärkbar — writeValue fungerar med valfri storlek upp till 512 byte i iOS.

MTU:s påverkan på prestanda

MTU-storleken påverkar direkt bandbredden för BLE-anslutningen. Vid MTU 23 byte är den maximala användbara överföringshastigheten cirka 7–10 KB/s under ideala förhållanden. Att öka MTU till 247 byte höjer hastigheten till 60–90 KB/s (med DLE och optimalt connection interval). Detta är särskilt viktigt för applikationer som överför bilder, ljudfragment eller loggar.

BLE-överföringens prestanda beror på tre faktorer: MTU (hur mycket data i en ATT-begäran), connection interval (hur ofta utväxlingshändelser inträffar) och DLE (hur mycket data i ett Link Layer-paket). Optimal konfiguration för maximal hastighet: MTU = 247, DLE = 251, connection interval = 7.5 ms (minimivärde).

Enligt data från Bluetooth SIG White Paper (2023) ökar ökningen av MTU från 23 till 247 byte vid connection interval 30 ms bandbredden från 8 KB/s till 42 KB/s — en ökning med 5 gånger. Vid connection interval 7.5 ms når bandbredden 88 KB/s. För applikationer som inte kräver hög hastighet (temperatursensorer, BLE-beacons) är standard MTU 23 byte fortfarande tillräckligt.

Konfigurera MTU i iOS och Android

iOS Core Bluetooth förhandlar automatiskt MTU vid anslutning till Peripheral. Utvecklaren kan kontrollera aktuellt MTU via maximumWriteValueLength, men kan inte ställa in det manuellt. iOS använder MTU upp till 512 byte för BLE 5.0-enheter och upp till 247 för BLE 4.2. För att skriva stora datamängder, använd writeType: .withResponse för garanterad leverans.

kotlin
// Begär MTU i Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// Begär MTU 517 byte
bluetoothGatt.requestMtu(517)

// Hantera resultat i callback
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android tillhandahåller BluetoothGatt.requestMtu(int), som möjliggör begäran av valfritt MTU upp till 517 byte. Det faktiska MTU bestäms av den perifera enheten — om den endast stödjer 23 byte kommer Android att returnera MTU 23. För att bestämma aktuellt MTU, använd gatt.requestMtu(0) — detta returnerar aktuellt värde utan att försöka ändra det. Android 12+ stöder automatisk MTU-förhandling vid anslutning via TRANSPORT_LE.

Plattformsoberoende ramverk (Flutter, React Native) tillhandahåller vanligtvis API för requestMTU. I biblioteket FlutterBlue Plus ställs MTU in som anslutningsparameter. I RxAndroidBle — via metoden requestMtu. Det rekommenderas att alltid förhandla maximalt MTU omedelbart efter upptäckt av tjänster, innan dataöverföring påbörjas, för att undvika fragmentering på applikationsnivå.

MTU och OTA-uppdateringar

OTA (Over-The-Air) firmwareuppdateringar — det mest krävande scenariot när det gäller MTU i BLE. Den typiska firmwarestorleken för en IoT-enhet är 100–500 KB. Vid MTU 23 byte och connection interval 30 ms tar överföring av 100 KB cirka 2–3 minuter. Vid MTU 247 byte och DLE 251 byte — 20–40 sekunder. Och vid MTU 512 byte (iOS) — 10–15 sekunder.

OTA-uppdateringsprocessen omfattar vanligtvis: fragmentering av firmware till paket av storlek ≤ MTU, sekventiell sändning via Notify/Write, verifiering av kontrollsumma på varje paket och kvittens. Om ett paket går förlorat begär enheten omöjlig. OTA:s tillförlitlighet beror kritiskt på korrekt val av MTU och connection interval.

Rekommendationer för OTA: förhandla maximalt MTU (247–512 byte), ställ in connection interval till 7.5–15 ms (om enheten stöder), använd DLE (Data Length Extension) för att öka det fysiska paketet till 251 byte. För enheter med begränsat buffertminne (t.ex. BLE-moduler baserade på nRF52), kontrollera maximalt MTU i chipspecifikationen.

Vanliga frågor

Vad händer om jag inte förhandlar MTU?

Anslutningen kommer att använda standard MTU — 23 byte. För de flesta IoT-scenarier (överföring av sensoravläsningar) räcker detta. För överföring av stora datamängder blir hastigheten 5–10 gånger lägre än med förhandlat MTU 247 byte.

Kan jag ändra MTU efter att dataöverföring har påbörjats?

Nej, MTU förhandlas en gång efter anslutning och kan inte ändras utan frånkoppling och återanslutning. Därför rekommenderas att förhandla MTU omedelbart efter upptäckt av tjänster, innan aktiv dataöverföring påbörjas.

Varför begär Android MTU 517 byte och iOS endast 512?

Dessa är historiskt fastställda empiriska maximum för varje stack. Det verkliga ATT MTU är fortfarande begränsat till 257 byte enligt specifikationen. Stackarna fragmenterar automatiskt data större än 251 byte till flera paket, så skillnaden mellan 512 och 517 är försumbar.

Hur relaterar MTU till Data Length Extension (DLE)?

MTU — storlek på GATT-begäran på ATT-nivå. DLE — storlek på fysiskt paket på Link Layer-nivå. Utan DLE fragmenteras varje GATT-begäran (upp till 247 byte) till paket om 27 byte. Med DLE — överförs i ett enda paket. För maximal hastighet måste båda parametrarna förhandlas.

Vilket MTU ska jag välja för en fitness tracker?

För en fitness tracker som överför puls och steg räcker standard MTU 23 byte. Om det behövs överföring av träningshistorik (volym 10–50 KB) — förhandla MTU 247 byte för att snabba upp datasynkronisering vid anslutning till smartphone.

Sammanfattning

  • MTU — maximal datastorlek i en GATT-begäran: från 23 byte (standard) till 251 byte (BLE 5.0).
  • MTU-förhandling sker via MTU Size Request/Response, initierad av Central efter anslutning.
  • ATT-protokollet begränsar MTU till 257 byte, men iOS och Android begär upp till 512–517 byte med automatisk fragmentering.
  • Ökning av MTU från 23 till 247 byte ökar bandbredden 5–10 gånger vid optimalt connection interval.
  • För maximal hastighet måste MTU + DLE + connection interval 7.5 ms förhandlas.
  • I iOS förhandlas MTU automatiskt, i Android — via requestMtu, rekommenderas att begära 247–517 byte.
  • OTA-uppdateringar — det mest krävande scenariot: korrekt MTU förkortar överföringstiden från minuter till sekunder.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också