Usa WebUSB

La API de WebUSB expone a la Web dispositivos compatibles con el bus universal en serie (USB) no estándar. En esta página, se describen aspectos de la API que son específicos de las extensiones. Consulta MDN para obtener todos los detalles de la API de WebUSB.

Disponibilidad en extensiones

Chrome 118 o versiones posteriores

Permisos

No se requieren permisos de archivo de manifiesto. Sin embargo, WebUSB activa el flujo de permisos del usuario del navegador.

Manifiesto

No se necesitan claves de manifiesto para esta API.

Contextos de apoyo

Esta API se puede usar en casi cualquier contexto. El método WebUSB.requestDevice() no se puede usar en los service workers de extensiones. Consulte la siguiente sección para obtener más detalles.

Cuando se usa esta API en un service worker de extensión, la sesión de conexión de los dispositivos mantiene activo el service worker.

Diferencias entre las extensiones de Chrome

Si bien WebUSB está disponible para los service workers de extensiones, no se puede llamar a WebUSB.requestDevice(), que devuelve una promesa que se resuelve con una instancia de USBDevice, en un service worker de extensión. Para evitar esto, llama a requestDevice() desde una página de extensión que no sea el service worker de la extensión y envía un mensaje al service worker de la extensión.

El siguiente código sigue un patrón típico llamando a requestDevice() como parte de un flujo de permisos que requiere un gesto del usuario. Cuando se adquiere el dispositivo, este envía un mensaje al service worker, que luego puede recuperar el dispositivo con 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();
    }
  }
});