WebUSB verwenden

Die WebUSB API stellt nicht standardmäßige USB-kompatible Geräte (Universal Serial Bus) im Web bereit. Auf dieser Seite werden Aspekte der API beschrieben, die sich speziell auf Erweiterungen beziehen. Weitere Informationen zur WebUSB API finden Sie auf der MDN.

Verfügbarkeit in Erweiterungen

Chrome 118 oder höher.

Berechtigungen

Es sind keine Berechtigungen für Manifestdateien erforderlich. WebUSB löst jedoch den Nutzerberechtigungsvorgang 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 Erweiterungsdienst-Workern verwendet werden. Einzelheiten finden Sie im nächsten Abschnitt.

Wenn diese API in einem Extension Service Worker verwendet wird, hält die Geräteverbindungssitzung den Service Worker aktiv.

Unterschiede bei Chrome-Erweiterungen

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

Der folgende Code folgt einem typischen Muster. Dabei wird requestDevice() im Rahmen eines Berechtigungsvorgangs aufgerufen, für den eine Nutzergeste erforderlich ist. Wenn das Gerät übernommen wird, sendet es eine Nachricht an den Service Worker, 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();
    }
  }
});