Start · Sprachen · JavaScript · Referenz · HIDInputReportEvent.reportId

HIDInputReportEvent.reportId

Eigenschaft

Liefert die 1 Byte große Report-ID des empfangenen HID-Eingabeberichts oder <code>0</code>, wenn das Gerät keine Report-IDs verwendet.

seit JavaScript WebHID: Chrome/Edge 89+, Opera 75+ (nicht in Firef Kategorie: webapi

Signatur

HIDInputReportEvent.reportId

Beschreibung

Die schreibgeschützte Eigenschaft reportId der Schnittstelle HIDInputReportEvent enthält das Präfix, mit dem ein HID-Gerät seine Eingabeberichte kennzeichnet. Viele Geräte wie Gamepads, Tastaturen mit Zusatztasten oder Controller mit Sensoren senden mehrere Berichtstypen über dieselbe Schnittstelle. Anhand der Report-ID kannst du erkennen, welches Datenformat ein Bericht hat, und ihn passend auswerten.

Der Wert ist eine ganze Zahl zwischen 0 und 255. Nutzt das Gerät laut seinem Report-Deskriptor keine Report-IDs, ist der Wert immer 0. Wichtig: Die Report-ID ist nicht in event.data enthalten. Der Browser entfernt das Präfix-Byte, sodass data nur die eigentlichen Nutzdaten enthält.

Typischerweise liest du reportId im Handler des Events inputreport eines geöffneten HIDDevice aus, meist in einer switch-Anweisung, die je nach Berichtstyp einen anderen Parser aufruft. Welche IDs es gibt und wie sie aufgebaut sind, siehst du in HIDDevice.collections unter inputReports[].reportId.

Rückgabewert

Typ
number
Beschreibung
Vorzeichenlose 8-Bit-Ganzzahl (0–255) mit der Report-ID des Eingabeberichts. Der Wert ist 0, wenn das Gerät keine Report-IDs verwendet.

Beispiele

Report-ID beim Empfang ausgeben

// Muss durch eine Nutzeraktion ausgelöst werden (z. B. Klick)
const button = document.querySelector('#verbinden');

button.addEventListener('click', async () => {
  const [device] = await navigator.hid.requestDevice({ filters: [] });
  if (!device) return;

  await device.open();

  device.addEventListener('inputreport', (event) => {
    console.log(`Report-ID: ${event.reportId}, Länge: ${event.data.byteLength} Byte`);
  });
});
Report-ID: 1, Länge: 63 Byte

Berichte je nach Report-ID unterschiedlich auswerten

const handleReport = (event) => {
  const { reportId, data } = event;

  switch (reportId) {
    case 0x01: {
      // Tastenstatus: 1 Byte Bitmaske
      const buttons = data.getUint8(0);
      console.log('Taste A gedrückt:', Boolean(buttons & 0x01));
      break;
    }
    case 0x02: {
      // Sensorwerte: drei 16-Bit-Werte (Little Endian)
      const x = data.getInt16(0, true);
      const y = data.getInt16(2, true);
      const z = data.getInt16(4, true);
      console.log('Beschleunigung:', { x, y, z });
      break;
    }
    case 0:
      console.log('Gerät verwendet keine Report-IDs');
      break;
    default:
      console.warn('Unbekannte Report-ID:', reportId);
  }
};

const [device] = await navigator.hid.getDevices();
if (device) {
  await device.open();
  device.addEventListener('inputreport', handleReport);
}
Taste A gedrückt: true Beschleunigung: { x: 12, y: -340, z: 1021 }

Erwartete Report-IDs aus dem Deskriptor prüfen

const [device] = await navigator.hid.getDevices();

if (device) {
  // Bekannte Eingabe-Report-IDs aus den Collections sammeln
  const known = new Set(
    device.collections.flatMap((c) => c.inputReports.map((r) => r.reportId))
  );
  console.log('Bekannte Input-Report-IDs:', [...known]);

  await device.open();
  device.oninputreport = (event) => {
    if (!known.has(event.reportId)) {
      console.warn('Unerwarteter Bericht mit ID', event.reportId);
    }
  };
}
Bekannte Input-Report-IDs: [1, 2]

// Wichtig · Fallstricke

  • Report-ID nicht in data: Das Präfix-Byte wird entfernt. Rechne Offsets in event.data deshalb ab Byte 0 der Nutzdaten und nicht so, wie sie in der Gerätedokumentation inklusive ID-Byte angegeben sind.
  • 0 hat zwei Bedeutungen: 0 ist keine gültige Report-ID. Der Wert bedeutet nur, dass das Gerät keine IDs verwendet. Beim Senden mit HIDDevice.sendReport() übergibst du in diesem Fall ebenfalls 0.
  • Browser-Kompatibilität: WebHID wird nur von Chromium-Browsern auf dem Desktop unterstützt (Chrome, Edge, Opera). Firefox und Safari unterstützen die API nicht. Prüfe das vorab mit 'hid' in navigator.
  • Sicherheit: Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung. requestDevice() braucht eine Nutzeraktion und kann per Permissions-Policy (hid) gesperrt sein, zum Beispiel in iframes. Bestimmte Geräteklassen wie Tastaturen und FIDO-Schlüssel blockiert der Browser.
  • Die Eigenschaft ist schreibgeschützt. Wenn du ihr einen Wert zuweist, passiert nichts.