Дескриптор: шта је, Client Characteristic Configuration и примери

Аутор: IT Sectr Објављено: 2026-07-15 Време читања: 8 мин

Дескриптор — је помоћни атрибут BLE карактеристике који пружа метаподатке или конфигурацију за њену вредност. Bluetooth Core Specification 5.4 дефинише дескрипторе као саставни део GATT профила: они описују јединице мере, опсеге вредности, текстуална имена и управљају претплатом на обавештења. Најпознатији дескриптор је Client Characteristic Configuration Descriptor (CCCD, 0x2902) који омогућава Central-у да се претплати на обавештења од карактеристике. Према Bluetooth SIG-у, спецификовано је 8 стандардних дескриптора, а прилагођени дескриптори могу бити креирани од стране програмера за било које додатне метаподатке.

Главно

  • Дескриптор — помоћни атрибут карактеристике који садржи метаподатке или конфигурацију вредности.
  • CCCD (0x2902) — најважнији дескриптор: преко њега Central се претплаћује на обавештења о промени карактеристике.
  • Стандардни дескриптори укључују User Description (0x2901) за текстуално име и Presentation Format (0x2904) за формат података.
  • Свака карактеристика може имати више дескриптора, али не више од једног сваког стандардног типа.
  • Дескриптори се аутоматски креирају у Core Bluetooth, али могу бити прилагођени за специфичне метаподатке.

Шта је дескриптор у BLE-у?

Дескриптор — је атрибут GATT протокола који се прикачује на карактеристику и пружа додатне информације о њеној вредности или начину коришћења. У терминологији GATT-а, карактеристика је податак, а дескриптор је метаподатак тих података.

Свака карактеристика може имати нулу или више дескриптора. Дескриптори су дефинисани као засебни атрибути у GATT табели и имају сопствене 16-битне UUID у простору Bluetooth SIG-а. Дескриптори не могу постојати самостално — увек су везани за одређену карактеристику.

Према Bluetooth Core Specification 5.4 (2023), дескриптори се деле на двије категорије: стандардне (одређене од стране Bluetooth SIG-а) и прилагођене (које дефинише програмер). Стандардни дескриптори имају UUID у опсегу 0x2900–0x2908 и обављају строго одређене функције. Прилагођени дескриптори користе 128-битне UUID, као и прилагођени сервиси и карактеристике.

Дескриптори су кључни механизам за конфигурацију понашања BLE везе. Без CCCD (0x2902) не можете да се претплатите на обавештења, без Presentation Format (0x2904) Central неће знати како да тумачи сирове бајтове карактеристике.

Client Characteristic Configuration Descriptor (CCCD)

CCCD са UUID 0x2902 је најважнији и најшире коришћени дескриптор у BLE-у. Он управља претплатом Central-а на обавештења (Notify) и потврђена обавештења (Indicate) од карактеристике. Без уписа у CCCD, карактеристика неће слати обавештења, чак и ако има својство Notify.

CCCD је 16-битна вредност у којој најмањи бит (0x0001) укључује Notify, а други бит (0x0002) укључује Indicate. Central уписује потребну вредност у CCCD, чиме се претплаћује на обавештења. Ако Central упише 0x0000 — претплата се отказује.

Механизам рада CCCD-а је сљедећи: када Central открије карактеристику са подршком за Notify, проналази њен CCCD дескриптор и уписује 0x0001. Након тога, сваки пут када Peripheral ажурира вредност карактеристике, она се аутоматски шаље претплаћеном Central-у путем Handle Value Notification (без захтјева од Central-а).

Према Apple Core Bluetooth Programming Guide, CCCD-ом аутоматски управља систем при позиву setNotifyValue за карактеристику. Програмер не мора ручно да тражи и уписује CCCD — Core Bluetooth то ради аутоматски при активацији обавештења.

Програмско претплаћивање на обавештења

У iOS-у, претплаћивање се врши путем методе setNotifyValue на објекту CBPeripheral.

swift
import CoreBluetooth

// Претплати се на обавештења карактеристике
peripheral.setNotifyValue(true, for: characteristic)

