Start · Sprachen · JavaScript · Referenz · BluetoothRemoteGATTServer.disconnect()

BluetoothRemoteGATTServer.disconnect()

Methode

Trennt die Verbindung der Skriptumgebung zum GATT-Server des Bluetooth-Geräts <code>this.device</code>.

seit JavaScript Chrome/Edge 56+, Opera 43+ (experimentell, nicht i Kategorie: webapi

Signatur

BluetoothRemoteGATTServer.prototype.disconnect()

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);
Batterie: 87 % Verbunden? false

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);
Verbunden: true Getrennt von: Polar H10

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);
Verbindung beendet.

// 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 localhost verfügbar. Das Gerät muss vorher per Nutzergeste über requestDevice() gewählt werden.
  • Ungültige Objekte: Nach disconnect() werfen Zugriffe auf alte Service- oder Characteristic-Objekte einen NetworkError. Nach dem erneuten Verbinden musst du sie neu holen.
  • Laufende Vorgänge: Noch offene Promises, etwa von readValue() oder writeValue(), werden mit einem NetworkError abgelehnt.
  • Der Aufruf bei bereits getrennter Verbindung ist harmlos und wirft keinen Fehler. Auch dann kann aber gattserverdisconnected ausgelöst werden.
  • Automatisches Wiederverbinden baust du selbst über das Ereignis gattserverdisconnected. Ohne Abbruchbedingung erzeugst du dabei leicht eine Endlosschleife, sobald du selbst disconnect() aufrufst.