11.6. Layanan dan karakteristik

Setelah GAP menghubungkan dua perangkat dalam koneksi terbuka, lapisan di atasnya -- Generic Attribute Profile, GATT -- harus memberi makna pada byte yang mengalir melalui koneksi tersebut. Pilihan BLE di sini cukup tidak biasa. Di mana TCP mengekspos aliran byte mentah dan menyerahkan kepada aplikasi untuk membuat framingnya sendiri, GATT mengekspos database kunci/nilai kecil yang di-host oleh satu sisi dan dibaca, ditulis, atau dilanggan oleh sisi lainnya.

Database tersebut adalah apa yang paling banyak dipikirkan oleh perancang aplikasi dalam pengembangan BLE. Apa yang dipublikasikan kamera ke sebuah ponsel, apa yang dipantaunya pada sensor jarak jauh, bagaimana keyboard Bluetooth memberi tahu host-nya tombol mana yang ditekan -- semuanya adalah nilai karakteristik dalam suatu database GATT di suatu tempat.

11.6.1. Dua sumbu peran, bukan satu

Sumber kebingungan yang umum: peripheral / central dan server / client adalah dua sumbu yang independen, bukan sinonim.

  • Peripheral dan central adalah peran GAP, ditetapkan saat koneksi. Peripheral mengiklankan diri dan dihubungi; central memindai dan menginisiasi koneksi. Ini ditentukan pada saat tautan terbentuk dan tidak berubah.

  • Server dan client adalah peran GATT, ditetapkan per operasi karakteristik. Server meng-host karakteristik; client membaca, menulis, atau berlangganan padanya.

Kedua sumbu ini dipisahkan oleh spesifikasi. Peripheral biasanya adalah server (tali pengikat detak jantung mempublikasikan pembacaannya) dan central biasanya adalah client (ponsel membacanya), tetapi BLE memungkinkan kombinasi apa pun -- sebuah peripheral dapat menemukan karakteristik pada central yang baru saja terhubung dengannya, atau sebuah koneksi tunggal dapat meng-host layanan di kedua sisi sekaligus.

Sebagian besar aplikasi kamera menggunakan pasangan konvensional (peripheral + server, atau central + client), sehingga bagian selanjutnya memperlakukan keduanya sebagai satu sumbu ketika kasus konvensional yang sedang dijelaskan. Ketika perbedaan itu penting, kedua istilah tersebut ditulis secara eksplisit.

11.6.2. Di dalam database

Database GATT adalah sebuah pohon. Daun-daunnya membawa byte aktual. Cabang-cabang mengelompokkan daun-daun yang berkaitan ke dalam unit yang bermakna bagi manusia.

A tree with a top node labelled "GATT database". Below it, three Service nodes labelled "Generic Access (0x1800)", "Battery (0x180F)", and "Environmental Sensing (0x181A)". Each Service has child Characteristic nodes; the Battery service has "Battery Level (0x2A19)" with a child Descriptor "CCCD". The Environmental Sensing service has "Temperature (0x2A6E)" and "Humidity (0x2A6F)".

Sebuah database GATT. Layanan mengelompokkan karakteristik; karakteristik membawa byte aplikasi; deskriptor membawa metadata tentang karakteristik.

Ada tiga jenis simpul:

  • Sebuah service (layanan) adalah kelompok logis dari nilai-nilai yang berkaitan. Bluetooth SIG menerbitkan definisi layanan standar untuk kasus penggunaan umum -- Battery Service untuk level baterai, Environmental Sensing untuk suhu / kelembapan / tekanan, Heart Rate untuk monitor detak jantung -- sehingga aplikasi generik di ponsel dapat mengenali layanan yang belum pernah dilihatnya. Sebuah aplikasi juga bebas mendefinisikan layanannya sendiri untuk hal-hal yang belum distandardisasi oleh SIG.

  • Sebuah characteristic (karakteristik) adalah satu nilai bernama di dalam sebuah layanan. Layanan Battery memiliki satu karakteristik -- Battery Level, persentase satu byte. Environmental Sensing memiliki karakteristik terpisah untuk suhu, kelembapan, tekanan, dan sebagainya. Sebuah karakteristik adalah unit operasi GATT -- Anda membaca karakteristik, menulis karakteristik, berlangganan karakteristik.

  • Sebuah descriptor (deskriptor) adalah metadata yang dilampirkan pada sebuah karakteristik. Beberapa deskriptor telah distandardisasi -- Client Characteristic Configuration Descriptor (CCCD) adalah yang paling terkenal, karena menulis ke dalamnya adalah cara client memberi tahu server "kirimkan notifikasi kepada saya pada karakteristik ini". Yang lainnya bersifat user-defined dan membawa hal-hal seperti format presentasi atau properti tambahan.

Sebuah server GATT (biasanya peripheral) mendeklarasikan database-nya sekali saat startup dan database tidak berubah selama berjalan. Sebuah client GATT (biasanya central) menemukan apa yang ada di database setelah terhubung -- menjelajahi pohon, membaca UUID dari layanan yang ditemukannya, lalu karakteristik di dalamnya.

11.6.3. UUID

Setiap layanan, karakteristik, dan deskriptor memiliki sebuah UUID (Universally Unique IDentifier) yang mengidentifikasi jenis apakah itu. UUID hadir dalam tiga lebar:

  • 16-bit. Dicadangkan untuk standar yang didefinisikan oleh Bluetooth SIG. Battery Service adalah 0x180F. Battery Level (sebuah karakteristik) adalah 0x2A19. Daftar lengkapnya diterbitkan di situs assigned-numbers Bluetooth SIG di https://www.bluetooth.com/specifications/assigned-numbers/.

  • 32-bit. Titik tengah yang jarang digunakan.

  • 128-bit. Yang digunakan semua orang lain -- vendor atau aplikasi menghasilkan satu secara acak dan menggunakannya untuk layanan atau karakteristik kustom mereka. Kamera yang mendefinisikan protokol mereka sendiri berada di sini.

Kelas bluetooth.UUID menerima ketiga lebar tersebut:

import bluetooth

BATTERY_SERVICE = bluetooth.UUID(0x180F)
CUSTOM_SERVICE = bluetooth.UUID("12345678-1234-5678-9abc-def012345678")

UUID 16-bit dienkode ke dalam payload iklan kecil, yang merupakan salah satu alasan layanan standar lebih disukai ketika ada -- tali detak jantung yang mengiklankan 0x180D (Heart Rate) menghabiskan dua byte; UUID kustom menghabiskan enam belas. Untuk aplikasi yang tidak memerlukan interoperabilitas standar, UUID 128-bit yang dihasilkan adalah jawaban yang tepat.

11.6.4. Apa yang dibeli oleh layanan yang distandardisasi SIG

Alasan menggunakan layanan standar sangat jelas: aplikasi yang sudah ada sudah tahu cara berbicara dengannya. Sebuah perangkat yang mengiklankan layanan Heart Rate (0x180D) dan mengekspos karakteristik Heart Rate Measurement (0x2A37) berfungsi dengan setiap aplikasi kebugaran di dunia tanpa siapa pun harus menulis kode baru. Perangkat yang mengimplementasikan ulang data yang sama dengan UUID kustom memerlukan aplikasi pendampingnya sendiri dan dokumen protokolnya sendiri.

Standar-standar itu memang ada biayanya. Tata letak byte di dalam setiap karakteristik telah ditentukan -- SIG memutuskan bahwa Heart Rate Measurement adalah bidang flag satu byte diikuti oleh nilai detak jantung 8-bit atau 16-bit, dan secara opsional diikuti oleh interval R-R -- dan perangkat yang sesuai harus mengikuti tata letak tersebut. Layanan kustom bebas dari batasan itu.

Jawaban pragmatis untuk kamera: gunakan layanan standar ketika ada satu yang sesuai untuk jenis data yang Anda miliki (Battery Service, Environmental Sensing), dan definisikan kustom dengan UUID 128-bit untuk hal apa pun yang spesifik untuk aplikasi Anda.

11.6.5. Objek sisi server dan sisi client

Untuk blok pembangun konseptual yang sama (layanan, karakteristik, deskriptor), setiap pustaka GATT mengekspos dua set objek paralel: