Start · Sprachen · JavaScript · Referenz · BluetoothRemoteGATTCharacteristic.service

BluetoothRemoteGATTCharacteristic.service

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>BluetoothRemoteGATTService</code> zurückgibt, zu dem diese GATT-Charakteristik gehört.

seit JavaScript Web Bluetooth API – Chrome/Edge 56+, Opera 43+; ni Kategorie: webapi

Signatur

BluetoothRemoteGATTCharacteristic.service

Beschreibung

Die Eigenschaft service einer BluetoothRemoteGATTCharacteristic verweist zurück auf den GATT-Dienst (BluetoothRemoteGATTService), über den die Charakteristik abgerufen wurde. So kommt man von einer Charakteristik „nach oben“ in der GATT-Hierarchie: Gerät → Server → Dienst → Charakteristik → Deskriptor.

Nützlich ist das vor allem in Event-Handlern wie characteristicvaluechanged. Dort bekommt man über event.target nur die Charakteristik. Über characteristic.service (und weiter über service.device) lässt sich dann herausfinden, von welchem Dienst und welchem Gerät die Benachrichtigung stammt. Das braucht man etwa, wenn ein gemeinsamer Handler für mehrere Geräte oder Dienste registriert ist.

Die Eigenschaft ist schreibgeschützt und ändert sich während der Lebensdauer des Objekts nicht. Sie liefert immer dieselbe Dienst-Instanz, über die die Charakteristik mit getCharacteristic() oder getCharacteristics() ermittelt wurde.

Rückgabewert

Typ
BluetoothRemoteGATTService
Beschreibung
Der GATT-Dienst, zu dem die Charakteristik gehört. Über seine Eigenschaften uuid, isPrimary und device lassen sich Dienst und Gerät bestimmen.

Beispiele

Dienst einer Charakteristik ermitteln

// 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: ['battery_service'] }]
  });
  const server = await device.gatt.connect();
  const service = await server.getPrimaryService('battery_service');
  const characteristic = await service.getCharacteristic('battery_level');

  console.log(characteristic.service === service);
  console.log(characteristic.service.uuid);
});
true 0000180f-0000-1000-8000-00805f9b34fb

Herkunft einer Benachrichtigung im gemeinsamen Handler bestimmen

const handleValueChanged = (event) => {
  const characteristic = event.target;
  const { service } = characteristic;
  const deviceName = service.device.name ?? 'Unbekanntes Gerät';
  const value = characteristic.value.getUint8(0);

  console.log(`${deviceName} | Dienst ${service.uuid} | Wert: ${value}`);
};

const subscribe = async (device) => {
  const server = await device.gatt.connect();
  const service = await server.getPrimaryService('heart_rate');
  const characteristic = await service.getCharacteristic('heart_rate_measurement');
  characteristic.addEventListener('characteristicvaluechanged', handleValueChanged);
  await characteristic.startNotifications();
};
Pulsgurt | Dienst 0000180d-0000-1000-8000-00805f9b34fb | Wert: 22

Vom Deskriptor bis zum Gerät hochnavigieren

const describeHierarchy = (descriptor) => {
  const characteristic = descriptor.characteristic;
  const service = characteristic.service;
  const device = service.device;

  return {
    device: device.name,
    service: service.uuid,
    primary: service.isPrimary,
    characteristic: characteristic.uuid,
    descriptor: descriptor.uuid
  };
};

// Aufruf z. B. mit einem Deskriptor aus characteristic.getDescriptor(...)
// console.log(describeHierarchy(descriptor));

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Web Bluetooth API ist experimentell. Sie läuft nur in Chromium-Browsern (Chrome, Edge, Opera) auf Desktop und Android. Firefox und Safari (auch unter iOS) unterstützen sie nicht. Vorher mit 'bluetooth' in navigator prüfen.
  • Sicherer Kontext: Die API steht nur über HTTPS (oder localhost) zur Verfügung. requestDevice() muss durch eine Nutzeraktion ausgelöst werden.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und löst im Strict Mode einen TypeError aus.
  • Das Dienst-Objekt bleibt auch nach einer Trennung der Verbindung erreichbar, ist dann aber nicht mehr nutzbar. Vor weiteren GATT-Operationen service.device.gatt.connected prüfen, sonst gibt es einen NetworkError.
  • Nach einem erneuten Verbindungsaufbau sollten Dienste und Charakteristiken neu abgerufen werden. Alte Referenzen können ungültig sein.