【问题标题】:Migrating Chrome USB App API to Web USB API将 Chrome USB App API 迁移到 Web USB API
【发布时间】:2021-02-08 22:23:48
【问题描述】:
我目前有 Chrome 应用程序的源代码,但由于该平台已被弃用,我需要将我的 API 迁移到渐进式 Web 应用程序。
由于我仍然希望在我的 Web 平台应用程序中支持 USB,因此建议我使用 Web USB API 来保留功能,但我似乎无法找出以下等效项以及如何实现它们:
chrome.usb.releaseInterface()
chrome.usb.closeDevice()
chrome.usb.claimInterface()
chrome.usb.findDevices()
chrome.usb.bulkTransfer()
(另外,我还发现有一个 USB Library for Node.JS 也可以类似地工作;这也是一个不错的选择吗?)
【问题讨论】:
标签:
javascript
node.js
google-chrome-app
libusb
webusb
【解决方案1】:
WebUSB API 提供了一个USBDevice 接口,由navigator.usb.getDevices() 和navigator.usb.requestDevice() 返回。此接口的方法与上面列出的所有方法相同:
chrome.usb.releaseInterface() -> releaseInterface()
chrome.usb.closeDevice() -> close()
chrome.usb.claimInterface() -> claimInterface()
chrome.usb.bulkTransfer() -> transferIn() or transferOut().
chrome.usb.findDevices() 替换起来更复杂,首先需要解释 WebUSB API 和 chrome.usb API 的权限模型之间的区别。 WebUSB API 不提供访问 USB 设备的安装时权限。站点必须调用navigator.usb.requestDevice() 来请求用户访问新USB 设备的权限。对于具有序列号权限的设备会被记住,因此您可以致电navigator.usb.getDevices() 以获取当前已连接设备的列表,该站点先前已获得访问权限。这与chrome.usb.getUserSelectedDevices() 函数的模型相同。 chrome.usb.findDevices() 函数还在将设备返回给应用程序的过程中隐式打开设备。没有与此行为等效的方法。站点必须在这些方法返回的USBDevice 接口上显式调用open()。
请注意,如果将此应用程序部署到托管环境中,WebUsbAllowDevicesForUrls 策略可用于模拟 Chrome 应用程序权限模型。策略允许的设备将由navigator.usb.getDevices()返回,无需调用navigator.usb.requestDevice()并先提示用户。