Skip to content

WebUsbProvider

WebUsbProvider implementa SerialProvider usando la API WebUSB como polyfill para la Web Serial API nativa.

Cuándo usarlo

  • Android Chrome — Web Serial no está disponible; WebUSB es la única forma de comunicarse con adaptadores USB-serial.
  • Pruebas en escritorio — Forzar la ruta de código WebUSB para verificar el comportamiento antes de desplegar en Android.
  • Dispositivos USB personalizados — Dispositivos no expuestos vía Web Serial (ej. USB de clase vendor personalizada).

Protocolos soportados

ProtocoloClase USBNotas
CDC ACMClase 0x02Arduino estándar, ST-LINK
CP210x / CH340Vendor específicoPuentes USB-UART comunes
Bulk genéricoCualquier claseDispositivos de transferencia bulk

Importación

ts
import { WebUsbProvider } from "webserial-core";

Constructor

ts
new WebUsbProvider(options?: SerialPolyfillOptions)
OpciónTipoPor defectoDescripción
usbControlInterfaceClassnumber10Clase de interfaz USB para transferencias de control
usbTransferInterfaceClassnumber10Clase de interfaz USB para transferencias bulk

Para dispositivos con interfaces de clase vendor (CP210x, CH340):

ts
new WebUsbProvider({
  usbControlInterfaceClass: 255,
  usbTransferInterfaceClass: 255,
});

Uso

ts
import {
  AbstractSerialDevice,
  delimiter,
  WebUsbProvider,
} from "webserial-core";

AbstractSerialDevice.setProvider(
  new WebUsbProvider({
    usbControlInterfaceClass: 255,
    usbTransferInterfaceClass: 255,
  }),
);

class MyDevice extends AbstractSerialDevice<string> {
  constructor() {
    super({
      baudRate: 9600,
      parser: delimiter("\n"),
      filters: [{ usbVendorId: 0x10c4, usbProductId: 0xea60 }], // CP2102
    });
  }

  protected async handshake(): Promise<boolean> {
    return true;
  }
}

const device = new MyDevice();
await device.connect(); // Abre el selector de dispositivos WebUSB

Uso por instancia

Pasa provider (y opcionalmente polyfillOptions) en las opciones del constructor para vincular WebUsbProvider a una sola instancia sin modificar el proveedor global.

ts
import { AbstractSerialDevice, delimiter, WebUsbProvider } from "webserial-core";

class MyUsbDevice extends AbstractSerialDevice<string> {
  constructor() {
    super({
      baudRate: 9600,
      parser: delimiter("\n"),
      filters: [{ usbVendorId: 0x10c4, usbProductId: 0xea60 }],
      provider: new WebUsbProvider({
        usbControlInterfaceClass: 255,
        usbTransferInterfaceClass: 255,
      }),
    });
  }

  protected async handshake(): Promise<boolean> {
    return true;
  }
}

const device = new MyUsbDevice();
await device.connect();

También puedes pasar polyfillOptions por separado y dejar que la librería los reenvíe al proveedor que resuelva para esa instancia:

ts
class MyUsbDevice extends AbstractSerialDevice<string> {
  constructor() {
    super({
      baudRate: 9600,
      parser: delimiter("\n"),
      provider: new WebUsbProvider(),
      polyfillOptions: { usbControlInterfaceClass: 255 },
    });
  }

  protected async handshake(): Promise<boolean> {
    return true;
  }
}

Soporte de navegadores

Requiere un navegador basado en Chromium con WebUSB habilitado. No disponible en Firefox ni Safari. Requiere HTTPS o localhost.

Publicado bajo la licencia MIT.