【问题标题】:When should one use WebHID as opposed to WebUSB?什么时候应该使用 WebHID 而不是 WebUSB?
【发布时间】:2021-07-11 10:39:08
【问题描述】:

我有一个专有的 USB 设备,它具有通过 USB 闪烁的功能。我想在浏览器中复制这个闪烁功能,但我不确定要使用什么 API。

访问chrome://usb-internals/ 来检查我的设备给了我以下信息:

设备使用类代码 8:大容量存储来宣传自己。该设备未显示在我的文件系统中,例如它不是普通的 USB 随身碟。根据this StackOverflow answer的说法,由于安全原因,WebUSB被阻止访问大容量存储设备,我应该改用WebHID。

但是,使用 WebHID 仍然不允许我连接到我的设备。这是我使用的示例代码:

const filter = [
  {
    vendorId: 0xabcd, // correct VID:PID obtained via lsusb
    productId: 0x1234
  }
];

const [device] = await navigator.hid.requestDevice({ filter });

此外,访问chrome://device-log/ 会在 USB 和 HID 设备之间产生明显差异。例如,当我插入鼠标时,Chrome 设备日志显示连接了 USB HID 设备。当我插入 USB pendrive 时,调试日志中有两行:一个 HID 设备,一个大容量存储设备。当我插入我的专有驱动器时,我得到一条线:USB 大容量存储设备。

如何说服 WebHID 连接到我的专有大容量存储设备?

【问题讨论】:

    标签: javascript google-chrome usb webusb webhid


    【解决方案1】:

    如果没有大的改变是不可能的:

    USB mss 存储使用批量端点,HID 通过控制和中断端点传输。

    您可以在单个 USB 设备(带有 IAD)上同时实现大容量存储和 HID,但 HID 的引导加载程序代码看起来与大容量存储的代码有很大不同。

    USB 随身碟通常不支持 HID,除非有 LED 或按钮。

    【讨论】:

    • 这是否意味着 Google Chrome 中不存在可以与此设备交互的 API?对于 WebDFU、WebUSB、WebHID、WebSerial、WebBluetooth,这似乎是谷歌的一个奇怪的疏忽。这个设备没有被我的实际操作系统声明,它不是一个普通的文件系统。它仅使用批量传输从专有闪存传输数据。
    • 从安全的角度来看,情况更糟。能够访问原始 SCSI 层可能会使硬件变砖、设置主机保护区或发出数据的安全擦除。你真的不希望浏览器应用能够做到这一点......
    • 由于设备将自己宣传为 USB 大容量存储设备,Chrome 必须假设它实际上是一个。我不知道为什么操作系统不将其识别为存储设备。也许它确实将其识别为存储设备,但它没有受支持的文件系统。如果是这样,那么您可以使用File System Access API 向其写入文件。不幸的是,在不违反我们在设计中内置的安全属性的情况下,我们可以做些什么来支持“不寻常”的设备。
    【解决方案2】:

    您可以为设备安装 WinUSB 驱动程序(Zadig 非常简单),然后使用 WebUSB 连接到设备。

    如果您需要编写自己的 SCSI 层,请here's how we did it 用于血糖仪,该血糖仪也可以作为大容量存储设备安装以传输数据。

    【讨论】:

    • 如果设备只提供USB大容量存储接口,那么该接口将被WebUSB阻塞。
    • @ReillyGrant 是否不能用该接口的 WinUSB 驱动程序替换现有驱动程序?
    • 更换驱动不会改变接口类。
    • 这很不幸。是否有某种我们可以申请的许可名单,因为似乎有许多设备使用块模式访问,而文件系统访问 API 不可行?
    • @ReillyGrant 查看bugs.chromium.org/p/chromium/issues/detail?id=1056757 似乎将来可以用企业策略覆盖接口阻止列表?
    猜你喜欢
    • 2019-06-15
    • 2011-06-22
    • 2015-12-11
    • 2012-02-12
    • 2012-06-27
    • 2010-11-29
    • 2015-12-23
    • 2012-12-09
    相关资源
    最近更新 更多