Используйте веб-USB

API WebUSB предоставляет доступ к сети для нестандартных устройств, совместимых с универсальной последовательной шиной (USB). На этой странице описаны аспекты API, характерные для расширений. Полную информацию об API WebUSB см. на MDN.

Доступность в расширениях

Chrome версии 118 или более поздней.

Разрешения

Для доступа к файлам манифеста не требуются разрешения; однако WebUSB запускает процесс получения разрешений от пользователя в браузере.

Манифест

Для этого API не требуются ключи манифеста.

Вспомогательные контексты

Этот API можно использовать практически в любом контексте; метод WebUSB.requestDevice() нельзя использовать в рабочих процессах служб расширений. Подробности см. в следующем разделе.

При использовании этого API в сервисном воркере расширения сессия подключения устройства поддерживает активность сервисного воркера.

Различия расширений Chrome

Хотя WebUSB доступен для обработчиков служб расширений, WebUSB.requestDevice() , возвращающий промис, который разрешается с экземпляром USBDevice , нельзя вызвать в обработчике службы расширений. Чтобы обойти это ограничение, вызовите requestDevice() со страницы расширения, отличной от обработчика службы расширений, и отправьте сообщение обработчику службы расширений.

Приведенный ниже код следует типичному шаблону, вызывая requestDevice() в рамках процесса управления разрешениями, требующего действия пользователя. После получения устройства он отправляет сообщение сервис-воркеру, который затем может получить доступ к устройству с помощью 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();
    }
  }
});