Signatur
Beschreibung
stopNotifications() ist das Gegenstück zu startNotifications(). Die Methode setzt den Client Characteristic Configuration Descriptor (CCCD) des Bluetooth-Low-Energy-Geräts zurück. Danach schickt das Gerät keine Wertänderungen mehr, und das Event characteristicvaluechanged wird für diese Characteristic nicht mehr ausgelöst.
Das zurückgegebene Promise erfüllt sich mit derselben BluetoothRemoteGATTCharacteristic-Instanz, sobald keine aktive Benachrichtigung mehr besteht. Deshalb kannst du den Aufruf gut verketten, zum Beispiel um anschließend Event-Listener zu entfernen oder die GATT-Verbindung zu trennen.
Typische Anwendungsfälle sind das Beenden einer Live-Messung (Herzfrequenz, Sensorwerte), das Aufräumen, wenn eine Komponente oder Seite verlassen wird, und das Energiesparen beim Peripheriegerät: Jede aktive Notification hält das Funkmodul des Geräts beschäftigt.
Rückgabewert
NetworkError, wenn das Gerät nicht verbunden ist, mit InvalidStateError oder mit NotSupportedError, wenn die Characteristic weder notify noch indicate unterstützt.Beispiele
Herzfrequenz-Messung starten und wieder stoppen
const handleHeartRate = (event) => {
const value = event.target.value; // DataView
const flags = value.getUint8(0);
const bpm = flags & 0x1 ? value.getUint16(1, true) : value.getUint8(1);
console.log(`Puls: ${bpm} bpm`);
};
let characteristic;
// Muss durch eine Nutzergeste (z. B. Klick) ausgelöst werden
document.querySelector('#start').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');
characteristic = await service.getCharacteristic('heart_rate_measurement');
characteristic.addEventListener('characteristicvaluechanged', handleHeartRate);
await characteristic.startNotifications();
console.log('Benachrichtigungen aktiv');
});
document.querySelector('#stop').addEventListener('click', async () => {
if (!characteristic) return;
await characteristic.stopNotifications();
characteristic.removeEventListener('characteristicvaluechanged', handleHeartRate);
console.log('Benachrichtigungen beendet');
});
Sauberes Aufräumen mit Fehlerbehandlung und Trennen der Verbindung
const cleanup = async (characteristic, handler) => {
const device = characteristic.service.device;
try {
if (device.gatt.connected) {
const c = await characteristic.stopNotifications();
console.log('Gestoppt für UUID:', c.uuid);
}
} catch (err) {
console.warn('stopNotifications fehlgeschlagen:', err.name, err.message);
} finally {
characteristic.removeEventListener('characteristicvaluechanged', handler);
if (device.gatt.connected) device.gatt.disconnect();
}
};
// z. B. beim Verlassen der Seite
window.addEventListener('pagehide', () => cleanup(characteristic, handleHeartRate));
Messung nach fester Dauer automatisch beenden
const recordFor = async (characteristic, ms) => {
const samples = [];
const onValue = (e) => samples.push(e.target.value.getUint8(1));
characteristic.addEventListener('characteristicvaluechanged', onValue);
await characteristic.startNotifications();
await new Promise((resolve) => setTimeout(resolve, ms));
await characteristic.stopNotifications();
characteristic.removeEventListener('characteristicvaluechanged', onValue);
return samples;
};
const werte = await recordFor(characteristic, 5000);
console.log(`${werte.length} Messwerte`, werte);
// Wichtig · Fallstricke
- Browser-Kompatibilität: Web Bluetooth ist experimentell. Es wird nur in Chromium-Browsern (Chrome, Edge, Opera) unterstützt. Firefox und Safari bieten die API nicht an. Auf Linux kann ein Flag nötig sein. Prüfe die Unterstützung vorher mit
'bluetooth' in navigator. - Sicherer Kontext: Die API steht nur über HTTPS oder
localhostzur Verfügung. In Cross-Origin-iframes ist sie außerdem nur mit passender Permissions Policy (bluetooth) nutzbar. - Listener nicht vergessen:
stopNotifications()entfernt keine Event-Listener. Rufe zusätzlichremoveEventListener()auf. Sonst reagieren die alten Handler doppelt, wenn du später erneutstartNotifications()aufrufst. - Verbindung prüfen: Ist das Gerät bereits getrennt (
device.gatt.connected === false), wird das Promise mitNetworkErrorabgelehnt. Beim Trennen der Verbindung enden die Benachrichtigungen ohnehin. - Nachzügler: Wertänderungen, die schon unterwegs waren, können noch kurz nach dem Aufruf eintreffen, bevor sich das Promise erfüllt.
- Mehrere GATT-Operationen gleichzeitig können zu
NetworkError: GATT operation already in progressführen. Führe die Aufrufe deshalb nacheinander mitawaitaus.