Descriptor ist ein Hilfsattribut einer BLE-Charakteristik, das Metadaten oder Konfiguration für ihren Wert bereitstellt. Die Bluetooth Core Specification 5.4 definiert Deskriptoren als integralen Bestandteil des GATT-Profils: Sie beschreiben Maßeinheiten, Wertebereiche, Textnamen und verwalten das Abonnement von Benachrichtigungen. Der bekannteste Deskriptor ist der Client Characteristic Configuration Descriptor (CCCD, 0x2902), der es dem Central ermöglicht, Benachrichtigungen von der Charakteristik zu abonnieren. Laut Bluetooth SIG sind 8 Standarddeskriptoren spezifiziert, und benutzerdefinierte Deskriptoren können vom Entwickler für beliebige zusätzliche Metadaten erstellt werden.
Wichtige Punkte
Descriptor ist ein Attribut des GATT-Protokolls, das an eine Characteristic angehängt wird und zusätzliche Informationen über ihren Wert oder ihre Verwendung bereitstellt. In der GATT-Terminologie ist die Charakteristik die Daten, und der Deskriptor sind die Metadaten dieser Daten.
Jede Characteristic kann null oder mehr Deskriptoren haben. Deskriptoren werden als separate Attribute in der GATT-Tabelle definiert und haben ihre eigenen 16-Bit-UUIDs im Bluetooth-SIG-Raum. Deskriptoren können nicht unabhängig existieren — sie sind immer an eine bestimmte Charakteristik gebunden.
Laut der Bluetooth Core Specification 5.4 (2023) werden Deskriptoren in zwei Kategorien unterteilt: Standard (von Bluetooth SIG definiert) und benutzerdefiniert (vom Entwickler definiert). Standarddeskriptoren haben UUIDs im Bereich 0x2900–0x2908 und führen streng definierte Funktionen aus. Benutzerdefinierte Deskriptoren verwenden 128-Bit-UUIDs, ähnlich wie benutzerdefinierte Dienste und Charakteristiken.
Deskriptoren sind ein Schlüsselmechanismus zur Konfiguration des Verhaltens einer BLE-Verbindung. Ohne CCCD (0x2902) ist es unmöglich, Benachrichtigungen zu abonnieren, ohne Presentation Format (0x2904) weiß der Central nicht, wie er die Rohbytes der Charakteristik interpretieren soll.
CCCD mit UUID 0x2902 ist der wichtigste und am weitesten verbreitete Deskriptor in BLE. Er verwaltet das Abonnement des Central für Notify und Indicate der Charakteristik. Ohne Schreiben in das CCCD sendet die Charakteristik keine Benachrichtigungen, selbst wenn sie die Notify-Eigenschaft besitzt.
CCCD ist ein 16-Bit-Wert, bei dem das niederwertigste Bit (0x0001) Notify aktiviert und das zweite Bit (0x0002) Indicate aktiviert. Der Central schreibt den gewünschten Wert in das CCCD und abonniert damit Benachrichtigungen. Wenn der Central 0x0000 schreibt — wird das Abonnement gekündigt.
Der CCCD-Mechanismus funktioniert wie folgt: Wenn der Central eine Charakteristik entdeckt, die Notify unterstützt, findet er ihren CCCD-Deskriptor und schreibt 0x0001. Danach wird jedes Mal, wenn das Peripheral den Charakteristikwert aktualisiert, dieser automatisch an den abonnierten Central über Handle Value Notification gesendet (ohne Anfrage vom Central).
Laut dem Apple Core Bluetooth Programming Guide wird CCCD automatisch vom System verwaltet, wenn setNotifyValue für eine Charakteristik aufgerufen wird. Der Entwickler muss CCCD nicht manuell suchen und beschreiben — Core Bluetooth erledigt dies automatisch, wenn Benachrichtigungen aktiviert werden.
In iOS erfolgt das Abonnieren über die Methode setNotifyValue auf dem CBPeripheral-Objekt.
import CoreBluetooth
// Charakteristikbenachrichtigungen abonnieren
peripheral.setNotifyValue(true, for: characteristic)
// Delegate empfängt aktualisierte Werte
func peripheral(
_ peripheral: CBPeripheral,
didUpdateValueFor characteristic: CBCharacteristic,
error: Error?
) {
// characteristic.value hat neue Daten
guard let data = characteristic.value else { return }
}
Auf Android erfolgt das Abonnieren von Benachrichtigungen über BluetoothGatt.setCharacteristicNotification. Der Entwickler muss außerdem manuell den Wert 0x0001 in das CCCD schreiben.
import android.bluetooth.*;
// Benachrichtigungen aktivieren
bluetoothGatt.setCharacteristicNotification(characteristic, true);
// 0x0001 in CCCD schreiben
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
Bluetooth SIG hat 8 Standarddeskriptoren für allgemeine Konfigurationsaufgaben von Charakteristiken definiert. Jeder Deskriptor hat eine streng definierte UUID und ein Wertformat.
| UUID | Deskriptorname | Zweck | Werttyp |
|---|---|---|---|
| 0x2900 | Characteristic Extended Properties | Zusätzliche Eigenschaften der Charakteristik | uint16 (Bitmaske) |
| 0x2901 | Characteristic User Description | Textname der Charakteristik | UTF-8-Zeichenkette |
| 0x2902 | Client Characteristic Configuration | Benachrichtigungsverwaltung | uint16 |
| 0x2903 | Server Characteristic Configuration | Serverkonfiguration für Broadcast | uint16 |
| 0x2904 | Characteristic Presentation Format | Datenpräsentationsformat | Struktur (7 Byte) |
| 0x2905 | Characteristic Aggregate Format | Kombination mehrerer Charakteristiken | Liste von UUIDs |
| 0x2906 | Valid Range | Bereich gültiger Werte | uint16 × 2 (min, max) |
| 0x2907 | External Report Reference | Referenz auf externen Bericht | uint16 |
| 0x2908 | Report Reference | Referenz auf internen Bericht | uint8 + uint16 |
Characteristic User Description (0x2901) ist besonders nützlich für die Benutzeroberfläche: Sie enthält einen menschenlesbaren Namen der Charakteristik, der in der Anwendungsoberfläche angezeigt werden kann. Beispielsweise kann eine Battery-Level-Charakteristik einen User-Description-Deskriptor mit dem Wert „Akku-Ladezustand“ haben.
Characteristic Presentation Format (0x2904) enthält Informationen zur Interpretation des Charakteristikwerts: Format (uint8, uint16, float), Exponent, Maßeinheit (über UUID aus dem Bluetooth-SIG-Register), Namensraum und Beschreibung. Beispielsweise kann die Temperatur ein int16 mit Exponent -2 (Teilungswert 0,01°C) und der Maßeinheit „Grad Celsius“ sein.
Der Zugriff auf Deskriptoren unterscheidet sich unter iOS und Android. Core Bluetooth verwaltet CCCD automatisch, wenn Benachrichtigungen aktiviert werden, während Android das manuelle Schreiben des Werts in den Deskriptor erfordert. Betrachten wir beide Ansätze.
In iOS interagiert der Entwickler normalerweise nicht direkt mit Deskriptoren. Core Bluetooth findet automatisch CCCD und schreibt den erforderlichen Wert, wenn setNotifyValue aufgerufen wird. Zum Lesen von Deskriptoren wird die Methode discoverDescriptors verwendet.
// Deskriptoren entdecken
peripheral.discoverDescriptors(for: characteristic)
// User-Description-Wert lesen
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverDescriptorsFor characteristic: CBCharacteristic,
error: Error?
) {
for descriptor in characteristic.descriptors ?? [] {
if descriptor.uuid == CBUUID("2901") {
peripheral.readValue(for: descriptor)
}
}
}
Auf Android muss der Entwickler den CCCD-Deskriptor der Charakteristik finden und den Wert schreiben, um Benachrichtigungen zu aktivieren. Dies ist ein zusätzlicher Schritt im Vergleich zu iOS.
// User-Description-Deskriptorwert lesen
BluetoothGattDescriptor userDesc = characteristic
.getDescriptor(
UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
);
if (userDesc != null) {
bluetoothGatt.readDescriptor(userDesc);
}
Benutzerdefinierte Deskriptoren werden verwendet, wenn die Standarddeskriptoren von Bluetooth SIG nicht ausreichen. Beispielsweise kann ein Hersteller medizinischer Sensoren einen Deskriptor mit Sensor-Kalibrierungsinformationen oder einen Deskriptor mit einem Fehlerprotokoll hinzufügen.
Ein benutzerdefinierter Deskriptor wird mit einer 128-Bit-UUID erstellt, ähnlich wie eine benutzerdefinierte Charakteristik. Auf der Peripheral-Seite fügt der Entwickler ihn über die entsprechende API zur Charakteristik hinzu. Auf der Central-Seite wird der Deskriptor automatisch erkannt, wenn discoverDescriptors aufgerufen wird.
Beim Erstellen eines benutzerdefinierten Deskriptors beachten Sie folgende Regeln: Die Wertlänge muss dem erwarteten Datentyp entsprechen, und die Zugriffsrechte (Lesen/Schreiben) müssen explizit angegeben werden. Verwenden Sie keine UUIDs aus dem Standarddeskriptorbereich von Bluetooth SIG (0x2900–0x2908) für benutzerdefinierte Zwecke.
Charakteristik und Deskriptor sind verschiedene Ebenen von GATT-Attributen. Eine Charakteristik ist ein Datenpunkt, während ein Deskriptor ihre Metadaten oder Konfiguration ist. Der Unterschied zeigt sich in mehreren Aspekten: Zweck, UUID und Zugriffsregeln.
Eine Charakteristik hat eine obligatorische Deklaration, die immer in der GATT-Tabelle vorhanden ist. Ein Deskriptor ist optional — eine Charakteristik kann keine Deskriptoren haben. Eine Charakteristik kann unabhängig gelesen, geschrieben oder Benachrichtigungen senden. Ein Deskriptor ist immer an eine Charakteristik gebunden und existiert nicht separat.
Laut der Bluetooth Core Specification 5.4 ist die Reihenfolge der Attribute in der GATT-Tabelle wie folgt: Dienstdeklaration, Charakteristikdeklaration, Charakteristikwert, Charakteristikdeskriptoren (falls vorhanden), dann der nächste Dienst. Diese Reihenfolge ist für den korrekten Betrieb von GATT-Clients verbindlich.
Häufig gestellte Fragen
CCCD wird für die Abonnementverwaltung benötigt: Die Notify-Eigenschaft zeigt nur an, dass die Charakteristik Benachrichtigungen senden kann, aktiviert sie aber nicht. Der Central muss durch Schreiben von 0x0001 in CCCD explizit abonnieren. Dies verhindert das unerwünschte Senden von Daten an einen unvorbereiteten Central.
Die Spezifikation begrenzt die Anzahl der Deskriptoren nicht. In der Praxis hat jede Charakteristik normalerweise 1–3 Deskriptoren: CCCD (für Charakteristiken mit Notify/Indicate), optional User Description und Presentation Format. Zu viele Deskriptoren vergrößern die GATT-Tabelle.
In den meisten Fällen nicht. Core Bluetooth auf iOS und Android fügt CCCD automatisch zu Charakteristiken hinzu, die Notify- oder Indicate-Eigenschaften haben. Benutzerdefinierte Deskriptoren werden nur für spezifische Metadaten manuell erstellt.
Nein, CCCD hat ein streng definiertes Format (uint16) und einen Zweck — die Verwaltung von Benachrichtigungen. Das Schreiben anderer Werte verletzt die Bluetooth-Spezifikation und kann dazu führen, dass das Abonnement nicht mehr funktioniert. Verwenden Sie für benutzerdefinierte Daten benutzerdefinierte Deskriptoren mit 128-Bit-UUIDs.
Die User Description enthält einen menschenlesbaren Namen der Charakteristik — zum Beispiel „Gerätetemperatur“ anstelle der UUID 0x2A6E. Die Anwendung kann diesen Namen in der Oberfläche anzeigen und so die Interaktion mit dem BLE-Gerät für den Benutzer ohne hartcodierte Zeichenketten verständlich machen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch