Signatur
Beschreibung
Die Eigenschaft characteristic eines BluetoothRemoteGATTDescriptor verweist zurück auf die GATT-Charakteristik, zu der der Deskriptor gehört. In der GATT-Hierarchie (Gerät → Server → Dienst → Charakteristik → Deskriptor) kommt man darüber eine Ebene nach oben.
Nützlich ist das vor allem, wenn ein Deskriptor-Objekt an eine Hilfsfunktion übergeben wird und dort Kontext gebraucht wird, etwa die UUID der Charakteristik, ihre Eigenschaften (properties) oder der Weg weiter hinauf über characteristic.service bis zum Gerät. So muss man die Charakteristik nicht zusätzlich als Parameter mitgeben.
Der Wert wird beim Anlegen des Deskriptors festgelegt und ändert sich danach nicht. Die Eigenschaft ist schreibgeschützt; eine Zuweisung wird still ignoriert (im Strict Mode gibt es einen TypeError).
Rückgabewert
getDescriptor() bzw. getDescriptors() der Deskriptor abgerufen wurde.Beispiele
Vom Deskriptor zur Charakteristik zurück
// Muss aus einer Nutzeraktion heraus laufen, z. B. einem Klick
const button = document.querySelector('#verbinden');
button.addEventListener('click', async () => {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['heart_rate'] }]
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService('heart_rate');
const characteristic = await service.getCharacteristic('heart_rate_measurement');
// Client Characteristic Configuration Descriptor (0x2902)
const descriptor = await characteristic.getDescriptor(
'gatt.client_characteristic_configuration'
);
console.log(descriptor.characteristic === characteristic);
console.log(descriptor.characteristic.uuid);
});
Hilfsfunktion mit Kontext-Ausgabe für alle Deskriptoren
// Gibt einen Deskriptor samt Charakteristik, Dienst und Gerät aus
const beschreibeDeskriptor = async (descriptor) => {
const char = descriptor.characteristic;
const service = char.service;
const device = service.device;
const value = await descriptor.readValue();
const bytes = [...new Uint8Array(value.buffer)]
.map((b) => b.toString(16).padStart(2, '0'))
.join(' ');
console.log(
`${device.name} › Dienst ${service.uuid} › ` +
`Charakteristik ${char.uuid} › Deskriptor ${descriptor.uuid}: ${bytes}`
);
};
// Verwendung, z. B. für alle Deskriptoren einer Charakteristik:
// const descriptors = await characteristic.getDescriptors();
// for (const d of descriptors) await beschreibeDeskriptor(d);
Vor dem Schreiben prüfen, ob Benachrichtigungen möglich sind
const aktiviereNotifyUeberDeskriptor = async (descriptor) => {
const { properties } = descriptor.characteristic;
if (!properties.notify) {
console.warn('Charakteristik unterstützt keine Benachrichtigungen.');
return;
}
// Besser ist startNotifications(); das hier nur zur Veranschaulichung
await descriptor.characteristic.startNotifications();
console.log('Benachrichtigungen aktiv für', descriptor.characteristic.uuid);
};
// Wichtig · Fallstricke
- Browser-Unterstützung: Web Bluetooth ist experimentell. Es gibt die API nur in Chromium-Browsern (Chrome, Edge, Opera) auf Desktop und Android, nicht in Firefox und nicht in Safari/iOS. Prüfe vorher mit
'bluetooth' in navigator. - Sicherer Kontext: Funktioniert nur über HTTPS (oder
localhost).requestDevice()muss durch eine Nutzeraktion ausgelöst werden. In iframes braucht es die Permissions Policybluetooth. - Die Eigenschaft liest nichts vom Gerät; sie liefert nur die lokal bereits vorhandene Objekt-Referenz zurück. Nach einer Trennung (
gattserverdisconnected) gibt es die Referenz zwar weiterhin, aber Operationen wiereadValue()schlagen mitNetworkErrorfehl, bis man neu verbindet und die Objekte neu abruft. - Den Deskriptor
0x2902(Client Characteristic Configuration) darf man perwriteValue()nicht direkt beschreiben, weil er auf der Sperrliste steht. Benachrichtigungen schaltet man stattdessen mitcharacteristic.startNotifications()ein.