Start · Sprachen · JavaScript · Referenz · USBDevice.productId

USBDevice.productId

Eigenschaft

Schreibgeschützte Eigenschaft mit der 16-Bit-Produktkennung (PID) eines USB-Geräts, die der Hersteller vergibt.

seit JavaScript Chrome/Edge 61+, Opera 48+ (nicht in Firefox und S Kategorie: webapi

Signatur

USBDevice.productId

Beschreibung

Die Eigenschaft productId eines USBDevice-Objekts gibt die Product ID (PID) zurück. Das ist eine 16-Bit-Zahl aus dem Gerätedeskriptor (idProduct), mit der ein Hersteller seine Produkte unterscheidet. Zusammen mit vendorId (VID), die das USB Implementers Forum vergibt, bestimmt sie das Gerätemodell eindeutig.

Typische Einsätze sind Filter in navigator.usb.requestDevice(), damit der Auswahldialog nur passende Geräte anzeigt, außerdem das Wiedererkennen bereits freigegebener Geräte über navigator.usb.getDevices() und das Auswählen des passenden Treiber- oder Protokollcodes in der eigenen Anwendung.

Der Wert ist eine gewöhnliche Zahl (number) von 0 bis 0xFFFF. In Datenblättern und in Werkzeugen wie lsusb steht die PID meist hexadezimal, zum Beispiel 0x2341:0x0043. Zum Anzeigen formatiert man sie deshalb am besten mit toString(16) und padStart(4, "0").

Rückgabewert

Typ
number
Beschreibung
Vorzeichenlose 16-Bit-Ganzzahl (0–65535) mit der Produktkennung aus dem Gerätedeskriptor.

Beispiele

Gerät mit VID/PID-Filter anfordern

// Muss durch eine Nutzeraktion ausgelöst werden (z. B. Klick)
document.querySelector('#connect').addEventListener('click', async () => {
  try {
    const device = await navigator.usb.requestDevice({
      filters: [{ vendorId: 0x2341, productId: 0x0043 }] // Arduino Uno
    });
    console.log(`Verbunden: ${device.productName} (PID ${device.productId})`);
  } catch (err) {
    console.warn('Kein Gerät ausgewählt:', err.message);
  }
});
Verbunden: Arduino Uno (PID 67)

PID hexadezimal formatieren

const toHex = (n) => '0x' + n.toString(16).padStart(4, '0');

const devices = await navigator.usb.getDevices();
for (const d of devices) {
  console.log(`${toHex(d.vendorId)}:${toHex(d.productId)} – ${d.productName ?? 'unbekannt'}`);
}
0x2341:0x0043 – Arduino Uno

Unterstütztes Modell am Verbindungsereignis erkennen

const SUPPORTED = new Map([
  ['2341:0043', 'Arduino Uno'],
  ['2341:8036', 'Arduino Leonardo']
]);

navigator.usb.addEventListener('connect', ({ device }) => {
  const key = `${device.vendorId.toString(16).padStart(4, '0')}:${device.productId.toString(16).padStart(4, '0')}`;
  const model = SUPPORTED.get(key);
  console.log(model ? `Bekanntes Gerät: ${model}` : `Nicht unterstützt: ${key}`);
});
Bekanntes Gerät: Arduino Leonardo

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie device.productId = 1 wird ignoriert und löst im Strict Mode einen TypeError aus.
  • Nur zusammen mit vendorId eindeutig: Zwei verschiedene Hersteller können dieselbe PID verwenden. Man sollte also nie nur nach productId filtern. Ein Filter mit productId ohne vendorId ist laut Spezifikation sogar ungültig und führt zu einem TypeError.
  • Keine Seriennummer: Mehrere Geräte desselben Modells haben dieselbe PID. Um einzelne Exemplare zu unterscheiden, nutzt man serialNumber.
  • PID kann sich ändern: Manche Geräte melden sich im Bootloader- oder DFU-Modus mit einer anderen PID an. Das muss man beim Filtern berücksichtigen.
  • Kompatibilität: WebUSB gibt es nur in Chromium-Browsern (Chrome, Edge, Opera) und nur in sicheren Kontexten (HTTPS). Firefox und Safari unterstützen die API nicht. Man sollte vorher mit 'usb' in navigator prüfen. Die Nutzung kann außerdem per Permissions-Policy (usb) gesperrt sein.
  • Geräteklassen, die das Betriebssystem schützt (zum Beispiel HID-Tastaturen), stehen über WebUSB nicht zur Verfügung, auch wenn VID und PID stimmen.