Signatur
Beschreibung
Mit disconnect() beendet eine Web-Anwendung ihre GATT-Verbindung zu einem Bluetooth-Low-Energy-Gerät, das sie vorher mit BluetoothRemoteGATTServer.connect() aufgebaut hat. Die Methode arbeitet synchron und gibt nichts zurück. Danach ist server.connected gleich false, und am zugehörigen BluetoothDevice wird das Ereignis gattserverdisconnected ausgelöst.
Rufe die Methode auf, sobald du das Gerät nicht mehr brauchst, etwa beim Verlassen einer Ansicht, bei pagehide oder nachdem eine einmalige Messung ausgelesen ist. Das spart Akku auf beiden Seiten, und andere Anwendungen können das Gerät wieder nutzen.
Wichtig: Mit dem Trennen werden alle bisher geholten BluetoothRemoteGATTService-, BluetoothRemoteGATTCharacteristic- und BluetoothRemoteGATTDescriptor-Objekte ungültig. Aktive Benachrichtigungen (startNotifications()) enden. Nach einem erneuten connect() musst du Dienste und Eigenschaften (Characteristics) neu abfragen. Ob die physische Funkverbindung wirklich getrennt wird, entscheidet der Browser bzw. das Betriebssystem. Nutzen noch andere Anwendungen das Gerät, kann die Verbindung auf Systemebene bestehen bleiben.
Beispiele
Verbinden, Batteriestand lesen, wieder trennen
const leseBatterie = async () => {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['battery_service'] }]
});
const server = await device.gatt.connect();
try {
const service = await server.getPrimaryService('battery_service');
const characteristic = await service.getCharacteristic('battery_level');
const value = await characteristic.readValue();
console.log(`Batterie: ${value.getUint8(0)} %`);
} finally {
// Verbindung immer sauber beenden, auch bei Fehlern
server.disconnect();
console.log('Verbunden?', server.connected);
}
};
document.querySelector('#batterie').addEventListener('click', leseBatterie);
Auf das Trennen reagieren (gattserverdisconnected)
const verbinde = async () => {
const device = await navigator.bluetooth.requestDevice({
acceptAllDevices: true,
optionalServices: ['heart_rate']
});
device.addEventListener('gattserverdisconnected', (event) => {
console.log(`Getrennt von: ${event.target.name ?? 'Unbekannt'}`);
});
const server = await device.gatt.connect();
console.log('Verbunden:', server.connected);
// Nach 10 Sekunden manuell trennen
setTimeout(() => server.disconnect(), 10_000);
};
document.querySelector('#verbinden').addEventListener('click', verbinde);
Trenn-Button mit Schutzabfrage
let device = null;
const trennen = () => {
if (!device?.gatt) return;
if (device.gatt.connected) {
device.gatt.disconnect();
console.log('Verbindung beendet.');
} else {
console.log('Gerät ist bereits getrennt.');
}
};
document.querySelector('#trennen').addEventListener('click', trennen);
// Beim Verlassen der Seite ebenfalls trennen
window.addEventListener('pagehide', trennen);
// Wichtig · Fallstricke
- Browser-Unterstützung: Web Bluetooth ist experimentell. Es läuft nur in Chromium-Browsern (Chrome, Edge, Opera), auf Linux teils nur mit Flag. Firefox und Safari unterstützen es nicht. Prüfe vorher mit
'bluetooth' in navigator. - Sicherer Kontext: Die API ist nur über HTTPS oder
localhostverfügbar. Das Gerät muss vorher per Nutzergeste überrequestDevice()gewählt werden. - Ungültige Objekte: Nach
disconnect()werfen Zugriffe auf alte Service- oder Characteristic-Objekte einenNetworkError. Nach dem erneuten Verbinden musst du sie neu holen. - Laufende Vorgänge: Noch offene Promises, etwa von
readValue()oderwriteValue(), werden mit einemNetworkErrorabgelehnt. - Der Aufruf bei bereits getrennter Verbindung ist harmlos und wirft keinen Fehler. Auch dann kann aber
gattserverdisconnectedausgelöst werden. - Automatisches Wiederverbinden baust du selbst über das Ereignis
gattserverdisconnected. Ohne Abbruchbedingung erzeugst du dabei leicht eine Endlosschleife, sobald du selbstdisconnect()aufrufst.