MTU (Maximum Transmission Unit) — bir GATT əməliyyatı zamanı cihazlar arasında ötürülə bilən tək BLE paketindəki maksimum faydalı məlumat ölçüsüdür. BLE Classic (4.x) MTU 23 bayt səviyyəsində sabitdir, bu sensorların kiçik göstəriciləri üçün kifayətdir, lakin faylların və ya OTA yeniləmələrinin ötürülməsi üçün yetərsizdir. Bluetooth Core Specification 4.2 (2014) daha böyük MTU — 247 bayta qədər (BLE 5.0 — 251 bayta qədər) razılaşdırmağa imkan verən MTU Size Request prosedurunu təqdim etdi. MTU-nun düzgün konfiqurasiyası böyük həcmdə məlumat ötürən BLE tətbiqlərinin performansının əsas amillərindən biridir.
Əsas məqamlar
Maximum Transmission Unit (MTU) BLE kontekstində — cihazın bir GATT sorğusunda qəbul edə biləcəyi maksimum Application Protocol Data Unit (APDU) ölçüsüdür. MTU ATT (Attribute Protocol) səviyyəsində müəyyən edilir və ATT başlığı (1 bayt) + faydalı məlumatları ehtiva edir. Bütün BLE cihazları defolt olaraq 23 bayt MTU dəstəkləyir (23 = 1 bayt ATT başlığı + 22 bayt məlumat).
MTU radio kanalının fiziki limiti deyil, GATT səviyyəsində cihazlar arasında razılaşmadır. Link Layer səviyyəsində BLE paketinin fiziki ölçüsü daha böyük ola bilər (BLE 4.0-da 27 bayta qədər, BLE 5.0-da Data Length Extension ilə 257 bayta qədər), lakin GATT təbəqəsi bir əməliyyatda nə qədər məlumat ötürüləcəyini məhdudlaşdırır. Data Length Extension (DLE) — Link Layer səviyyəsində ayrıca mexanizmdir, fiziki paketi 251 bayta qədər artırır və ayrıca razılaşdırılmalıdır.
MTU və DLE arasındakı fərq: ATT MTU — bir GATT sorğusunda nə qədər məlumat ötürülür, DLE — bir Link Layer paketinə nə qədər məlumat sığar. Maksimum sürət üçün hər iki parametr razılaşdırılmalıdır. DLE olmadan hətta MTU 247 bayt olsa belə, məlumatlar 27 baytlıq bir neçə Link Layer paketinə parçalanaraq ötürmə qabiliyyətini azaldar.
MTU Size Request — GATT bağlantısı qurulduqdan sonra Central tərəfindən başladılan prosedur. Central öz MTU Capacity (qəbul edə biləcəyi maksimum ölçü) göstərərək MTU Request göndərir. Peripheral öz dəyəri ilə MTU Response cavablandırır. İstifadə olunan MTU iki dəyərdən minimumudur. Central MTU 512 təklif edirsə, Peripheral isə yalnız 128 dəstəkləyirsə, bağlantı MTU 128 istifadə edəcək.
import CoreBluetooth
// iOS-da maksimum MTU tələbi
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS qoşulma zamanı MTU-nu avtomatik razılaşdırır
// BLE 5.0 cihazları üçün MTU = 512
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("Razılaşdırılmış MTU: " +
String(mtu))
}
Razılaşdırma vaxtı: MTU Request xidmətlər aşkar edildikdən sonra (discoverServices), lakin aktiv məlumat ötürülməsinə başlamazdan əvvəl göndərilməlidir. iOS Core Bluetooth qoşulma zamanı MTU-nu avtomatik razılaşdırır — tərtibatçı əl ilə MTU Request göndərməlidir. Android-də requestMTU açıq şəkildə çağırılmalıdır. Razılaşdırmadan sonra MTU bu bağlantı üçün sabit qalır — təkrar razılaşdırma qoşulmanın kəsilməsi və yenidən qoşulması olmadan mümkün deyil.
ATT (Attribute Protocol) — GATT-in əsasında qurulduğu protokol. ATT paketinin maksimum ölçüsü 257 baytdır (ATT_MTU-1). Bunun 1 baytı Opcode (əməliyyat növü), 1 baytı Handle, 255 bayta qədəri Value-dir. Beləliklə, ATT spesifikasiyası ilə icazə verilən maksimum MTU 257 baytdır (praktikada 251 bayta qədər istifadə olunur, çünki bəzi xidmət sahələri yenə də lazımdır).
MTU-dan böyük məlumatların göndərilməsi üçün tətbiq səviyyəsində parçalanma istifadə olunur. Tərtibatçı məlumatları ≤ MTU ölçüsündə hissələrə bölür və ardıcıl olaraq göndərir. Hər bir hissə ayrıca GATT Write Request sorğusu kimi təqdim olunur. Qəbul edən tərəf hissələri vahid buferə yığır. GATT-da daxili parçalanma dəstəyi yoxdur — bu tərtibatçının vəzifəsidir.
| BLE versiyası | Maks. MTU | Maks. DLE | ATT MTU limiti |
|---|---|---|---|
| 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 həddini aşır |
Maraqlı fakt: iOS və Android müvafiq olaraq 512 və 517 bayt MTU tələb edir, lakin bu dəyər ATT limitini aşır. Praktikada BLE steki bu cür məlumatları avtomatik parçalayaraq maksimum 251 baytlıq bir neçə ardıcıl GATT sorğusu kimi göndərir. Tərtibatçı üçün fərq görünməzdir — writeValue iOS-da 512 bayta qədər istənilən ölçü ilə işləyir.
MTU ölçüsü BLE bağlantısının ötürmə qabiliyyətinə birbaşa təsir edir. MTU 23 bayt olduqda ideal şəraitdə maksimum faydalı ötürmə sürəti təxminən 7–10 KB/s təşkil edir. MTU-nun 247 bayta artırılması sürəti 60–90 KB/s-ə qaldırır (DLE və optimal connection interval ilə). Bu, şəkillər, audio fraqmentlər və ya loglar ötürən tətbiqlər üçün xüsusilə vacibdir.
BLE ötürmə performansı üç amildən asılıdır: MTU (bir ATT sorğusunda nə qədər məlumat), connection interval (mübadilə hadisələrinin nə qədər tez-tez baş verdiyi) və DLE (bir Link Layer paketində nə qədər məlumat). Maksimum sürət üçün optimal konfiqurasiya: MTU = 247, DLE = 251, connection interval = 7.5 ms (minimum dəyər).
Bluetooth SIG White Paper (2023) məlumatlarına görə, MTU-nun 23-dən 247 bayta artırılması connection interval 30 ms olduqda ötürmə qabiliyyətini 8 KB/s-dən 42 KB/s-ə — 5 dəfə artırır. Connection interval 7.5 ms olduqda ötürmə qabiliyyəti 88 KB/s-ə çatır. Yüksək sürət tələb etməyən tətbiqlər (temperatur sensorları, BLE beaconları) üçün standart MTU 23 bayt kifayətdir.
iOS Core Bluetooth Peripheral-ə qoşulduqda MTU-nu avtomatik razılaşdırır. Tərtibatçı cari MTU-nu maximumWriteValueLength vasitəsilə yoxlaya bilər, lakin onu əl ilə təyin edə bilməz. iOS BLE 5.0 cihazları üçün 512 bayta qədər, BLE 4.2 üçün 247 bayta qədər MTU istifadə edir. Böyük həcmdə məlumat yazmaq üçün zəmanətli çatdırılma üçün writeType: .withResponse istifadə edin.
// Android-də MTU tələbi (Kotlin)
val bluetoothGatt: BluetoothGatt = ...
// 517 bayt MTU tələbi
bluetoothGatt.requestMtu(517)
// Nəticəni callback-də idarə et
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android BluetoothGatt.requestMtu(int) təqdim edir, bu da 517 bayta qədər istənilən MTU tələb etməyə imkan verir. Faktiki MTU periferik cihaz tərəfindən müəyyən edilir — o yalnız 23 bayt dəstəkləyirsə, Android MTU 23 qaytaracaq. Cari MTU-nu təyin etmək üçün gatt.requestMtu(0) istifadə edin — bu dəyişiklik etmədən cari dəyəri qaytaracaq. Android 12+ TRANSPORT_LE vasitəsilə qoşulma zamanı avtomatik MTU razılaşdırılmasını dəstəkləyir.
Platformalararası freymvorklar (Flutter, React Native) adətən requestMTU üçün API təqdim edir. FlutterBlue Plus kitabxanasında MTU qoşulma parametri kimi təyin edilir. RxAndroidBle — requestMtu metodu vasitəsilə. Tətbiq səviyyəsində parçalanmanın qarşısını almaq üçün həmişə maksimum MTU-nu xidmətlər aşkar edildikdən dərhal sonra, məlumat ötürülməsinə başlamazdan əvvəl razılaşdırmaq tövsiyə olunur.
OTA (Over-The-Air) proqram təminatı yeniləmələri — BLE-də MTU-ya ən çox tələbkar ssenari. IoT cihazının proqram təminatının tipik ölçüsü 100–500 KB təşkil edir. MTU 23 bayt və connection interval 30 ms olduqda 100 KB ötürülməsi təxminən 2–3 dəqiqə çəkir. MTU 247 bayt və DLE 251 bayt olduqda — 20–40 saniyə. MTU 512 bayt (iOS) olduqda isə — 10–15 saniyə.
OTA yeniləmə prosesi adətən aşağıdakıları əhatə edir: proqram təminatının ≤ MTU ölçüsündə paketlərə parçalanması, Notify/Write vasitəsilə ardıcıl göndərilməsi, hər paketdə yoxlama cəminin yoxlanılması və qəbulun təsdiqlənməsi. Əgər hansısa paket itirsə, cihaz təkrar göndərilməsini tələb edir. OTA-nın etibarlılığı MTU və connection interval-ın düzgün seçilməsindən kritik şəkildə asılıdır.
OTA üçün tövsiyələr: maksimum MTU (247–512 bayt) razılaşdırın, connection interval 7.5–15 ms təyin edin (cihaz dəstəkləyirsə), fiziki paketi 251 bayta qədər artırmaq üçün DLE (Data Length Extension) istifadə edin. Məhdud bufer yaddaşı olan cihazlar üçün (məsələn, nRF52 əsaslı BLE modulları) çip spesifikasiyasında maksimum MTU-nu yoxlayın.
Tez-tez verilən suallar
Bağlantı defolt MTU — 23 bayt istifadə edəcək. Əksər IoT ssenariləri (sensor göstəricilərinin ötürülməsi) üçün bu kifayətdir. Böyük həcmdə məlumat ötürülməsi üçün sürət razılaşdırılmış MTU 247 baytla müqayisədə 5–10 dəfə aşağı olacaq.
Xeyr, MTU qoşulmadan sonra bir dəfə razılaşdırılır və bağlantının kəsilməsi və yenidən qoşulması olmadan dəyişdirilə bilməz. Buna görə də MTU-nu xidmətlər aşkar edildikdən dərhal sonra, aktiv məlumat ötürülməsinə başlamazdan əvvəl razılaşdırmaq tövsiyə olunur.
Bunlar hər bir stack üçün tarixən formalaşmış empirik maksimumlardır. Real ATT MTU spesifikasiyaya görə yenə də 257 bayt ilə məhdudlaşır. Stacklər 251 baytdan böyük məlumatları avtomatik olaraq bir neçə paketə parçalayır, buna görə də 512 və 517 arasındakı fərq əhəmiyyətsizdir.
MTU — ATT səviyyəsində GATT sorğusunun ölçüsü. DLE — Link Layer səviyyəsində fiziki paketin ölçüsü. DLE olmadan hər GATT sorğusu (247 bayta qədər) 27 baytlıq paketlərə parçalanır. DLE ilə — bir paketdə ötürülür. Maksimum sürət üçün hər iki parametr razılaşdırılmalıdır.
Ürək döyüntüsü və addım göstəricilərini ötürən fitness trekeri üçün standart MTU 23 bayt kifayətdir. Əgər məşq tarixçəsini (həcmi 10–50 KB) ötürmək tələb olunursa — smartfona qoşulduqda məlumat sinxronizasiyasını sürətləndirmək üçün MTU 247 bayt razılaşdırın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun