Użyj WebUSB

Interfejs WebUSB API udostępnia w internecie niestandardowe urządzenia zgodne z uniwersalną magistralą szeregową (USB). Na tej stronie opisaliśmy aspekty interfejsu API, które dotyczą głównie rozszerzeń. Pełne informacje o interfejsie WebUSB API znajdziesz w dokumentacji MDN.

Dostępność w rozszerzeniach

Chrome 118 lub nowsza.

Uprawnienia

Uprawnienia do pliku manifestu nie są wymagane. jednak WebUSB wyzwala przepływ zgody użytkownika w przeglądarce.

Plik manifestu

W przypadku tego interfejsu API nie są potrzebne klucze manifestu.

Konteksty obsługiwane

Można go używać w prawie każdym kontekście; Metody WebUSB.requestDevice() nie można używać w instancjach roboczych usługi rozszerzenia. Więcej informacji na ten temat można znaleźć w następnej sekcji.

Jeśli ten interfejs API jest używany w skrypcie service worker rozszerzenia, sesja połączenia urządzenia utrzymuje aktywny skrypt service worker.

Różnice między rozszerzeniami do Chrome

Interfejs WebUSB jest dostępny dla skryptów service worker usługi rozszerzeń, ale w skrypcie nie można wywołać funkcji WebUSB.requestDevice(), która zwraca obietnicę, która jest rozwiązywana za pomocą instancji USBDevice. Aby obejść ten problem, wywołaj requestDevice() z poziomu strony rozszerzenia innej niż skrypt service worker i wyślij wiadomość do skryptu service worker.

Poniższy kod jest zgodny z typowym wzorcem i wywołuje funkcję requestDevice() w ramach procesu uzyskiwania uprawnień wymagającego działania użytkownika. Gdy urządzenie zostanie pobrane, wysyła wiadomość do usługi, która może je następnie pobrać za pomocą 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();
    }
  }
});