Signatur
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
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);
});
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]));
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));
// 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 navigatorprü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 mitawaitausfü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()oderwriteValueWithoutResponse()ausdrücklich aufzurufen.