// Delegate прима ажуриране вриједности
func peripheral(
    _ peripheral: CBPeripheral,
    didUpdateValueFor characteristic: CBCharacteristic,
    error: Error?
) {
    // characteristic.value има нове податке
    guard let data = characteristic.value else { return }
}

На Android-у, претплаћивање на обавештења се врши путем BluetoothGatt.setCharacteristicNotification. Програмер такође мора ручно да упише вриједност 0x0001 у CCCD.

java
import android.bluetooth.*;

// Укључи обавештења
bluetoothGatt.setCharacteristicNotification(characteristic, true);

// Упиши 0x0001 у CCCD
BluetoothGattDescriptor descriptor = characteristic
    .getDescriptor(
        UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
    );
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);

Стандардни дескриптори Bluetooth SIG-а

Bluetooth SIG је дефинисао 8 стандардних дескриптора за уобичајене задатке конфигурације карактеристика. Сваки дескриптор има строго дефинисан UUID и формат вриједности.

UUIDИме дескриптораНаменаТип вриједности
0x2900Characteristic Extended PropertiesДодатне карактеристике карактеристикеuint16 (битна маска)
0x2901Characteristic User DescriptionТекстуално име карактеристикеUTF-8 низ
0x2902Client Characteristic ConfigurationУправљање обавјештењимаuint16
0x2903Server Characteristic ConfigurationКонфигурација сервера за broadcastuint16
0x2904Characteristic Presentation FormatФормат презентације податакаСтруктура (7 бајтова)
0x2905Characteristic Aggregate FormatОбједињавање више карактеристикаЛиста UUID-а
0x2906Valid RangeОпсег дозвољених вриједностиuint16 × 2 (min, max)
0x2907External Report ReferenceРеференца ка спољашњем извјештајуuint16
0x2908Report ReferenceРеференца ка унутрашњем извјештајуuint8 + uint16

Characteristic User Description (0x2901) је посебно користан за UI: садржи људски читљиво име карактеристике које се може приказати у корисничком интерфејсу апликације. На примјер, карактеристика Battery Level може имати дескриптор User Description са вриједношћу „Ниво напуњености батерије“.

Characteristic Presentation Format (0x2904) садржи информације о томе како тумачити вриједност карактеристике: формат (uint8, uint16, float), експонент, јединица мере (путем UUID-а из регистра Bluetooth SIG-а), именски простор и опис. На примјер, температура може бити int16 са експонентом -2 (вриједност подјеле 0.01°C) и јединицом мере „степен Целзијуса“.

Како користити дескриптор у iOS-у и Android-у

Приступ дескрипторима се разликује на iOS-у и Android-у. Core Bluetooth аутоматски управља CCCD-ом при укључивању обавештења, а Android захтијева ручно уписана вриједност у дескриптор. Размотримо оба приступа.

iOS: аутоматско управљање CCCD-ом

У iOS-у, програмер обично не интерагује директно са дескрипторима. Core Bluetooth аутоматски проналази CCCD и уписује потребну вриједност при позиву setNotifyValue. За читање дескриптора користи се метода discoverDescriptors.

swift
// Откриј дескрипторе
peripheral.discoverDescriptors(for: characteristic)

// Прочитај вриједност User Description
func peripheral(
    _ peripheral: CBPeripheral,
    didDiscoverDescriptorsFor characteristic: CBCharacteristic,
    error: Error?
) {
    for descriptor in characteristic.descriptors ?? [] {
        if descriptor.uuid == CBUUID("2901") {
            peripheral.readValue(for: descriptor)
        }
    }
}

Android: ручно управљање CCCD-ом

На Android-у, програмер мора сам да пронађе CCCD дескриптор карактеристике и упише вриједност за укључивање обавештења. Ово је додатни корак у поређењу са iOS-ом.

java
// Прочитај вриједност дескриптора User Description
BluetoothGattDescriptor userDesc = characteristic
    .getDescriptor(
        UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
    );

if (userDesc != null) {
    bluetoothGatt.readDescriptor(userDesc);
}

Креирање прилагођених дескриптора

Прилагођени дескриптори се користе када стандардни дескриптори Bluetooth SIG-а нису довољни. На примјер, произвођач медицинског сензора може додати дескриптор са информацијама о калибрацији сензора или дескриптор са евиденцијом грешака.

Прилагођени дескриптор се креира са 128-битним UUID, као и прилагођена карактеристика. На страни Peripheral-а, програмер га додаје карактеристици путем одговарајућег API-ја. На страни Central-а, дескриптор се аутоматски открива при позиву discoverDescriptors.

При креирању прилагођеног дескриптора поштујте правила: дужина вриједности мора одговарати очекиваном типу података, права приступа (read/write) морају бити јасно наведена. Не користите UUID-ове из опсега стандардних дескриптора Bluetooth SIG-а (0x2900–0x2908) за прилагођене сврхе.

Разлика између дескриптора и карактеристике

Карактеристика и дескриптор су различити нивои GATT атрибута. Карактеристика је тачка података, а дескриптор је њен метаподатак или конфигурација. Разлика се манифестује у неколико аспеката: намјени, UUID-а и правилима приступа.

Карактеристика има обавезну декларацију (declaration) која се увијек налази у GATT табели. Дескриптор је опционалан — карактеристика може да нема дескриптора. Карактеристика може бити прочитана, записана или слати обавештења независно. Дескриптор је увијек везан за карактеристику и не постоји одвојено.

Према Bluetooth Core Specification 5.4, у GATT табели редослијед атрибута је сљедећи: декларација сервиса, декларација карактеристике, вриједност карактеристике, дескриптори карактеристике (ако има), затим сљедећи сервис. Овај редослијед је обавезан за исправан рад GATT клијената.

Често постављана питања

Зашто је CCCD потребан ако карактеристика има својство Notify?

CCCD је потребан за управљање претплатом: својство Notify само каже да карактеристика може да шаље обавештења, али их не укључује. Central мора експлицитно да се претплати, уписујући 0x0001 у CCCD. Ово спречава нежељено слање података неприпремљеном Central-у.

Колико дескриптора може имати једна карактеристика?

Спецификација не ограничава број дескриптора. У пракси, свака карактеристика обично има 1–3 дескриптора: CCCD (за карактеристике са Notify/Indicate), опционално User Description и Presentation Format. Превише дескриптора повећава величину GATT табеле.

Да ли је потребно ручно креирати дескрипторе на Peripheral-у?

У већини случајева није. Core Bluetooth на iOS-у и Android-у аутоматски додаје CCCD карактеристикама које имају својства Notify или Indicate. Прилагођени дескриптори се креирају ручно само за специфичне метаподатке.

Могу ли да упишем прилагођене податке у CCCD?

Не, CCCD има строго дефинисан формат (uint16) и намјену — управљање обавјештењима. Уписивање других вриједности крши Bluetooth спецификацију и може да проузрокује неисправан рад претплате. За прилагођене податке користите прилагођене дескрипторе са 128-битним UUID.

Како је Characteristic User Description користан за апликацију?

User Description садржи људски читљиво име карактеристике — на примјер, „Температура кућишта“ умјесто UUID 0x2A6E. Апликација може да прикаже ово име у интерфејсу, чинећи интеракцију са BLE уређајем разумљивом за корисника без чврсто кодираних низова.

Закључак

  • Дескриптор — помоћни GATT атрибут прикачен за карактеристику за чување метаподатака или конфигурације.
  • CCCD (0x2902) — кључни дескриптор који управља претплатом Central-а на обавештења и потврђена обавештења карактеристике.
  • Bluetooth SIG је спецификовао 8 стандардних дескриптора (0x2900–0x2908) за типичне задатке — опис, форматирање и конфигурацију.
  • У iOS-у CCCD-ом се управља аутоматски, на Android-у је потребно ручно уписана вриједност 0x0001 за укључивање обавештења.
  • Прилагођени дескриптори се креирају са 128-битним UUID за јединствене метаподатке који нису покривени стандардним дескрипторима.
  • Дескриптори не постоје самостално — увек су везани за карактеристику и иду за њом у GATT табели.
  • Исправно коришћење дескриптора обезбјеђује исправну конфигурацију BLE везе и разумљивост података за апликацију.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође