Features von übermorgen: die Web Bluetooth API

Das Thema Bluetooth wird zunehmend auch für den Bereich der Webentwicklung interessant. Während es für mobile Anwendungen bereits relativ viele Möglichkeiten gibt, per Bluetooth auf andere Geräte zuzugreifen, ist das aus dem Browser heraus nur über Plug-ins möglich, die der Nutzer selbst installieren muss (z.B. Brulee SDK). Hier soll die Web Bluetooth API Abhilfe schaffen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 5 Min.
Von
  • Philip Ackermann
Inhaltsverzeichnis

Das Thema Bluetooth wird zunehmend auch für den Bereich der Webentwicklung interessant. Während es für mobile (native bzw. hybride) Anwendungen bereits relativ viele Möglichkeiten gibt, per Bluetooth auf andere Geräte zuzugreifen (beispielsweise via PhoneGap-Plug-ins, die für den Nutzer transparent bleiben), ist das aus dem Browser heraus nur über Plug-ins möglich, die der Nutzer selbst installieren muss (z.B. Brulee SDK). Hier soll die Web Bluetooth API Abhilfe schaffen.

Vor etwa einem Monat hat das W3C, genauer gesagt die Web Bluetooth Community Group, einen ersten Entwurf der Web Bluetooth API veröffentlicht. Mit ihr soll es künftig möglich sein, dass sich Webanwendungen per Bluetooth mit anderen Geräten verbinden können und diese entsprechend steuern beziehungseise Informationen dieser Geräte auslesen können.

Mehr Infos

Die Web Bluetooth API wird derzeit noch von keinem Browser offiziell unterstützt, allerdings bietet Chrome momentan ein experimentelles Feature an, das sich über ein entsprechendes Flag unter chrome://flags/ aktivieren lässt.

Die API definiert verschiedene Interfaces, darunter folgende (für eine Einführung in das Thema Bluetooth im Allgemeinen sowie BLE, Bluetooth Low Energy, im Speziellen gibt es übrigens einen sehr schönen Artikel auf der Website von Adafruit).

  • Bluetooth: bildet den Einstiegspunkt in die API und wird von navigator.bluetooth implementiert.
  • BluetoothDevice: repräsentiert ein Bluetooth-Gerät.
  • BluetoothAdvertisingData: repräsentiert die "Advertising Data", sprich die Daten, die das Bluetooth-Gerät versendet und beim Scannen nach Geräten zur Verfügung stehen.
  • BluetoothRemoteGATTServer: repräsentiert einen GATT-Server (Generic Attribute Profile) auf einem (entfernten) Bluetooth-Gerät.
  • BluetoothRemoteGATTService: repräsentiert einen Service, der durch den GATT-Server auf dem Bluetooth-Gerät zur Verfügung gestellt wird.
  • BluetoothRemoteGATTCharacteristic: repräsentiert eine Charakteristik, die über einen Service zur Verfügung gestellt wird und sich über die Informationen zum Bluetooth-Gerät ermitteln lassen.
  • BluetoothRemoteGATTProperties: repräsentiert die Eigenschaften einer Charakteristik.
  • BluetoothRemoteGATTDescriptor: repräsentiert ein Objekt, das Informationen über den Wert einer Charakteristik bereitstellt.
  • BluetoothUUID: repräsentiert ein Objekt mit verschiedenen Methoden, über die die UUIDs für beispielsweise Services und Charakteristiken anhand ihrer jeweiligen Namen ermittelt werden können.
Navigator bluetooth

Um nach Bluetooth-Geräten zu scannen, ruft man, wie in folgendem Listing zu sehen, die Methode requestDevice() auf dem bluetooth-Objekt auf. Als Parameter erwartet diese Methode ein Konfigurationsobjekt (vom Typ RequestDeviceOptions), bei dem man über Filter eingrenzen kann, welche Geräte beim Scan berücksichtigt werden sollen (im Listing beispielsweise nur solche Geräte, die den Service "example_service" zur Verfügung stellen).

Die Methode requestDevice() liefert wie die meisten Methoden der API ein Promise-Objekt zurück, sodass der Code relativ übersichtlich und lesbar bleibt. Im Callback der then()-Methode erhält man anschließend ein Objekt vom Typ BluetoothDevice und kann darüber auf verschiedene allgemeine Informationen des jeweiligen Geräts zugreifen.

'use strict';
let options = {filters: [{
services: ['example_service'],
}]};
navigator.bluetooth
.requestDevice(options)
.then(device => {
.then(device => {
console.log('Name: ' + device.name);
console.log('Id: ' + device.id);
console.log('Device Class: ' + device.deviceClass);
console.log('Vendor Id Source: ' + device.vendorIDSource);
console.log('Vendor Id: ' + device.vendorID);
console.log('Product Id: ' + device.productID);
console.log('Product Version: ' + device.productVersion);
if (device.adData) {
console.log('Tx Power: ' + device.adData.txPower + ' dBm');
console.log('RSSI: ' + device.adData.rssi + ' dBm');
}
})
.catch(error => {
console.error(error);
});

Der Zugriff auf Informationen eines Bluetooth-Geräts folgt prinzipiell folgenden Schritten:

  1. Scannen nach dem Bluetooth-Gerät
  2. Verbinden zum Bluetooth-Gerät
  3. Zugriff auf den Service
  4. Zugriff auf die Charakteristik
  5. Zugriff auf die der Charakteristik hinterlegten Daten

Analog zu diesen fünf Schritten stellen die jeweiligen Interfaces entsprechende Methoden zur Verfügung:

  1. Bluetooth --> requestDevice()
  2. BluetoothRemoteGATTServer --> connect()
  3. BluetoothRemoteGATTServer --> getPrimaryService(), getPrimaryServices()
  4. BluetoothRemoteGATTService --> getCharacteristic(), getCharacteristics()
  5. BluetoothRemoteGATTCharacteristic --> readValue()

Der entsprechende Code, um auf die Daten einer Charakteristik zuzugreifen, sieht unter Verwendung dieser Methoden folgendermaßen aus:

'use strict';
let options = {filters: [{
services: ['example_service'],
}]};
navigator.bluetooth
// 1.) Scannen nach dem Bluetoot-Gerät
.requestDevice(options)
// 2.) Verbinden zu dem Bluetooth-Gerät
.then(device => {
return device.gatt.connect();
})
// 3.) Zugriff auf den Service
.then(server => {
return server.getPrimaryService('example_service');
})
// 4.) Zugriff auf die Charakteristik
.then(service => {
return service.getCharacteristic('example_service');
})
// 5.) Zugriff auf die der Charakteristik hinterlegten Daten
.then(characteristic => {
return characteristic.readValue();
})
.then(value => {
// Zugriff auf Wert
})
.catch(error => {
console.error(error);
});

Verglichen mit anderen Bluetooth-Bibliotheken, PhoneGap-Plug-ins etc. sieht das ziemlich ordentlich aus, wie ich finde.

Die Web Bluetooth API hat zum Ziel, den Zugriff auf Bluetooth-Geräte zu vereinheitlichen und im Browser nativ zur Verfügung zu stellen. Momentan wird sie von keinem Browser unterstützt, mit Ausnahme von Chrome, bei dem sich die API über ein Flag im experimentellen Modus aktivieren lässt. Issues zum Thema sammelt die Web Bluetooth Community Group unter GitHub. ()