Descriptor : qu'est-ce que c'est, Client Characteristic Configuration et exemples

Auteur : IT Sectr Publié le : 2026-07-15 Temps de lecture : 8 min

Descriptor est un attribut auxiliaire d'une caractéristique BLE qui fournit des métadonnées ou une configuration pour sa valeur. La Bluetooth Core Specification 5.4 définit les descripteurs comme une partie intégrante du profil GATT : ils décrivent les unités de mesure, les plages de valeurs, les noms textuels et gèrent l'abonnement aux notifications. Le descripteur le plus connu est le Client Characteristic Configuration Descriptor (CCCD, 0x2902), qui permet au Central de s'abonner aux notifications de la caractéristique. Selon Bluetooth SIG, 8 descripteurs standard sont spécifiés, et des descripteurs personnalisés peuvent être créés par le développeur pour toutes métadonnées supplémentaires.

Points clés

  • Descriptor — un attribut auxiliaire d'une caractéristique qui contient des métadonnées ou la configuration de la valeur.
  • CCCD (0x2902) — le descripteur le plus important : grâce à lui, le Central s'abonne aux notifications de changement de la caractéristique.
  • Les descripteurs standard incluent User Description (0x2901) pour le nom textuel et Presentation Format (0x2904) pour le format des données.
  • Chaque caractéristique peut avoir plusieurs descripteurs, mais pas plus d'un de chaque type standard.
  • Core Bluetooth crée automatiquement les descripteurs, mais ils peuvent être personnalisés pour des métadonnées spécifiques.

Qu'est-ce qu'un Descriptor en BLE ?

Descriptor est un attribut du protocole GATT qui se rattache à une Characteristic et fournit des informations supplémentaires sur sa valeur ou son mode d'utilisation. Dans la terminologie GATT, la caractéristique est la donnée, et le descripteur est la métadonnée de cette donnée.

Chaque Characteristic peut avoir zéro ou plusieurs descripteurs. Les descripteurs sont définis comme des attributs séparés dans la table GATT et ont leurs propres UUID 16 bits dans l'espace Bluetooth SIG. Les descripteurs ne peuvent pas exister indépendamment — ils sont toujours liés à une caractéristique spécifique.

Selon la Bluetooth Core Specification 5.4 (2023), les descripteurs sont divisés en deux catégories : standard (définis par Bluetooth SIG) et personnalisés (définis par le développeur). Les descripteurs standard ont des UUID dans la plage 0x2900–0x2908 et exécutent des fonctions strictement définies. Les descripteurs personnalisés utilisent des UUID 128 bits, similaires aux services et caractéristiques personnalisés.

Les descripteurs sont un mécanisme clé pour configurer le comportement d'une connexion BLE. Sans CCCD (0x2902), il est impossible de s'abonner aux notifications ; sans Presentation Format (0x2904), le Central ne saura pas comment interpréter les octets bruts de la caractéristique.

Client Characteristic Configuration Descriptor (CCCD)

CCCD avec l'UUID 0x2902 est le descripteur le plus important et le plus utilisé en BLE. Il gère l'abonnement du Central aux notifications Notify et Indicate de la caractéristique. Sans écriture dans le CCCD, la caractéristique n'enverra pas de notifications, même si elle possède la propriété Notify.

CCCD est une valeur 16 bits où le bit de poids faible (0x0001) active Notify, et le second bit (0x0002) active Indicate. Le Central écrit la valeur souhaitée dans le CCCD, s'abonnant ainsi aux notifications. Si le Central écrit 0x0000 — l'abonnement est annulé.

Le mécanisme du CCCD fonctionne ainsi : lorsque le Central découvre une caractéristique prenant en charge Notify, il trouve son descripteur CCCD et écrit 0x0001. Ensuite, chaque fois que le Peripheral met à jour la valeur de la caractéristique, elle est automatiquement envoyée au Central abonné via Handle Value Notification (sans demande du Central).

Selon le Apple Core Bluetooth Programming Guide, le CCCD est géré automatiquement par le système lors de l'appel à setNotifyValue pour une caractéristique. Le développeur n'a pas besoin de chercher et d'écrire manuellement le CCCD — Core Bluetooth le fait automatiquement lors de l'activation des notifications.

Abonnement programmatique aux notifications

Sous iOS, l'abonnement se fait via la méthode setNotifyValue sur l'objet CBPeripheral.

swift
import CoreBluetooth

// S'abonner aux notifications de la caractéristique
peripheral.setNotifyValue(true, for: characteristic)

// Le délégué reçoit les valeurs mises à jour
func peripheral(
    _ peripheral: CBPeripheral,
    didUpdateValueFor characteristic: CBCharacteristic,
    error: Error?
) {
    // characteristic.value contient de nouvelles données
    guard let data = characteristic.value else { return }
}

Sous Android, l'abonnement aux notifications se fait via BluetoothGatt.setCharacteristicNotification. Le développeur doit également écrire manuellement la valeur 0x0001 dans le CCCD.

java
import android.bluetooth.*;

// Activer les notifications
bluetoothGatt.setCharacteristicNotification(characteristic, true);

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

Descripteurs standard Bluetooth SIG

Bluetooth SIG a défini 8 descripteurs standard pour les tâches courantes de configuration des caractéristiques. Chaque descripteur a un UUID et un format de valeur strictement définis.

UUIDNom du descripteurObjectifType de valeur
0x2900Characteristic Extended PropertiesPropriétés supplémentaires de la caractéristiqueuint16 (masque de bits)
0x2901Characteristic User DescriptionNom textuel de la caractéristiqueChaîne UTF-8
0x2902Client Characteristic ConfigurationGestion des notificationsuint16
0x2903Server Characteristic ConfigurationConfiguration serveur pour broadcastuint16
0x2904Characteristic Presentation FormatFormat de présentation des donnéesStructure (7 octets)
0x2905Characteristic Aggregate FormatCombinaison de plusieurs caractéristiquesListe d'UUID
0x2906Valid RangePlage de valeurs validesuint16 × 2 (min, max)
0x2907External Report ReferenceRéférence de rapport externeuint16
0x2908Report ReferenceRéférence de rapport interneuint8 + uint16

Characteristic User Description (0x2901) est particulièrement utile pour l'interface utilisateur : il contient un nom lisible de la caractéristique qui peut être affiché dans l'interface de l'application. Par exemple, une caractéristique Battery Level peut avoir un descripteur User Description avec la valeur « Niveau de charge de la batterie ».

Characteristic Presentation Format (0x2904) contient des informations sur la façon d'interpréter la valeur de la caractéristique : format (uint8, uint16, float), exposant, unité de mesure (via UUID du registre Bluetooth SIG), espace de noms et description. Par exemple, la température peut être un int16 avec exposant -2 (valeur de division 0,01 °C) et l'unité de mesure « degré Celsius ».

Utiliser les Descriptors sous iOS et Android

L'accès aux descripteurs diffère sous iOS et Android. Core Bluetooth gère automatiquement le CCCD lorsque les notifications sont activées, tandis qu'Android nécessite une écriture manuelle de la valeur dans le descripteur. Examinons les deux approches.

iOS : Gestion automatique du CCCD

Sous iOS, le développeur n'interagit généralement pas directement avec les descripteurs. Core Bluetooth trouve automatiquement le CCCD et écrit la valeur requise lors de l'appel à setNotifyValue. Pour lire les descripteurs, on utilise la méthode discoverDescriptors.

swift
// Découvrir les descripteurs
peripheral.discoverDescriptors(for: characteristic)

// Lire la valeur de 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 : Gestion manuelle du CCCD

Sous Android, le développeur doit trouver le descripteur CCCD de la caractéristique et écrire la valeur pour activer les notifications. Il s'agit d'une étape supplémentaire par rapport à iOS.

java
// Lire la valeur du descripteur User Description
BluetoothGattDescriptor userDesc = characteristic
    .getDescriptor(
        UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
    );

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

Création de descripteurs personnalisés

Les descripteurs personnalisés sont utilisés lorsque les descripteurs standard Bluetooth SIG ne suffisent pas. Par exemple, un fabricant de capteurs médicaux peut ajouter un descripteur avec des informations d'étalonnage du capteur ou un descripteur avec un journal d'erreurs.

Un descripteur personnalisé est créé avec un UUID 128 bits, comme une caractéristique personnalisée. Côté Peripheral, le développeur l'ajoute à la caractéristique via l'API appropriée. Côté Central, le descripteur est découvert automatiquement lors de l'appel à discoverDescriptors.

Lors de la création d'un descripteur personnalisé, suivez ces règles : la longueur de la valeur doit correspondre au type de données attendu, et les droits d'accès (lecture/écriture) doivent être explicitement spécifiés. N'utilisez pas d'UUID de la plage des descripteurs standard Bluetooth SIG (0x2900–0x2908) à des fins personnalisées.

Différence entre Descriptor et Characteristic

Caractéristique et descripteur sont des niveaux différents d'attributs GATT. Une caractéristique est un point de données, tandis qu'un descripteur est ses métadonnées ou sa configuration. La différence se manifeste à plusieurs égards : l'objectif, l'UUID et les règles d'accès.

Une caractéristique a une déclaration obligatoire qui est toujours présente dans la table GATT. Un descripteur est facultatif — une caractéristique peut n'avoir aucun descripteur. Une caractéristique peut être lue, écrite ou envoyer des notifications indépendamment. Un descripteur est toujours lié à une caractéristique et n'existe pas séparément.

Selon la Bluetooth Core Specification 5.4, l'ordre des attributs dans la table GATT est le suivant : déclaration de service, déclaration de caractéristique, valeur de caractéristique, descripteurs de caractéristique (le cas échéant), puis le service suivant. Cet ordre est obligatoire pour le bon fonctionnement des clients GATT.

Foire aux questions

Pourquoi le CCCD est-il nécessaire si la caractéristique a déjà la propriété Notify ?

CCCD est nécessaire pour la gestion des abonnements : la propriété Notify indique seulement que la caractéristique peut envoyer des notifications, mais ne les active pas. Le Central doit s'abonner explicitement en écrivant 0x0001 dans le CCCD. Cela évite l'envoi non désiré de données à un Central non préparé.

Combien de descripteurs une seule caractéristique peut-elle avoir ?

La spécification ne limite pas le nombre de descripteurs. En pratique, chaque caractéristique a généralement 1 à 3 descripteurs : CCCD (pour les caractéristiques avec Notify/Indicate), éventuellement User Description et Presentation Format. Trop de descripteurs augmentent la taille de la table GATT.

Dois-je créer manuellement des descripteurs sur le Peripheral ?

Dans la plupart des cas, non. Core Bluetooth sur iOS et Android ajoute automatiquement CCCD aux caractéristiques qui ont les propriétés Notify ou Indicate. Les descripteurs personnalisés sont créés manuellement uniquement pour des métadonnées spécifiques.

Puis-je écrire des données personnalisées dans le CCCD ?

Non, le CCCD a un format (uint16) et un objectif strictement définis — la gestion des notifications. L'écriture d'autres valeurs viole la spécification Bluetooth et peut entraîner l'arrêt du fonctionnement de l'abonnement. Pour les données personnalisées, utilisez des descripteurs personnalisés avec un UUID 128 bits.

En quoi Characteristic User Description est-il utile pour une application ?

La User Description contient un nom lisible de la caractéristique — par exemple, « Température de l'appareil » au lieu de l'UUID 0x2A6E. L'application peut afficher ce nom dans l'interface, rendant l'interaction avec le périphérique BLE compréhensible pour l'utilisateur sans chaînes codées en dur.

Résumé

  • Descriptor — un attribut GATT auxiliaire attaché à une caractéristique pour stocker des métadonnées ou une configuration.
  • CCCD (0x2902) — le descripteur clé qui gère l'abonnement du Central aux notifications et aux indications de la caractéristique.
  • Bluetooth SIG a spécifié 8 descripteurs standard (0x2900–0x2908) pour les tâches courantes — description, formatage et configuration.
  • Sous iOS, le CCCD est géré automatiquement ; sous Android, l'écriture manuelle de la valeur 0x0001 est requise pour activer les notifications.
  • Les descripteurs personnalisés sont créés avec un UUID 128 bits pour des métadonnées uniques non couvertes par les descripteurs standard.
  • Les descripteurs n'existent pas indépendamment — ils sont toujours liés à une caractéristique et la suivent dans la table GATT.
  • Une utilisation correcte des descripteurs garantit une configuration correcte de la connexion BLE et la clarté des données pour l'application.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi