【问题标题】:How to claim interface using WebUSB?如何使用 WebUSB 声明接口?
【发布时间】:2017-04-21 04:19:44
【问题描述】:

使用navigator.usb.requestDevice 获得对附加设备的访问权限后,我正尝试打开与附加设备的连接,如下所示:

device.open()
    .then(() => device.selectConfiguration(1))
    .then(() => device.claimInterface(1))

看似成功选择了配置,但是claimInterface这一步会产生如下错误:

DOMException: Unable to claim interface.

我在 Ubuntu 16.10 上以 root 身份运行带有 --disable-webusb-security 标志的 Chrome 55.0.2883.75 测试版(没有那些我没有获得任何设备)。

我怎样才能建立并运行连接?

编辑:

似乎 cdc_acm 驱动程序已经声明了该接口,因为我尝试附加的设备是一个串行设备,卸载驱动程序将允许您声明该设备(但是在此之后它抱怨接口 1 不可用,因为以及 0 或 2)。

【问题讨论】:

  • 由于此设备有多个接口,我们应该确保您声明正确的接口。请为您的设备包含lsusb -v 的输出,其中将列出完整的设备描述符。 USB CDC 设备确实很难与 WebUSB 一起使用,因为加载了现有的驱动程序,但是强制卸载驱动程序应该释放接口。当您收到“无法声明接口”之类的错误时,Chrome 可能会在 chrome://device-log 中提供有关该错误的更多详细信息。

标签: javascript google-chrome chromium webusb


【解决方案1】:

选择配置后,您可以在device.configuration.interfaces[0].interfaceNumber中找到正确的接口号:

device.open()
    .then(() => device.selectConfiguration(1))
    .then(() => device.claimInterface(device.configuration.interfaces[0].interfaceNumber))

【讨论】:

  • 感谢您的回答。我使用您在此处建议的方法找到的数字 0、1 和 2。但所有这些都会产生相同的错误。
  • @JorisBlaak 您尝试访问哪种设备?您是否尝试过使用其他设备(例如 USB 密钥)?
  • 一个串行设备,如 Edit 中所述,它已被驱动程序声明
  • 那么现在可以了吗?如果没有,也许你可以尝试 device.reset() 来释放接口。
  • @Supersharp 这是我得到的:“无法声明接口:访问被拒绝(权限不足)”有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2016-12-24
  • 2018-01-19
  • 2010-09-24
相关资源
最近更新 更多