Użyj WebUSB

Interfejs WebUSB API udostępnia w internecie niestandardowe urządzenia zgodne z uniwersalną magistralą szeregową (USB). Na tej stronie opisujemy aspekty interfejsu API, które są charakterystyczne dla rozszerzeń. Szczegółowe informacje o WebUSB API znajdziesz w dokumentacji MDN.

Dostępność w rozszerzeniach

Chrome w wersji 118 lub nowszej.

Uprawnienia

Nie są wymagane żadne uprawnienia pliku manifestu, ale WebUSB wywołuje proces uzyskiwania zgody użytkownika w przeglądarce.

Plik manifestu

Ten interfejs API nie wymaga kluczy manifestu.

Konteksty pomocnicze

Tego interfejsu API można używać w niemal każdym kontekście. Metody WebUSB.requestDevice() nie można używać w procesach roboczych usług rozszerzeń. Więcej informacji na ten temat można znaleźć w następnej sekcji.

Gdy ten interfejs API jest używany w skrypcie service worker rozszerzenia, sesja połączenia z urządzeniami utrzymuje skrypt service worker przy życiu.

Różnice między rozszerzeniami do Chrome

Chociaż interfejs WebUSB jest dostępny dla skryptów service worker rozszerzeń, funkcja WebUSB.requestDevice(), która zwraca obietnicę, która jest realizowana z instancją USBDevice, nie może być wywoływana w skrypcie service worker rozszerzenia. Aby to obejść, wywołaj requestDevice() ze strony rozszerzenia innej niż skrypt service worker rozszerzenia i wyślij wiadomość do skryptu service worker rozszerzenia.

Poniższy kod jest zgodny z typowym wzorcem, ponieważ wywołuje funkcję requestDevice() w ramach procesu uzyskiwania uprawnień, który wymaga gestu użytkownika. Gdy urządzenie zostanie przejęte, wysyła wiadomość do skryptu service worker, który może następnie pobrać urządzenie za pomocą funkcji getDevices().

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();
    }
  }
});