WebUSB verwenden

Die WebUSB API macht nicht standardmäßige USB-kompatible Geräte im Web verfügbar. Auf dieser Seite werden Aspekte der API beschrieben, die speziell für Erweiterungen gelten. Ausführliche Informationen zur WebUSB API finden Sie auf MDN.

Verfügbarkeit in Erweiterungen

Chrome 118 oder höher

Berechtigungen

Es sind keine Berechtigungen für Manifestdateien erforderlich. WebUSB löst jedoch den Nutzerberechtigungsablauf des Browsers aus.

Manifest

Für diese API sind keine Manifestschlüssel erforderlich.

Unterstützende Kontexte

Diese API kann in fast jedem Kontext verwendet werden. Die Methode WebUSB.requestDevice() kann nicht in Service Workern von Erweiterungen verwendet werden. Einzelheiten finden Sie im nächsten Abschnitt.

Wenn diese API in einem Erweiterungs-Service Worker verwendet wird, wird der Service Worker durch die Verbindungssitzung des Geräts aktiv gehalten.

Unterschiede bei Chrome-Erweiterungen

Obwohl WebUSB für Erweiterungs-Service-Worker verfügbar ist, kann WebUSB.requestDevice(), das ein Promise zurückgibt, das mit einer USBDevice-Instanz aufgelöst wird, nicht in einem Erweiterungs-Service-Worker aufgerufen werden. Um dieses Problem zu umgehen, rufen Sie requestDevice() von einer anderen Erweiterungsseite als dem Erweiterungs-Service-Worker auf und senden Sie eine Nachricht an den Erweiterungs-Service-Worker.

Der folgende Code folgt einem typischen Muster, indem requestDevice() als Teil eines Berechtigungsablaufs aufgerufen wird, für den eine Nutzergeste erforderlich ist. Wenn das Gerät erworben wird, wird eine Nachricht an den Service Worker gesendet, der das Gerät dann mit getDevices() abrufen kann.

popup.js:

myButton.addEventListener("click", async () => {
  await navigator.usb.requestDevice({
    filters: [{ vendorId: 0x1234, productId: 0x5678 }],
  });
  chrome.runtime.sendMessage("newDevice");
});

service-worker.js

chrome.runtime.onMessage.addListener(async (message) => {
  if (message === "newDevice") {
    const devices = await navigator.usb.getDevices();
    for (const device of devices) {
      // open device connection.
      await device.open();
    }
  }
});