使用 WebUSB

WebUSB API 可将非标准通用串行总线 (USB) 兼容设备连接到网络。本页面介绍了特定于扩展程序的 API 的各个方面。如需详细了解 WebUSB API,请参阅 MDN。

扩展程序中的可用性

Chrome 118 或更高版本。

权限

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

清单

此 API 不需要清单键。

辅助性上下文

此 API 几乎可以在任何上下文中使用;WebUSB.requestDevice() 方法不能在扩展 Service Worker 中使用。有关详情,请参见下文。

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

Chrome 扩展程序差异

虽然 WebUSB 可供扩展 Service Worker 使用,但无法在扩展 Service Worker 中调用 WebUSB.requestDevice()(它会返回使用 USBDevice 实例解析的 promise)。要解决此问题,请从扩展程序 Service Worker 以外的扩展页面调用 requestDevice(),然后向 Extensions Service Worker 发送消息。

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