Characteristic adalah unit data fundamental dalam Bluetooth Low Energy yang digunakan Central untuk menerima atau menulis informasi pada perangkat periferal. Setiap Characteristic dimiliki oleh layanan GATT tertentu, memiliki UUID unik, dan serangkaian properti (read, write, notify, indicate) yang menentukan operasi yang mungkin dilakukan. Menurut Bluetooth Core Specification 5.4 (2023), Bluetooth SIG telah menspesifikasikan lebih dari 500 karakteristik standar untuk perangkat medis, kebugaran, dan industri. Pengembang membuat karakteristik kustom untuk mentransfer data pengguna apa pun — dari pembacaan sensor hingga perintah kontrol perangkat.
Poin Utama
Characteristic adalah atribut protokol GATT yang berisi nilai (value) dan metadata. Dalam arsitektur BLE, data tidak ditransfer secara langsung antar perangkat, melainkan melalui pembacaan dan penulisan nilai karakteristik layanan. Jika layanan adalah folder, maka Characteristic adalah file di dalam folder tersebut.
Setiap Characteristic terdiri dari tiga komponen: deklarasi (declaration), nilai (value), dan deskriptor (descriptors). Deklarasi berisi UUID karakteristik dan propertinya. Nilai adalah data aktual yang ditransfer antara Central dan Peripheral. Deskriptor menyediakan konfigurasi tambahan.
Menurut Bluetooth Core Specification 5.4 (2023), semua pertukaran data di BLE terjadi melalui operasi pada karakteristik. Bahkan profil standar seperti Heart Rate Profile atau Battery Service dibangun di atas serangkaian karakteristik dengan UUID yang telah ditentukan sebelumnya. Ini memastikan kompatibilitas perangkat dari berbagai produsen tanpa konfigurasi awal.
Penting bagi pengembang untuk memahami: setiap Characteristic dapat mendukung kombinasi properti yang berbeda. Satu karakteristik mungkin hanya baca, yang lain hanya tulis, dan yang ketiga untuk notifikasi. Pemilihan properti yang tepat menentukan skenario penggunaan dan konsumsi daya perangkat.
Properti (properties) karakteristik menentukan operasi apa yang diizinkan padanya. Ini adalah mask byte, di mana setiap bit mengaktifkan atau menonaktifkan operasi tertentu. Berikut adalah properti utama.
| Properti | Bit | Deskripsi | Penggunaan Umum |
|---|---|---|---|
| Read | 0x02 | Central dapat membaca nilai saat ini | Status, level baterai, konfigurasi |
| Write | 0x08 | Central dapat menulis nilai baru | Perintah kontrol, pengaturan |
| Notify | 0x10 | Peripheral mengirim nilai tanpa konfirmasi | Data aliran (denyut nadi, suhu) |
| Indicate | 0x20 | Peripheral mengirim nilai dengan konfirmasi | Data kritis (alarm, status) |
| Write Without Response | 0x04 | Menulis tanpa menunggu konfirmasi dari server | Transmisi perintah kecepatan tinggi |
Izin (permissions) adalah tingkat akses pada tingkat server GATT. Tidak seperti properti yang dideklarasikan dalam deklarasi karakteristik, izin diperiksa pada setiap operasi. Izin dapat mencakup persyaratan enkripsi dan autentikasi.
Bluetooth SIG telah menspesifikasikan lebih dari 500 karakteristik standar yang mencakup sebagian besar skenario penggunaan BLE yang umum. Penggunaan UUID standar memastikan bahwa perangkat penerima mana pun akan menginterpretasikan data dengan benar tanpa konfigurasi awal.
Berikut adalah karakteristik standar yang paling sering digunakan:
| UUID | Nama | Tipe Data | Layanan |
|---|---|---|---|
| 0x2A19 | Battery Level | uint8 (0–100%) | Battery Service |
| 0x2A37 | Heart Rate Measurement | uint8 + bendera | Heart Rate |
| 0x2A6E | Temperature | int16 (0.01°C) | Environmental Sensing |
| 0x2A6F | Humidity | uint16 (0.01%) | Environmental Sensing |
| 0x2A00 | Device Name | UTF-8 string | Generic Access |
| 0x2A01 | Appearance | uint16 | Generic Access |
Jika karakteristik standar yang ada mencakup tugas Anda — gunakanlah. Ini menyederhanakan sertifikasi Bluetooth dan meningkatkan kompatibilitas dengan ekosistem. Buat karakteristik kustom hanya untuk data unik yang tidak ada di registri SIG.
Pembuatan karakteristik dilakukan di sisi Peripheral — perangkat yang menyediakan data. Mari kita lihat implementasi di iOS (Swift) dan Android (Java).
Core Bluetooth menyediakan kelas CBMutableCharacteristic untuk membuat karakteristik dengan menentukan UUID, properti, dan nilai awal.
import CoreBluetooth
let characteristicUUID = CBUUID("2A19") // Karakteristik level baterai
let characteristic = CBMutableCharacteristic(
type: characteristicUUID,
properties: [.read, .notify],
value: nil,
permissions: [.readable]
)
// Perbarui nilai saat berubah
let batteryData = Data([batteryLevel]) // uint8
peripheralManager.updateValue(
batteryData,
for: characteristic,
onSubscribedCentrals: nil
)
Di Android, karakteristik dibuat melalui BluetoothGattCharacteristic dengan menentukan UUID, properti, dan izin.
import android.bluetooth.*;
UUID charUuid = UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB");
BluetoothGattCharacteristic characteristic =
new BluetoothGattCharacteristic(
charUuid,
BluetoothGattCharacteristic.PROPERTY_READ
| BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ
);
// Atur nilai
characteristic.setValue(batteryLevel, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
gattServer.notifyCharacteristicChanged(device, characteristic, false);
Operasi pada Characteristic dibagi menjadi tiga jenis: baca (read), tulis (write), dan notifikasi (notify/indicate). Pemilihan operasi tergantung pada skenario: data berdasarkan permintaan dibaca, perintah ditulis, data aliran berlangganan notifikasi.
Read — Central mengirim permintaan untuk membaca nilai karakteristik. Peripheral merespons dengan nilai saat ini. Operasi bersifat sinkron dan memerlukan permintaan eksplisit dari kedua sisi. Digunakan untuk data yang jarang berubah: versi firmware, nomor seri, pengaturan.
Write — Central mengirim data ke Peripheral. Ada dua mode: Write with Response (konfirmasi dari Peripheral) dan Write Without Response (tanpa konfirmasi). Write with Response menjamin pengiriman — Peripheral mengirim konfirmasi setelah penulisan. Write Without Response lebih cepat, tetapi tidak menjamin pengiriman.
Notify dan Indicate — Peripheral memulai pengiriman data ke Central. Pada Notify, data dikirim tanpa konfirmasi — jika Central tidak sempat menerima paket, data akan hilang. Pada Indicate, Central mengirim konfirmasi (di tingkat PDU), yang menjamin pengiriman. Indicate lebih lambat, tetapi lebih andal. Untuk berlangganan notifikasi, Central menulis nilai 0x0001 ke CCCD (Client Characteristic Configuration Descriptor).
MTU (Maximum Transmission Unit) menentukan ukuran maksimum satu paket data BLE. Secara default, MTU adalah 23 byte, di mana 3 byte adalah header — muatan (ATT payload) adalah 20 byte. Ini cukup untuk sebagian besar data sensor, tetapi tidak cukup untuk mentransfer file atau konfigurasi besar.
Bluetooth Core Specification 5.4 mendukung negosiasi MTU (MTU negotiation) — Central dan Peripheral dapat menyetujui ukuran paket yang lebih besar hingga 517 byte. Prosesnya sebagai berikut: Central mengirim permintaan MTU Exchange dengan proposal MTU-nya; Peripheral merespons dengan MTU-nya; nilai terkecil dari keduanya digunakan.
// iOS meminta MTU saat terhubung
// MTU maksimum di iOS adalah 185 byte
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverServices error: Error?
) {
// Minta MTU untuk periferal tertentu
peripheral.maximumWriteValueLength(for: .withResponse)
}
Menurut Bluetooth SIG (2023), peningkatan MTU dari 23 menjadi 185 byte mengurangi overhead transmisi data hingga 80% karena berkurangnya jumlah paket. Untuk aplikasi yang mentransmisikan pembacaan dengan frekuensi tinggi (misalnya, EKG atau akselerometer), peningkatan MTU sangat penting untuk stabilitas aliran.
Pertanyaan yang Sering Diajukan
Spesifikasi BLE tidak membatasi jumlah karakteristik dalam suatu layanan. Dalam praktiknya, batasan ditentukan oleh memori yang tersedia dari server GATT dan persyaratan kinerja. Untuk perangkat tertanam, disarankan tidak lebih dari 10–15 karakteristik per layanan.
Notify mengirim data tanpa konfirmasi — paket dapat hilang tanpa pemberitahuan kepada pengirim. Indicate memerlukan konfirmasi (ACK) di tingkat protokol, yang menjamin pengiriman. Indicate lebih lambat, tetapi lebih andal. Untuk data kritis (alarm, perintah) gunakan Indicate.
Ya, karakteristik dapat memiliki kombinasi properti. Misalnya, karakteristik pengaturan dapat mendukung Read (membaca nilai saat ini) dan Write (mengubah pengaturan). Gabungkan properti sesuai dengan skenario penggunaan Anda.
Gunakan negosiasi MTU untuk meningkatkan ukuran paket menjadi 185–517 byte. Jika data masih terlalu besar — terapkan fragmentasi di tingkat aplikasi: bagi data menjadi beberapa permintaan berurutan dengan kontrol integritas.
Jika tugas Anda dicakup oleh karakteristik standar — gunakan UUID dari registri Bluetooth SIG. Ini menyederhanakan sertifikasi dan memastikan kompatibilitas dengan ekosistem. Buat UUID kustom hanya untuk data unik dari produsen pihak ketiga.
Kesimpulan
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