Start · Sprachen · JavaScript · Referenz · BluetoothCharacteristicProperties.writeWithoutResponse

BluetoothCharacteristicProperties.writeWithoutResponse

Eigenschaft

Schreibgeschützter <code>boolean</code>, der angibt, ob eine GATT-Characteristic Schreibvorgänge ohne Bestätigung durch das Gerät („Write Without Response“) erlaubt.

seit JavaScript Experimentell: Chromium-Browser (Chrome/Edge 56+, Kategorie: webapi

Signatur

BluetoothCharacteristicProperties.writeWithoutResponse

Beschreibung

Die Eigenschaft writeWithoutResponse gehört zum BluetoothCharacteristicProperties-Objekt, das man über BluetoothRemoteGATTCharacteristic.properties erhält. Sie ist true, wenn die Characteristic das GATT-Verfahren Write Without Response unterstützt. Dabei schickt der Client die Daten, ohne dass das Peripheriegerät den Empfang auf GATT-Ebene bestätigt.

Dieses Verfahren eignet sich für hohen Durchsatz und niedrige Latenz, etwa zum Streamen von Steuerbefehlen an LED-Streifen, Motoren oder Spielzeug oder für Firmware-Updates in vielen kleinen Paketen. Der Preis dafür: Die Zustellung ist auf Anwendungsebene nicht garantiert, und ein Fehler auf dem Gerät wird nicht gemeldet.

In der Praxis prüft man diese Eigenschaft, bevor man characteristic.writeValueWithoutResponse(value) aufruft. Ist sie false, sollte man auf writeValueWithResponse() ausweichen, falls properties.write gesetzt ist. Unterstützt die Characteristic ein Verfahren nicht, wird das entsprechende Promise mit einem NotSupportedError abgelehnt.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Characteristic „Write Without Response“ unterstützt, sonst false. Der Wert ist schreibgeschützt.

Beispiele

Unterstützung einer Characteristic prüfen

// Muss durch eine Benutzeraktion ausgelöst werden (z. B. Klick)
const connectButton = document.querySelector('#connect');

connectButton.addEventListener('click', async () => {
  const device = await navigator.bluetooth.requestDevice({
    filters: [{ services: ['heart_rate'] }]
  });
  const server = await device.gatt.connect();
  const service = await server.getPrimaryService('heart_rate');
  const characteristic = await service.getCharacteristic('heart_rate_control_point');

  console.log('Write Without Response:', characteristic.properties.writeWithoutResponse);
  console.log('Write (mit Antwort):', characteristic.properties.write);
});
Write Without Response: false Write (mit Antwort): true

Passendes Schreibverfahren automatisch wählen

const sendCommand = async (characteristic, bytes) => {
  const data = new Uint8Array(bytes);
  const { writeWithoutResponse, write } = characteristic.properties;

  if (writeWithoutResponse) {
    // Schnell, aber ohne Bestätigung durch das Gerät
    await characteristic.writeValueWithoutResponse(data);
    return 'ohne Antwort gesendet';
  }
  if (write) {
    // Langsamer, aber vom Gerät bestätigt
    await characteristic.writeValueWithResponse(data);
    return 'mit Antwort gesendet';
  }
  throw new Error('Characteristic ist nicht beschreibbar');
};

// Aufruf, z. B. für eine RGB-Lampe:
// console.log(await sendCommand(ledCharacteristic, [0x56, 0xff, 0x00, 0x00]));
ohne Antwort gesendet

Alle Eigenschaften einer Characteristic auflisten

const describeProperties = (characteristic) => {
  const p = characteristic.properties;
  const flags = [
    'broadcast', 'read', 'writeWithoutResponse', 'write',
    'notify', 'indicate', 'authenticatedSignedWrites',
    'reliableWrite', 'writableAuxiliaries'
  ];
  return flags.filter((flag) => p[flag]);
};

// console.log(describeProperties(characteristic));
["read", "writeWithoutResponse", "notify"]

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Web Bluetooth API ist experimentell und nur in Chromium-basierten Browsern verfügbar (Chrome, Edge, Opera; unter Linux teilweise nur mit Flag). Firefox und Safari unterstützen sie nicht. Vorher mit 'bluetooth' in navigator prüfen.
  • Sicherer Kontext: Die API funktioniert nur über HTTPS oder localhost. requestDevice() muss durch eine Benutzeraktion ausgelöst werden.
  • Keine Zustellgarantie: Wenn writeValueWithoutResponse() erfolgreich aufgelöst wird, heißt das nur, dass die Daten an den Bluetooth-Stack übergeben wurden. Ob das Gerät sie verarbeitet hat, ist damit nicht gesagt. Wer zu viele Pakete zu schnell sendet, riskiert verlorene Daten. Deshalb Schreibvorgänge nacheinander mit await ausführen und nicht parallel starten.
  • Paketgröße: Die Nutzlast ist durch die ATT-MTU begrenzt (standardmäßig 20 Byte). Größere Daten muss man selbst in Stücke aufteilen.
  • Die ältere Methode writeValue() ist veraltet. Sie wählt das Verfahren selbst. Besser ist es, writeValueWithResponse() oder writeValueWithoutResponse() ausdrücklich aufzurufen.