MTU (Maximum Transmission Unit), tek bir GATT işleminde cihazlar arasında iletilebilen bir BLE paketindeki maksimum faydalı veri boyutudur. BLE Classic'te (4.x), MTU 23 bayt olarak sabitlenmiştir, bu küçük sensör okumaları için yeterlidir ancak dosya aktarımları veya OTA güncellemeleri için yetersizdir. Bluetooth Core Specification 4.2 (2014), daha büyük bir MTU'nun (BLE 5.0'da 251 bayta kadar, 247 bayta kadar) pazarlığına olanak tanıyan MTU Size Request prosedürünü tanıttı. Doğru MTU yapılandırması, büyük hacimli veri ileten BLE uygulamalarının performansının temel faktörlerinden biridir.
Önemli Noktalar
Maximum Transmission Unit (MTU), BLE bağlamında bir cihazın tek bir GATT isteğinde kabul edebileceği maksimum Uygulama Protokolü Veri Birimi (APDU) boyutudur. MTU, ATT (Attribute Protocol) seviyesinde tanımlanır ve ATT başlığını (1 bayt) + faydalı verileri içerir. Varsayılan olarak, tüm BLE cihazları 23 bayt MTU'yu destekler (23 = 1 bayt ATT başlığı + 22 bayt veri).
MTU, radyo kanalının fiziksel bir sınırı değil, GATT seviyesinde cihazlar arasında bir anlaşmadır. Bağlantı Katmanındaki (Link Layer) fiziksel BLE paket boyutu daha büyük olabilir (BLE 4.0'da 27 bayta kadar, Data Length Extension ile BLE 5.0'da 257 bayta kadar), ancak GATT katmanı işlem başına iletilen veri miktarını sınırlar. Data Length Extension (DLE), fiziksel paketi 251 bayta çıkaran ayrı bir Bağlantı Katmanı mekanizmasıdır ve ayrı olarak pazarlık edilmesi gerekir.
MTU ve DLE arasındaki fark: ATT MTU — GATT isteği başına iletilen veri miktarı, DLE — bir Bağlantı Katmanı paketine sığan veri miktarı. Maksimum hız için her iki parametrenin de pazarlık edilmesi gerekir. DLE olmadan, MTU 247 bayt olsa bile, veri birden çok 27 baytlık Bağlantı Katmanı paketine bölünerek verim düşer.
MTU Size Request — bir GATT bağlantısı kurulduktan sonra Central tarafından başlatılan bir prosedürdür. Central, MTU kapasitesini (kabul edebileceği maksimum boyut) belirten bir MTU Request gönderir. Peripheral, kendi değeriyle bir MTU Response ile yanıt verir. Sonuçta ortaya çıkan MTU, iki değerden minimum olandır. Central MTU 512 teklif ederse ve Peripheral yalnızca 128'i desteklerse, bağlantı MTU 128'i kullanır.
import CoreBluetooth
// iOS'ta maksimum MTU iste
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS bağlantıda MTU'yu otomatik olarak pazarlık eder
// BLE 5.0 cihazları için MTU = 512
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("Pazarlık edilen MTU: " +
String(mtu))
}
Pazarlık zamanlaması: MTU Request, hizmet keşfinden (discoverServices) sonra ancak aktif veri iletimi başlamadan önce gönderilmelidir. iOS Core Bluetooth'ta, MTU bağlantı sırasında otomatik olarak pazarlık edilir — geliştiricinin manuel olarak MTU Request göndermesi gerekmez. Android'de, requestMTU'nun açıkça çağrılması gerekir. Pazarlık edildikten sonra, MTU bu bağlantı için sabit kalır — bağlantıyı kesip yeniden bağlamadan yeniden pazarlık mümkün değildir.
ATT (Attribute Protocol) — GATT'ın üzerine inşa edildiği protokoldür. Bir ATT paketinin maksimum boyutu 257 bayttır (ATT_MTU-1). Bunlardan 1 bayt Opcode (işlem türü), 1 bayt Handle ve 255 bayta kadar Value'dir. Bu nedenle, ATT spesifikasyonu tarafından izin verilen maksimum MTU 257 bayttır (ancak pratikte bazı ek yük alanları hala gerekli olduğundan 251 bayta kadar kullanılır).
MTU'dan daha büyük veri göndermek için uygulama seviyesinde parçalama (fragmentation) kullanılır. Geliştirici, verileri manuel olarak ≤ MTU boyutundaki parçalara böler ve sırayla gönderir. Her parça ayrı bir GATT Write Request olarak gönderilir. Alan taraf, parçaları tek bir arabellekte birleştirir. GATT'da yerleşik parçalama desteği yoktur — bu geliştiricinin sorumluluğundadır.
| BLE Sürümü | Maks. MTU | Maks. DLE | ATT MTU Sınırı |
|---|---|---|---|
| BLE 4.0 / 4.1 | 23 bayt | 27 bayt | ATT sabit |
| BLE 4.2 | 247 bayt | 251 bayt | 257 bayt |
| BLE 5.0 | 251 bayt | 251 bayt | 257 bayt |
| Android + iOS | 512 / 517 | 251 bayt | ATT'yi aşıyor |
İlginç gerçek: iOS ve Android sırasıyla MTU 512 ve 517 bayt ister, ancak bu değer ATT sınırını aşıyor. Pratikte, BLE yığını bu tür verileri otomatik olarak parçalara ayırır ve her biri maksimum 251 bayt olan birden çok sıralı GATT isteği olarak gönderir. Geliştirici için fark şeffaftır — iOS'ta writeValue 512 bayta kadar herhangi bir boyutta çalışır.
MTU boyutu, BLE bağlantı verimini doğrudan etkiler. MTU 23 bayt ile ideal koşullarda maksimum faydalı aktarım hızı yaklaşık 7–10 KB/s'dir. MTU'nun 247 bayta çıkarılması, hızı 60–90 KB/s'ye (DLE ve optimum bağlantı aralığı ile) yükseltir. Bu, özellikle görüntü, ses parçaları veya günlük ileten uygulamalar için önemlidir.
BLE aktarım performansı üç faktöre bağlıdır: MTU (ATT isteği başına veri miktarı), bağlantı aralığı (değişim olaylarının ne sıklıkta gerçekleştiği) ve DLE (Bağlantı Katmanı paketi başına veri miktarı). Maksimum hız için optimum yapılandırma: MTU = 247, DLE = 251, bağlantı aralığı = 7,5 ms (minimum değer).
Bluetooth SIG White Paper (2023)'e göre, MTU'nun 30 ms bağlantı aralığıyla 23'ten 247 bayta çıkarılması, verimi 8 KB/s'den 42 KB/s'ye yükseltir — 5 kat artış. 7,5 ms bağlantı aralığıyla verim 88 KB/s'ye ulaşır. Yüksek hız gerektirmeyen uygulamalar (sıcaklık sensörleri, BLE işaretçileri) için standart 23 bayt MTU yeterlidir.
iOS Core Bluetooth, bir Peripheral'a bağlanırken MTU'yu otomatik olarak pazarlık eder. Geliştirici, maximumWriteValueLength aracılığıyla mevcut MTU'yu sorgulayabilir ancak manuel olarak ayarlayamaz. iOS, BLE 5.0 cihazları için 512 bayta kadar ve BLE 4.2 için 247 bayta kadar MTU kullanır. Büyük hacimli veri yazmak için garanti edilmiş teslimat için writeType: .withResponse kullanın.
// Android'de (Kotlin) MTU iste
val bluetoothGatt: BluetoothGatt = ...
// MTU 517 bayt iste
bluetoothGatt.requestMtu(517)
// Callback'te sonucu işle
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android, 517 bayta kadar herhangi bir MTU'yu istemeye izin veren BluetoothGatt.requestMtu(int)'i sağlar. Gerçek MTU, çevresel aygıt tarafından belirlenir — yalnızca 23 baytı destekliyorsa, Android MTU 23 döndürür. Geçerli MTU'yu belirlemek için gatt.requestMtu(0) kullanın — bu, değiştirmeye çalışmadan geçerli değeri döndürür. Android 12+, TRANSPORT_LE aracılığıyla bağlantıda otomatik MTU pazarlığını destekler.
Platformlar arası çerçeveler (Flutter, React Native) genellikle requestMTU için bir API sağlar. FlutterBlue Plus kitaplığında MTU, bir bağlantı parametresi olarak ayarlanır. RxAndroidBle'da — requestMtu yöntemi aracılığıyla. Uygulama seviyesinde parçalamayı önlemek için, veri iletimi başlamadan önce, hizmet keşfinden hemen sonra her zaman maksimum MTU'nun pazarlık edilmesi önerilir.
OTA (Over-The-Air) donanım yazılımı güncellemeleri — BLE'de MTU'yu en çok zorlayan senaryodur. Bir IoT cihazının tipik donanım yazılımı boyutu 100–500 KB'dir. MTU 23 bayt ve 30 ms bağlantı aralığıyla 100 KB aktarımı yaklaşık 2–3 dakika sürer. MTU 247 bayt ve DLE 251 bayt ile — 20–40 saniye. Ve MTU 512 bayt (iOS) ile — 10–15 saniye.
OTA güncelleme süreci genellikle şunları içerir: donanım yazılımının ≤ MTU boyutundaki paketlere parçalanması, Notify/Write aracılığıyla sıralı gönderim, her pakette sağlama toplamı doğrulaması ve alındı onayı. Bir paket kaybolursa, cihaz yeniden gönderim ister. OTA güvenilirliği, MTU ve bağlantı aralığının doğru seçimine kritik olarak bağlıdır.
OTA için öneriler: maksimum MTU (247–512 bayt) pazarlık edin, bağlantı aralığını 7,5–15 ms (cihaz destekliyorsa) olarak ayarlayın, fiziksel paketi 251 bayta çıkarmak için DLE (Data Length Extension) kullanın. Sınırlı arabellek belleğine sahip cihazlar için (örneğin, nRF52 tabanlı BLE modülleri), yonga spesifikasyonunda maksimum MTU'yu kontrol edin.
Sıkça Sorulan Sorular
Bağlantı varsayılan MTU'yu kullanır — 23 bayt. Çoğu IoT senaryosu (sensör okumalarını iletme) için bu yeterlidir. Büyük hacimli veri aktarımı için hız, pazarlık edilmiş 247 baytlık MTU'ya kıyasla 5–10 kat daha düşük olacaktır.
Hayır, MTU bağlantıdan sonra bir kez pazarlık edilir ve bağlantıyı kesip yeniden bağlamadan değiştirilemez. Bu nedenle, aktif veri iletimi başlamadan önce, hizmet keşfinden hemen sonra MTU'yu pazarlık etmeniz önerilir.
Bunlar her yığın için tarihsel olarak oluşturulmuş ampirik maksimum değerlerdir. Gerçek ATT MTU hala spesifikasyon tarafından 257 bayt ile sınırlıdır. Yığınlar, 251 bayttan büyük verileri otomatik olarak birden çok pakete böler, bu nedenle 512 ile 517 arasındaki fark önemsizdir.
MTU — ATT seviyesindeki bir GATT isteğinin boyutu. DLE — Bağlantı Katmanındaki fiziksel bir paketin boyutu. DLE olmadan, her GATT isteği (247 bayta kadar) 27 baytlık paketlere bölünür. DLE ile tek bir paket olarak iletilir. Maksimum hız için her iki parametrenin de pazarlık edilmesi gerekir.
Kalp atış hızı ve adım okumaları ileten bir fitness takipçisi için standart 23 bayt MTU yeterlidir. Egzersiz geçmişini (10–50 KB) aktarmanız gerekiyorsa, akıllı telefona bağlanırken veri senkronizasyonunu hızlandırmak için MTU 247 bayt pazarlık edin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun