Deskriptor — bu BLE xarakteristikasining yordamchi atributi bo‘lib, uning qiymati uchun metama’lumotlar yoki konfiguratsiyani ta’minlaydi. Bluetooth Core Specification 5.4 deskriptorlarni GATT profilining ajralmas qismi sifatida belgilaydi: ular o‘lchov birliklarini, qiymat diapazonlarini, matn nomlarini tavsiflaydi va bildirishnomalarga obunani boshqaradi. Eng taniqli deskriptor Client Characteristic Configuration Descriptor (CCCD, 0x2902) bo‘lib, u Centralga xarakteristikadan bildirishnomalarga obuna bo‘lish imkonini beradi. Bluetooth SIG ma’lumotlariga ko‘ra, 8 ta standart deskriptor spetsifikatsiya qilingan va maxsus deskriptorlar ishlab chiquvchi tomonidan har qanday qo‘shimcha metama’lumotlar uchun yaratilishi mumkin.
Asosiy fikrlar
Deskriptor — bu GATT protokolining atributi bo‘lib, u xarakteristikaga biriktiriladi va uning qiymati yoki ishlatish usuli haqida qo‘shimcha ma’lumot beradi. GATT terminologiyasida xarakteristika ma’lumotdir, deskriptor esa bu ma’lumotlarning metama’lumotidir.
Har bir xarakteristika nol yoki undan ko‘p deskriptorga ega bo‘lishi mumkin. Deskriptorlar GATT jadvalida alohida atributlar sifatida belgilanadi va Bluetooth SIG fazosida o‘zining 16-bit UUIDiga ega. Deskriptorlar mustaqil mavjud bo‘la olmaydi — ular har doim ma’lum bir xarakteristikaga bog‘langan.
Bluetooth Core Specification 5.4 (2023) ga ko‘ra, deskriptorlar ikki toifaga bo‘linadi: standart (Bluetooth SIG tomonidan belgilangan) va maxsus (ishlab chiquvchi tomonidan belgilanadigan). Standart deskriptorlar 0x2900–0x2908 diapazonida UUIDga ega va qat’iy belgilangan funksiyalarni bajaradi. Maxsus deskriptorlar xuddi maxsus xizmatlar va xarakteristikalar kabi 128-bit UUIDlardan foydalanadi.
Deskriptorlar BLE ulanishining xatti-harakat konfiguratsiyasi uchun asosiy mexanizmdir. CCCD (0x2902) bo‘lmasa, bildirishnomalarga obuna bo‘lish mumkin emas, Presentation Format (0x2904) bo‘lmasa, Central xarakteristikaning xom baytlarini qanday talqin qilishni bilmaydi.
CCCD UUID 0x2902 bilan BLEdagi eng muhim va eng keng qo‘llaniladigan deskriptordir. U Centralning xarakteristikadan bildirishnomalar (Notify) va tasdiqlangan bildirishnomalar (Indicate) ga obunasini boshqaradi. CCCDga yozuv bo‘lmasa, xarakteristika hatto Notify xususiyatiga ega bo‘lsa ham bildirishnomalarni yubormaydi.
CCCD 16-bitli qiymat bo‘lib, unda eng kichik bit (0x0001) Notifyni, ikkinchi bit (0x0002) esa Indicate ni yoqadi. Central CCCDga kerakli qiymatni yozadi va shu bilan bildirishnomalarga obuna bo‘ladi. Agar Central 0x0000 yozsa — obuna bekor qilinadi.
CCCDning ishlash mexanizmi quyidagicha: Central Notify qo‘llab-quvvatlovchi xarakteristikani aniqlaganda, uning CCCD deskriptorini topadi va 0x0001 yozadi. Shundan so‘ng, har safar Peripheral xarakteristika qiymatini yangilaganda, u avtomatik ravishda obuna bo‘lgan Centralga Handle Value Notification orqali yuboriladi (Centraldan so‘rovsiz).
Apple Core Bluetooth Programming Guide ga ko‘ra, CCCD tizim tomonidan avtomatik boshqariladi, xarakteristika uchun setNotifyValue chaqirilganda. Ishlab chiquvchi qo‘lda CCCDni qidirib yozishi shart emas — Core Bluetooth bildirishnomalar faollashtirilganda buni avtomatik bajaradi.
iOSda obuna CBPeripheral obyektidagi setNotifyValue metodi orqali amalga oshiriladi.
import CoreBluetooth
// Xarakteristika bildirishnomalariga obuna bo‘ling
peripheral.setNotifyValue(true, for: characteristic)
// Delegate yangilangan qiymatlarni oladi
func peripheral(
_ peripheral: CBPeripheral,
didUpdateValueFor characteristic: CBCharacteristic,
error: Error?
) {
// characteristic.value yangi ma’lumotlarga ega
guard let data = characteristic.value else { return }
}
Androidda bildirishnomalarga obuna BluetoothGatt.setCharacteristicNotification orqali amalga oshiriladi. Ishlab chiquvchi qo‘lda CCCDga 0x0001 qiymatini yozishi kerak.
import android.bluetooth.*;
// Bildirishnomalarni yoqing
bluetoothGatt.setCharacteristicNotification(characteristic, true);
// CCCDga 0x0001 yozing
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
Bluetooth SIG xarakteristika konfiguratsiyasining keng tarqalgan vazifalari uchun 8 ta standart deskriptorni belgilagan. Har bir deskriptor qat’iy belgilangan UUID va qiymat formatiga ega.
| UUID | Deskriptor nomi | Maqsad | Qiymat turi |
|---|---|---|---|
| 0x2900 | Characteristic Extended Properties | Xarakteristikaning qo‘shimcha xususiyatlari | uint16 (bit maskasi) |
| 0x2901 | Characteristic User Description | Xarakteristikaning matn nomi | UTF-8 satr |
| 0x2902 | Client Characteristic Configuration | Bildirishnomalarni boshqarish | uint16 |
| 0x2903 | Server Characteristic Configuration | Broadcast uchun server konfiguratsiyasi | uint16 |
| 0x2904 | Characteristic Presentation Format | Ma’lumot taqdimot formati | Struktura (7 bayt) |
| 0x2905 | Characteristic Aggregate Format | Bir nechta xarakteristikani birlashtirish | UUID ro‘yxati |
| 0x2906 | Valid Range | Ruxsat etilgan qiymat diapazoni | uint16 × 2 (min, max) |
| 0x2907 | External Report Reference | Tashqi hisobotga havola | uint16 |
| 0x2908 | Report Reference | Ichki hisobotga havola | uint8 + uint16 |
Characteristic User Description (0x2901) UI uchun ayniqsa foydalidir: u ilova interfeysida ko‘rsatilishi mumkin bo‘lgan inson o‘qiy oladigan xarakteristika nomini o‘z ichiga oladi. Masalan, Battery Level xarakteristikasi “Batareya zaryad darajasi” qiymatiga ega User Description deskriptoriga ega bo‘lishi mumkin.
Characteristic Presentation Format (0x2904) xarakteristika qiymatini qanday talqin qilish haqida ma’lumotni o‘z ichiga oladi: format (uint8, uint16, float), eksponent, o‘lchov birligi (Bluetooth SIG reestridan UUID orqali), nom fazosi va tavsif. Masalan, harorat eksponent -2 (bo‘linma qiymati 0.01°C) va “selsiy darajasi” o‘lchov birligi bilan int16 bo‘lishi mumkin.
Deskriptorlarga kirish iOS va Androidda farq qiladi. Core Bluetooth bildirishnomalar yoqilganda CCCDni avtomatik boshqaradi, Android esa deskriptorga qo‘lda qiymat yozishni talab qiladi. Ikkala yondashuvni ko‘rib chiqamiz.
iOSda ishlab chiquvchi odatda deskriptorlar bilan bevosita aloqada bo‘lmaydi. Core Bluetooth avtomatik ravishda CCCDni topadi va setNotifyValue chaqirilganda unga kerakli qiymatni yozadi. Deskriptorlarni o‘qish uchun discoverDescriptors metodidan foydalaniladi.
// Deskriptorlarni kashf eting
peripheral.discoverDescriptors(for: characteristic)
// User Description qiymatini o‘qing
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverDescriptorsFor characteristic: CBCharacteristic,
error: Error?
) {
for descriptor in characteristic.descriptors ?? [] {
if descriptor.uuid == CBUUID("2901") {
peripheral.readValue(for: descriptor)
}
}
}
Androidda ishlab chiquvchi xarakteristikaning CCCD deskriptorini o‘zi topishi va bildirishnomalarni yoqish uchun unga qiymat yozishi kerak. Bu iOS bilan solishtirganda qo‘shimcha qadamdir.
// User Description deskriptori qiymatini o‘qing
BluetoothGattDescriptor userDesc = characteristic
.getDescriptor(
UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
);
if (userDesc != null) {
bluetoothGatt.readDescriptor(userDesc);
}
Maxsus deskriptorlar Bluetooth SIG standart deskriptorlari yetarli bo‘lmaganda ishlatiladi. Masalan, tibbiy sensor ishlab chiqaruvchisi sensor kalibratsiyasi haqida ma’lumotga ega deskriptor yoki xato jurnali bilan deskriptor qo‘shishi mumkin.
Maxsus deskriptor xuddi maxsus xarakteristika kabi 128-bit UUID bilan yaratiladi. Peripheral tomondan ishlab chiquvchi uni tegishli API orqali xarakteristikaga qo‘shadi. Central tomondan deskriptor discoverDescriptors chaqirilganda avtomatik aniqlanadi.
Maxsus deskriptor yaratishda qoidalarga rioya qiling: qiymat uzunligi kutilayotgan ma’lumot turiga mos kelishi kerak, kirish huquqlari (read/write) aniq ko‘rsatilishi kerak. Maxsus maqsadlar uchun Bluetooth SIG standart deskriptorlarining UUID diapazonidan (0x2900–0x2908) foydalanmang.
Xarakteristika va deskriptor — bu GATT atributlarining turli darajalaridir. Xarakteristika ma’lumot nuqtasidir, deskriptor esa uning metama’lumoti yoki konfiguratsiyasidir. Farq bir nechta jihatlarda namoyon bo‘ladi: maqsad, UUID va kirish qoidalari.
Xarakteristika har doim GATT jadvalida joylashgan majburiy deklaratsiyaga (declaration) ega. Deskriptor ixtiyoriy — xarakteristika deskriptorlarga ega bo‘lmasligi mumkin. Xarakteristika mustaqil ravishda o‘qilishi, yozilishi yoki bildirishnomalar yuborishi mumkin. Deskriptor har doim xarakteristikaga bog‘langan va alohida mavjud emas.
Bluetooth Core Specification 5.4 ga ko‘ra, GATT jadvalida atributlarning tartibi quyidagicha: xizmat deklaratsiyasi, xarakteristika deklaratsiyasi, xarakteristika qiymati, xarakteristika deskriptorlari (agar mavjud bo‘lsa), keyin keyingi xizmat. Bu tartib GATT mijozlarining to‘g‘ri ishlashi uchun majburiydir.
Tez-tez beriladigan savollar
CCCD obunani boshqarish uchun kerak: Notify xususiyati faqat xarakteristika bildirishnomalar yuborishi mumkinligini aytadi, lekin ularni yoqmaydi. Central CCCDga 0x0001 yozib, aniq obuna bo‘lishi kerak. Bu tayyor bo‘lmagan Centralga istalmagan ma’lumotlarni yuborishning oldini oladi.
Spetsifikatsiya deskriptorlar sonini cheklamaydi. Amalda, har bir xarakteristika odatda 1–3 ta deskriptorga ega: CCCD (Notify/Indicate bilan xarakteristikalar uchun), ixtiyoriy User Description va Presentation Format. Haddan tashqari ko‘p deskriptorlar GATT jadvalining hajmini oshiradi.
Aksariyat hollarda kerak emas. iOS va Androidda Core Bluetooth avtomatik ravishda Notify yoki Indicate xususiyatlariga ega xarakteristikalarga CCCD qo‘shadi. Maxsus deskriptorlar faqat maxsus metama’lumotlar uchun qo‘lda yaratiladi.
Yo‘q, CCCD qat’iy belgilangan format (uint16) va maqsadga ega — bildirishnomalarni boshqarish. Boshqa qiymatlarni yozish Bluetooth spetsifikatsiyasini buzadi va obunaning ishlamasligiga olib kelishi mumkin. Maxsus ma’lumotlar uchun 128-bit UUID bilan maxsus deskriptorlardan foydalaning.
User Description inson o‘qiy oladigan xarakteristika nomini o‘z ichiga oladi — masalan, UUID 0x2A6E o‘rniga “Korpus harorati”. Ilova bu nomni interfeysda ko‘rsatishi mumkin, bu esa BLE qurilmasi bilan o‘zaro aloqani qattiq kodlangan satrlarsiz foydalanuvchi uchun tushunarli qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.