Descriptor: cos'è, Client Characteristic Configuration ed esempi

Autore: IT Sectr Pubblicato: 2026-07-15 Tempo di lettura: 8 min

Descriptor è un attributo ausiliario di una caratteristica BLE che fornisce metadati o configurazione per il suo valore. La Bluetooth Core Specification 5.4 definisce i descrittori come parte integrante del profilo GATT: descrivono unità di misura, intervalli di valori, nomi testuali e gestiscono l'abbonamento alle notifiche. Il descrittore più noto è il Client Characteristic Configuration Descriptor (CCCD, 0x2902), che consente al Central di abbonarsi alle notifiche della caratteristica. Secondo Bluetooth SIG, sono specificati 8 descrittori standard e i descrittori personalizzati possono essere creati dallo sviluppatore per qualsiasi metadato aggiuntivo.

Punti chiave

  • Descriptor — un attributo ausiliario di una caratteristica che contiene metadati o configurazione del valore.
  • CCCD (0x2902) — il descrittore più importante: attraverso di esso, il Central si abbona alle notifiche di cambiamento della caratteristica.
  • I descrittori standard includono User Description (0x2901) per il nome testuale e Presentation Format (0x2904) per il formato dei dati.
  • Ogni caratteristica può avere più descrittori, ma non più di uno per ogni tipo standard.
  • Core Bluetooth crea automaticamente i descrittori, ma possono essere personalizzati per metadati specifici.

Cos'è un Descriptor in BLE?

Descriptor è un attributo del protocollo GATT che si collega a una Characteristic e fornisce informazioni aggiuntive sul suo valore o modalità d'uso. Nella terminologia GATT, la caratteristica sono i dati, e il descrittore sono i metadati di quei dati.

Ogni Characteristic può avere zero o più descrittori. I descrittori sono definiti come attributi separati nella tabella GATT e hanno i propri UUID a 16 bit nello spazio Bluetooth SIG. I descrittori non possono esistere indipendentemente — sono sempre legati a una caratteristica specifica.

Secondo la Bluetooth Core Specification 5.4 (2023), i descrittori sono divisi in due categorie: standard (definiti da Bluetooth SIG) e personalizzati (definiti dallo sviluppatore). I descrittori standard hanno UUID nell'intervallo 0x2900–0x2908 e svolgono funzioni strettamente definite. I descrittori personalizzati utilizzano UUID a 128 bit, simili a servizi e caratteristiche personalizzati.

I descrittori sono un meccanismo chiave per configurare il comportamento di una connessione BLE. Senza CCCD (0x2902) è impossibile abbonarsi alle notifiche, senza Presentation Format (0x2904) il Central non saprà come interpretare i byte grezzi della caratteristica.

Client Characteristic Configuration Descriptor (CCCD)

CCCD con UUID 0x2902 è il descrittore più importante e ampiamente utilizzato in BLE. Gestisce l'abbonamento del Central alle notifiche Notify e Indicate della caratteristica. Senza scrivere nel CCCD, la caratteristica non invierà notifiche, anche se ha la proprietà Notify.

CCCD è un valore a 16 bit dove il bit meno significativo (0x0001) abilita Notify e il secondo bit (0x0002) abilita Indicate. Il Central scrive il valore desiderato nel CCCD, abbonandosi così alle notifiche. Se il Central scrive 0x0000 — l'abbonamento viene annullato.

Il meccanismo CCCD funziona così: quando il Central scopre una caratteristica che supporta Notify, trova il suo descrittore CCCD e scrive 0x0001. Dopodiché, ogni volta che il Peripheral aggiorna il valore della caratteristica, viene automaticamente inviato al Central abbonato tramite Handle Value Notification (senza richiesta dal Central).

Secondo la Apple Core Bluetooth Programming Guide, CCCD viene gestito automaticamente dal sistema quando si chiama setNotifyValue per una caratteristica. Lo sviluppatore non deve cercare e scrivere manualmente CCCD — Core Bluetooth lo fa automaticamente all'attivazione delle notifiche.

Abbonamento programmatico alle notifiche

In iOS, l'abbonamento avviene tramite il metodo setNotifyValue sull'oggetto CBPeripheral.

swift
import CoreBluetooth

// Abbonati alle notifiche della caratteristica
peripheral.setNotifyValue(true, for: characteristic)

// Il delegato riceve i valori aggiornati
func peripheral(
    _ peripheral: CBPeripheral,
    didUpdateValueFor characteristic: CBCharacteristic,
    error: Error?
) {
    // characteristic.value ha nuovi dati
    guard let data = characteristic.value else { return }
}

Su Android, l'abbonamento alle notifiche avviene tramite BluetoothGatt.setCharacteristicNotification. Lo sviluppatore deve anche scrivere manualmente il valore 0x0001 in CCCD.

java
import android.bluetooth.*;

// Attiva notifiche
bluetoothGatt.setCharacteristicNotification(characteristic, true);

// Scrivi 0x0001 in CCCD
BluetoothGattDescriptor descriptor = characteristic
    .getDescriptor(
        UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
    );
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);

Descrittori standard Bluetooth SIG

Bluetooth SIG ha definito 8 descrittori standard per attività comuni di configurazione delle caratteristiche. Ogni descrittore ha un UUID e un formato di valore strettamente definiti.

UUIDNome del descrittoreScopoTipo di valore
0x2900Characteristic Extended PropertiesProprietà aggiuntive della caratteristicauint16 (maschera di bit)
0x2901Characteristic User DescriptionNome testuale della caratteristicaStringa UTF-8
0x2902Client Characteristic ConfigurationGestione notificheuint16
0x2903Server Characteristic ConfigurationConfigurazione server per broadcastuint16
0x2904Characteristic Presentation FormatFormato di presentazione dei datiStruttura (7 byte)
0x2905Characteristic Aggregate FormatCombinazione di più caratteristicheElenco di UUID
0x2906Valid RangeIntervallo di valori validiuint16 × 2 (min, max)
0x2907External Report ReferenceRiferimento a report esternouint16
0x2908Report ReferenceRiferimento a report internouint8 + uint16

Characteristic User Description (0x2901) è particolarmente utile per l'interfaccia utente: contiene un nome leggibile della caratteristica che può essere visualizzato nell'interfaccia dell'applicazione. Ad esempio, una caratteristica Battery Level può avere un descrittore User Description con il valore “Livello di carica della batteria”.

Characteristic Presentation Format (0x2904) contiene informazioni su come interpretare il valore della caratteristica: formato (uint8, uint16, float), esponente, unità di misura (tramite UUID dal registro Bluetooth SIG), namespace e descrizione. Ad esempio, la temperatura può essere un int16 con esponente -2 (valore di divisione 0,01°C) e unità di misura “grado Celsius”.

Come usare i Descriptor in iOS e Android

L'accesso ai descrittori differisce su iOS e Android. Core Bluetooth gestisce automaticamente CCCD quando le notifiche sono attivate, mentre Android richiede la scrittura manuale del valore nel descrittore. Esaminiamo entrambi gli approcci.

iOS: Gestione automatica di CCCD

In iOS, lo sviluppatore di solito non interagisce direttamente con i descrittori. Core Bluetooth trova automaticamente CCCD e scrive il valore richiesto quando viene chiamato setNotifyValue. Per leggere i descrittori si usa il metodo discoverDescriptors.

swift
// Scopri descrittori
peripheral.discoverDescriptors(for: characteristic)

// Leggi il valore di 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: Gestione manuale di CCCD

Su Android, lo sviluppatore deve trovare il descrittore CCCD della caratteristica e scrivere il valore per attivare le notifiche. Questo è un passaggio aggiuntivo rispetto a iOS.

java
// Leggi il valore del descrittore User Description
BluetoothGattDescriptor userDesc = characteristic
    .getDescriptor(
        UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
    );

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

Creazione di descrittori personalizzati

I descrittori personalizzati vengono utilizzati quando i descrittori standard Bluetooth SIG non sono sufficienti. Ad esempio, un produttore di sensori medici potrebbe aggiungere un descrittore con informazioni di calibrazione del sensore o un descrittore con un registro errori.

Un descrittore personalizzato viene creato con un UUID a 128 bit, simile a una caratteristica personalizzata. Sul lato Peripheral, lo sviluppatore lo aggiunge alla caratteristica tramite l'API appropriata. Sul lato Central, il descrittore viene scoperto automaticamente quando si chiama discoverDescriptors.

Quando si crea un descrittore personalizzato, seguire queste regole: la lunghezza del valore deve corrispondere al tipo di dati previsto e i diritti di accesso (lettura/scrittura) devono essere specificati esplicitamente. Non utilizzare UUID dell'intervallo dei descrittori standard Bluetooth SIG (0x2900–0x2908) per scopi personalizzati.

Differenza tra Descriptor e Characteristic

Caratteristica e descrittore sono diversi livelli di attributi GATT. Una caratteristica è un punto dati, mentre un descrittore sono i suoi metadati o configurazione. La differenza si manifesta in diversi aspetti: scopo, UUID e regole di accesso.

Una caratteristica ha una dichiarazione obbligatoria che è sempre presente nella tabella GATT. Un descrittore è opzionale — una caratteristica può non avere descrittori. Una caratteristica può essere letta, scritta o inviare notifiche indipendentemente. Un descrittore è sempre legato a una caratteristica e non esiste separatamente.

Secondo la Bluetooth Core Specification 5.4, l'ordine degli attributi nella tabella GATT è il seguente: dichiarazione del servizio, dichiarazione della caratteristica, valore della caratteristica, descrittori della caratteristica (se presenti), poi il servizio successivo. Questo ordine è obbligatorio per il corretto funzionamento dei client GATT.

Domande frequenti

Perché serve CCCD se la caratteristica ha già la proprietà Notify?

CCCD è necessario per la gestione degli abbonamenti: la proprietà Notify indica solo che la caratteristica può inviare notifiche, ma non le attiva. Il Central deve abbonarsi esplicitamente scrivendo 0x0001 in CCCD. Ciò impedisce l'invio indesiderato di dati a un Central non preparato.

Quanti descrittori può avere una singola caratteristica?

La specifica non limita il numero di descrittori. In pratica, ogni caratteristica ha solitamente 1–3 descrittori: CCCD (per caratteristiche con Notify/Indicate), facoltativamente User Description e Presentation Format. Troppi descrittori aumentano la dimensione della tabella GATT.

Devo creare manualmente i descrittori sul Peripheral?

Nella maggior parte dei casi, no. Core Bluetooth su iOS e Android aggiunge automaticamente CCCD alle caratteristiche che hanno proprietà Notify o Indicate. I descrittori personalizzati vengono creati manualmente solo per metadati specifici.

Posso scrivere dati personalizzati in CCCD?

No, CCCD ha un formato (uint16) e uno scopo strettamente definiti — la gestione delle notifiche. Scrivere altri valori viola la specifica Bluetooth e può causare il malfunzionamento dell'abbonamento. Per dati personalizzati, utilizzare descrittori personalizzati con UUID a 128 bit.

Come è utile Characteristic User Description per un'applicazione?

La User Description contiene un nome leggibile della caratteristica — ad esempio, “Temperatura del dispositivo” invece dell'UUID 0x2A6E. L'applicazione può visualizzare questo nome nell'interfaccia, rendendo l'interazione con il dispositivo BLE comprensibile per l'utente senza stringhe codificate.

Riepilogo

  • Descriptor — un attributo GATT ausiliario collegato a una caratteristica per memorizzare metadati o configurazione.
  • CCCD (0x2902) — il descrittore chiave che gestisce l'abbonamento del Central a notifiche e indicazioni della caratteristica.
  • Bluetooth SIG ha specificato 8 descrittori standard (0x2900–0x2908) per attività comuni — descrizione, formattazione e configurazione.
  • In iOS, CCCD è gestito automaticamente; su Android, è richiesta la scrittura manuale del valore 0x0001 per attivare le notifiche.
  • I descrittori personalizzati vengono creati con UUID a 128 bit per metadati unici non coperti dai descrittori standard.
  • I descrittori non esistono indipendentemente — sono sempre legati a una caratteristica e la seguono nella tabella GATT.
  • L'uso corretto dei descrittori garantisce la corretta configurazione della connessione BLE e la chiarezza dei dati per l'applicazione.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche