MTU (Maximum Transmission Unit) — adalah ukuran maksimum data berguna dalam satu paket BLE yang dapat ditransmisikan antar perangkat dalam satu transaksi GATT. Di BLE Classic (4.x) MTU ditetapkan pada 23 byte, cukup untuk pembacaan sensor kecil tetapi tidak cukup untuk transfer file atau pembaruan OTA. Bluetooth Core Specification 4.2 (2014) memperkenalkan prosedur MTU Size Request, memungkinkan negosiasi MTU yang lebih besar — hingga 247 byte (BLE 5.0 — hingga 251 byte). Konfigurasi MTU yang tepat adalah salah satu faktor kinerja utama aplikasi BLE yang mentransmisikan volume data besar.
Poin Utama
Maximum Transmission Unit (MTU) dalam konteks BLE — adalah ukuran maksimum Application Protocol Data Unit (APDU) yang dapat diterima perangkat dalam satu permintaan GATT. MTU didefinisikan pada level ATT (Attribute Protocol) dan mencakup header ATT (1 byte) + data berguna. Secara default, semua perangkat BLE mendukung MTU 23 byte (23 = 1 byte header ATT + 22 byte data).
MTU bukanlah batasan fisik saluran radio, melainkan kesepakatan antar perangkat pada level GATT. Ukuran fisik paket BLE pada level Link Layer bisa lebih besar (hingga 27 byte di BLE 4.0, hingga 257 byte di BLE 5.0 dengan Data Length Extension), tetapi level GATT membatasi berapa banyak data yang ditransmisikan dalam satu transaksi. Data Length Extension (DLE) — adalah mekanisme terpisah pada level Link Layer yang meningkatkan paket fisik hingga 251 byte dan harus dinegosiasikan secara terpisah.
Perbedaan antara MTU dan DLE: ATT MTU — berapa banyak data yang ditransmisikan dalam satu permintaan GATT, DLE — berapa banyak data yang muat dalam satu paket Link Layer. Untuk kecepatan maksimal, kedua parameter harus dinegosiasikan. Tanpa DLE, bahkan dengan MTU 247 byte, data akan difragmentasi menjadi beberapa paket Link Layer 27 byte, mengurangi bandwidth.
MTU Size Request — prosedur yang dimulai oleh Central setelah koneksi GATT terbentuk. Central mengirimkan MTU Request dengan menyebutkan kapasitas MTU-nya (ukuran maksimum yang dapat diterima). Peripheral merespons dengan MTU Response dengan nilainya sendiri. MTU yang digunakan adalah minimum dari kedua nilai. Jika Central mengusulkan MTU 512 dan Peripheral hanya mendukung 128, koneksi akan menggunakan MTU 128.
import CoreBluetooth
// Meminta MTU maksimum di iOS
func requestMTU(central: CBCentralManager,
peripheral: CBPeripheral) {
peripheral.maximumWriteValueLength(
for: .withoutResponse
)
// iOS secara otomatis menegosiasikan MTU saat koneksi
// MTU = 512 untuk perangkat BLE 5.0
let mtu = peripheral.maximumWriteValueLength(
for: .withResponse
)
print("MTu dinegosiasikan: " +
String(mtu))
}
Waktu negosiasi: MTU Request harus dikirim setelah penemuan layanan (discoverServices), tetapi sebelum transmisi data aktif dimulai. Di iOS Core Bluetooth secara otomatis menegosiasikan MTU saat koneksi — pengembang tidak perlu mengirim MTU Request secara manual. Di Android, requestMTU harus dipanggil secara eksplisit. Setelah negosiasi, MTU tetap tetap untuk koneksi ini — negosiasi ulang tidak mungkin dilakukan tanpa pemutusan dan koneksi ulang.
ATT (Attribute Protocol) — protokol yang menjadi dasar GATT. Paket ATT memiliki ukuran maksimum 257 byte (ATT_MTU-1). Dari jumlah ini, 1 byte adalah Opcode (jenis operasi), 1 byte adalah Handle, dan hingga 255 byte adalah Value. Dengan demikian, MTU maksimum yang diizinkan oleh spesifikasi ATT adalah 257 byte (dalam praktiknya digunakan hingga 251 byte karena beberapa bidang layanan tetap diperlukan).
Untuk mengirim data yang lebih besar dari MTU, digunakan fragmentasi pada level aplikasi. Pengembang sendiri membagi data menjadi potongan berukuran ≤ MTU dan mengirimnya secara berurutan. Setiap potongan secara formal merupakan permintaan GATT Write Request terpisah. Pihak penerima merakit potongan-potongan tersebut menjadi satu buffer. Tidak ada dukungan bawaan untuk fragmentasi di GATT — ini adalah tugas pengembang.
| Versi BLE | Maks. MTU | Maks. DLE | Batas ATT MTU |
|---|---|---|---|
| BLE 4.0 / 4.1 | 23 byte | 27 byte | ATT tetap |
| BLE 4.2 | 247 byte | 251 byte | 257 byte |
| BLE 5.0 | 251 byte | 251 byte | 257 byte |
| Android + iOS | 512 / 517 | 251 byte | Melampaui ATT |
Fakta menarik: iOS dan Android masing-masing meminta MTU 512 dan 517 byte, tetapi nilai ini melampaui batas ATT. Dalam praktiknya, tumpukan BLE secara otomatis memfragmentasi data tersebut, mengirimkannya sebagai beberapa permintaan GATT berurutan dengan maksimum 251 byte. Bagi pengembang, perbedaannya tidak terlihat — writeValue berfungsi dengan ukuran berapa pun hingga 512 byte di iOS.
Ukuran MTU secara langsung memengaruhi bandwidth koneksi BLE. Pada MTU 23 byte, kecepatan transmisi berguna maksimum sekitar 7–10 KB/s dalam kondisi ideal. Peningkatan MTU menjadi 247 byte meningkatkan kecepatan menjadi 60–90 KB/s (dengan DLE dan connection interval optimal). Ini sangat penting untuk aplikasi yang mentransmisikan gambar, fragmen audio, atau log.
Kinerja transmisi BLE bergantung pada tiga faktor: MTU (berapa banyak data dalam satu permintaan ATT), connection interval (seberapa sering peristiwa pertukaran terjadi) dan DLE (berapa banyak data dalam satu paket Link Layer). Konfigurasi optimal untuk kecepatan maksimal: MTU = 247, DLE = 251, connection interval = 7.5 ms (nilai minimum).
Menurut data Bluetooth SIG White Paper (2023), peningkatan MTU dari 23 menjadi 247 byte pada connection interval 30 ms meningkatkan bandwidth dari 8 KB/s menjadi 42 KB/s — peningkatan 5 kali lipat. Pada connection interval 7.5 ms, bandwidth mencapai 88 KB/s. Untuk aplikasi yang tidak memerlukan kecepatan tinggi (sensor suhu, beacon BLE), MTU standar 23 byte tetap mencukupi.
iOS Core Bluetooth secara otomatis menegosiasikan MTU saat terhubung ke Peripheral. Pengembang dapat memeriksa MTU saat ini melalui maximumWriteValueLength, tetapi tidak dapat mengaturnya secara manual. iOS menggunakan MTU hingga 512 byte untuk perangkat BLE 5.0 dan hingga 247 untuk BLE 4.2. Untuk menulis volume data besar, gunakan writeType: .withResponse untuk pengiriman terjamin.
// Meminta MTU di Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...
// Meminta MTU 517 byte
bluetoothGatt.requestMtu(517)
// Menangani hasil di callback
override fun onMtuChanged(
gatt: BluetoothGatt,
mtu: Int,
status: Int
) {
if (status == BluetoothGatt.GATT_SUCCESS) {
println("MTU negotiated: $mtu")
}
}
Android menyediakan BluetoothGatt.requestMtu(int), yang memungkinkan permintaan MTU apa pun hingga 517 byte. MTU aktual ditentukan oleh perangkat periferal — jika hanya mendukung 23 byte, Android akan mengembalikan MTU 23. Untuk menentukan MTU saat ini, gunakan gatt.requestMtu(0) — ini mengembalikan nilai saat ini tanpa mencoba mengubahnya. Android 12+ mendukung negosiasi MTU otomatis saat koneksi melalui TRANSPORT_LE.
Framework lintas platform (Flutter, React Native) biasanya menyediakan API untuk requestMTU. Di pustaka FlutterBlue Plus, MTU ditetapkan sebagai parameter koneksi. Di RxAndroidBle — melalui metode requestMtu. Disarankan untuk selalu menegosiasikan MTU maksimum segera setelah penemuan layanan, sebelum transmisi data dimulai, untuk menghindari fragmentasi pada level aplikasi.
Pembaruan firmware OTA (Over-The-Air) — skenario yang paling membutuhkan MTU di BLE. Ukuran tipikal firmware perangkat IoT adalah 100–500 KB. Pada MTU 23 byte dan connection interval 30 ms, transmisi 100 KB memakan waktu sekitar 2–3 menit. Pada MTU 247 byte dan DLE 251 byte — 20–40 detik. Dan pada MTU 512 byte (iOS) — 10–15 detik.
Proses pembaruan OTA biasanya meliputi: fragmentasi firmware menjadi paket berukuran ≤ MTU, pengiriman berurutan melalui Notify/Write, verifikasi checksum pada setiap paket dan konfirmasi penerimaan. Jika ada paket yang hilang, perangkat meminta pengiriman ulang. Keandalan OTA sangat bergantung pada pemilihan MTU dan connection interval yang tepat.
Rekomendasi untuk OTA: negosiasikan MTU maksimum (247–512 byte), atur connection interval ke 7.5–15 ms (jika perangkat mendukung), gunakan DLE (Data Length Extension) untuk meningkatkan paket fisik hingga 251 byte. Untuk perangkat dengan memori buffer terbatas (misalnya, modul BLE berbasis nRF52), periksa MTU maksimum di spesifikasi chip.
Pertanyaan yang Sering Diajukan
Koneksi akan menggunakan MTU default — 23 byte. Untuk sebagian besar skenario IoT (transmisi pembacaan sensor) ini sudah cukup. Untuk transmisi volume data besar, kecepatan akan 5–10 kali lebih rendah dibandingkan dengan MTU 247 byte yang dinegosiasikan.
Tidak, MTu dinegosiasikan satu kali setelah koneksi dan tidak dapat diubah tanpa pemutusan dan koneksi ulang. Oleh karena itu, disarankan untuk menegosiasikan MTU segera setelah penemuan layanan, sebelum transmisi data aktif dimulai.
Ini adalah maksimum empiris yang terbentuk secara historis untuk setiap tumpukan. ATT MTU yang sebenarnya tetap dibatasi hingga 257 byte menurut spesifikasi. Tumpukan secara otomatis memfragmentasi data yang lebih besar dari 251 byte menjadi beberapa paket, sehingga perbedaan antara 512 dan 517 tidak signifikan.
MTU — ukuran permintaan GATT pada level ATT. DLE — ukuran paket fisik pada level Link Layer. Tanpa DLE, setiap permintaan GATT (hingga 247 byte) difragmentasi menjadi paket 27 byte. Dengan DLE — ditransmisikan dalam satu paket. Untuk kecepatan maksimal, kedua parameter harus dinegosiasikan.
Untuk pelacak kebugaran yang mentransmisikan pembacaan detak jantung dan langkah, MTU standar 23 byte sudah cukup. Jika diperlukan untuk mentransmisikan riwayat latihan (volume 10–50 KB) — negosiasikan MTU 247 byte untuk mempercepat sinkronisasi data saat terhubung ke smartphone.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga