Start · Sprachen · JavaScript · Referenz · BluetoothCharacteristicProperties.indicate

BluetoothCharacteristicProperties.indicate

Eigenschaft

Schreibgeschützter boolescher Wert, der <code>true</code> ist, wenn die GATT-Charakteristik Indikationen ihres Werts mit Empfangsbestätigung unterstützt.

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

Signatur

BluetoothCharacteristicProperties.indicate

Beschreibung

Die schreibgeschützte Eigenschaft indicate der Schnittstelle BluetoothCharacteristicProperties gibt an, ob ein Bluetooth-Low-Energy-Gerät Wertänderungen dieser Charakteristik als Indikation senden kann. Anders als bei einer Benachrichtigung (notify) muss der Client jede Indikation auf Protokollebene bestätigen. Die Zustellung ist damit garantiert, der Durchsatz ist aber geringer, weil das Gerät vor der nächsten Indikation auf die Bestätigung wartet.

Du liest die Eigenschaft über characteristic.properties.indicate, wobei characteristic ein BluetoothRemoteGATTCharacteristic ist. Prüfe sie (zusammen mit notify), bevor du startNotifications() aufrufst. Je nach Fähigkeit des Geräts schreibt der Browser in den Client Characteristic Configuration Descriptor (CCCD) das Abo für Notifications oder für Indications. Die Bestätigung der Indikationen übernimmt der Browser automatisch. Im JavaScript-Code merkst du davon nichts: In beiden Fällen kommt das Ereignis characteristicvaluechanged an.

Typische Anwendungen sind Messwerte, die nicht verloren gehen dürfen, etwa Blutdruckmessungen (blood_pressure_measurement) oder Temperaturmessungen im Health Thermometer Service (temperature_measurement). Beide legt die Bluetooth-Spezifikation als indicate-Charakteristiken fest.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Charakteristik Indikationen unterstützt, sonst false. Der Wert ist schreibgeschützt.

Beispiele

Fähigkeiten einer Charakteristik prüfen

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

  const { indicate, notify } = characteristic.properties;
  console.log(`indicate: ${indicate}, notify: ${notify}`);
});
indicate: true, notify: false

Blutdruckmessungen per Indikation abonnieren

const subscribeBloodPressure = async () => {
  const device = await navigator.bluetooth.requestDevice({
    filters: [{ services: ['blood_pressure'] }]
  });
  const server = await device.gatt.connect();
  const service = await server.getPrimaryService('blood_pressure');
  const characteristic = await service.getCharacteristic('blood_pressure_measurement');

  if (!characteristic.properties.indicate) {
    throw new Error('Gerät unterstützt keine Indikationen für Messwerte.');
  }

  characteristic.addEventListener('characteristicvaluechanged', (event) => {
    const value = event.target.value; // DataView
    const flags = value.getUint8(0);
    const unit = flags & 0x01 ? 'kPa' : 'mmHg';
    // Werte sind SFLOAT; hier vereinfacht als 16-Bit-Mantisse gelesen
    const systolic = value.getUint16(1, true) & 0x0fff;
    const diastolic = value.getUint16(3, true) & 0x0fff;
    console.log(`Blutdruck: ${systolic}/${diastolic} ${unit}`);
  });

  // Der Browser abonniert Indications und bestätigt sie automatisch
  await characteristic.startNotifications();
  console.log('Abonniert – bitte Messung am Gerät starten.');
};

document.querySelector('#bp').addEventListener('click', subscribeBloodPressure);
Abonniert – bitte Messung am Gerät starten. Blutdruck: 120/80 mmHg

Zustellungsart (Indication oder Notification) bestimmen

const describeDelivery = (characteristic) => {
  const { indicate, notify } = characteristic.properties;
  if (indicate && notify) return 'Beides möglich (Browser wählt)';
  if (indicate) return 'Indication (mit Bestätigung)';
  if (notify) return 'Notification (ohne Bestätigung)';
  return 'Kein Abo möglich – nur readValue()';
};

// Alle Charakteristiken eines Dienstes auflisten
const listCharacteristics = async (service) => {
  const characteristics = await service.getCharacteristics();
  for (const c of characteristics) {
    console.log(c.uuid, '→', describeDelivery(c));
  }
};
00002a1c-0000-1000-8000-00805f9b34fb → Indication (mit Bestätigung) 00002a1e-0000-1000-8000-00805f9b34fb → Notification (ohne Bestätigung)

// Wichtig · Fallstricke

  • Browserunterstützung: Die Web Bluetooth API ist experimentell und nur in Chromium-Browsern verfügbar (Chrome, Edge, Opera; unter Linux teils nur mit Flag). Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit 'bluetooth' in navigator.
  • Sicherer Kontext und Nutzeraktion: requestDevice() funktioniert nur über HTTPS (oder localhost) und nur als Reaktion auf eine Nutzeraktion. Außerdem kann die Permissions-Policy bluetooth die API blockieren, etwa in iframes.
  • Keine Wahl zwischen den Modi: Unterstützt eine Charakteristik sowohl notify als auch indicate, entscheidet der Browser, welche Art er abonniert. Ein API-Schalter, um Indications zu erzwingen, existiert nicht.
  • Geringerer Durchsatz: Pro Verbindungsintervall ist höchstens eine unbestätigte Indikation unterwegs. Für schnelle Datenströme wie Beschleunigungssensoren eignen sich Notifications besser.
  • Ist indicate und notify beide false, wird das Promise von startNotifications() mit einem NotSupportedError abgelehnt.
  • Der Wert beschreibt nur, was das Gerät laut GATT-Deklaration kann. Ob die Indikationen gerade aktiv sind, verrät er nicht.