使用 WebUSB

WebUSB API 可将非标准通用串行总线 (USB) 兼容设备公开到网络。本页介绍了扩展程序专有的 API 方面。如需了解 WebUSB API 的完整详情,请参阅 MDN。

在扩展程序中的可用性

Chrome 118 或更高版本。

权限

不需要清单文件权限;但 WebUSB 会触发浏览器的用户权限流程。

清单

此 API 不需要清单密钥。

支持的上下文

此 API 几乎可在任何上下文中使用;WebUSB.requestDevice() 方法无法在扩展程序服务工作器中使用。有关详情,请参见下文。

在扩展程序 Service Worker 中使用此 API 时,设备连接会话会使 Service Worker 保持活跃状态。

Chrome 扩展程序差异

虽然 WebUSB 可供扩展程序 Service Worker 使用,但无法在扩展程序 Service Worker 中调用 WebUSB.requestDevice(),它会返回使用 USBDevice 实例进行解析的 promise。如需解决此问题,请从扩展程序页面(而非扩展程序服务 worker)调用 requestDevice(),并向扩展程序服务 worker 发送消息。

以下代码遵循典型模式,在需要用户手势的权限流程中调用 requestDevice()。获取设备后,它会向 Service Worker 发送消息,然后 Service Worker 可以使用 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();
    }
  }
});