Signatur
Beschreibung
Die schreibgeschützte Eigenschaft indicate der Schnittstelle BluetoothCharacteristicProperties gibt an, ob ein Bluetooth-Low-Energy-Gerät Wertänderungen dieser Charakteristik als Indikation senden kann. Anders als bei einer Benachrichtigung (notify) muss der Client jede Indikation auf Protokollebene bestätigen. Die Zustellung ist damit garantiert, der Durchsatz ist aber geringer, weil das Gerät vor der nächsten Indikation auf die Bestätigung wartet.
Du liest die Eigenschaft über characteristic.properties.indicate, wobei characteristic ein BluetoothRemoteGATTCharacteristic ist. Prüfe sie (zusammen mit notify), bevor du startNotifications() aufrufst. Je nach Fähigkeit des Geräts schreibt der Browser in den Client Characteristic Configuration Descriptor (CCCD) das Abo für Notifications oder für Indications. Die Bestätigung der Indikationen übernimmt der Browser automatisch. Im JavaScript-Code merkst du davon nichts: In beiden Fällen kommt das Ereignis characteristicvaluechanged an.
Typische Anwendungen sind Messwerte, die nicht verloren gehen dürfen, etwa Blutdruckmessungen (blood_pressure_measurement) oder Temperaturmessungen im Health Thermometer Service (temperature_measurement). Beide legt die Bluetooth-Spezifikation als indicate-Charakteristiken fest.
Rückgabewert
true, wenn die Charakteristik Indikationen unterstützt, sonst false. Der Wert ist schreibgeschützt.Beispiele
Fähigkeiten einer Charakteristik prüfen
// Muss durch eine Nutzeraktion ausgelöst werden (z. B. Klick)
const button = document.querySelector('#connect');
button.addEventListener('click', async () => {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['health_thermometer'] }]
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService('health_thermometer');
const characteristic = await service.getCharacteristic('temperature_measurement');
const { indicate, notify } = characteristic.properties;
console.log(`indicate: ${indicate}, notify: ${notify}`);
});
Blutdruckmessungen per Indikation abonnieren
const subscribeBloodPressure = async () => {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['blood_pressure'] }]
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService('blood_pressure');
const characteristic = await service.getCharacteristic('blood_pressure_measurement');
if (!characteristic.properties.indicate) {
throw new Error('Gerät unterstützt keine Indikationen für Messwerte.');
}
characteristic.addEventListener('characteristicvaluechanged', (event) => {
const value = event.target.value; // DataView
const flags = value.getUint8(0);
const unit = flags & 0x01 ? 'kPa' : 'mmHg';
// Werte sind SFLOAT; hier vereinfacht als 16-Bit-Mantisse gelesen
const systolic = value.getUint16(1, true) & 0x0fff;
const diastolic = value.getUint16(3, true) & 0x0fff;
console.log(`Blutdruck: ${systolic}/${diastolic} ${unit}`);
});
// Der Browser abonniert Indications und bestätigt sie automatisch
await characteristic.startNotifications();
console.log('Abonniert – bitte Messung am Gerät starten.');
};
document.querySelector('#bp').addEventListener('click', subscribeBloodPressure);
Zustellungsart (Indication oder Notification) bestimmen
const describeDelivery = (characteristic) => {
const { indicate, notify } = characteristic.properties;
if (indicate && notify) return 'Beides möglich (Browser wählt)';
if (indicate) return 'Indication (mit Bestätigung)';
if (notify) return 'Notification (ohne Bestätigung)';
return 'Kein Abo möglich – nur readValue()';
};
// Alle Charakteristiken eines Dienstes auflisten
const listCharacteristics = async (service) => {
const characteristics = await service.getCharacteristics();
for (const c of characteristics) {
console.log(c.uuid, '→', describeDelivery(c));
}
};
// Wichtig · Fallstricke
- Browserunterstützung: Die Web Bluetooth API ist experimentell und nur in Chromium-Browsern verfügbar (Chrome, Edge, Opera; unter Linux teils nur mit Flag). Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit
'bluetooth' in navigator. - Sicherer Kontext und Nutzeraktion:
requestDevice()funktioniert nur über HTTPS (oderlocalhost) und nur als Reaktion auf eine Nutzeraktion. Außerdem kann die Permissions-Policybluetoothdie API blockieren, etwa in iframes. - Keine Wahl zwischen den Modi: Unterstützt eine Charakteristik sowohl
notifyals auchindicate, entscheidet der Browser, welche Art er abonniert. Ein API-Schalter, um Indications zu erzwingen, existiert nicht. - Geringerer Durchsatz: Pro Verbindungsintervall ist höchstens eine unbestätigte Indikation unterwegs. Für schnelle Datenströme wie Beschleunigungssensoren eignen sich Notifications besser.
- Ist
indicateundnotifybeidefalse, wird das Promise vonstartNotifications()mit einemNotSupportedErrorabgelehnt. - Der Wert beschreibt nur, was das Gerät laut GATT-Deklaration kann. Ob die Indikationen gerade aktiv sind, verrät er nicht.