【问题标题】:DOMException: Unable to set device configuration Chrome 86DOMException:无法设置设备配置 Chrome 86
【发布时间】:2020-11-01 05:56:29
【问题描述】:

WebUSB 的coverage 非常有限,但是对于这个项目来说没关系。

navigator.usb.requestDevice 方法成功:

navigator.usb.requestDevice({
                    filters: [{
                        vendorId: RECEIVER_VENDOR_ID,
                        productId: RECEIVER_PRODUCT_ID
                    }]
                })

Chrome 获得访问设备的权限(通过模态交互)。

对于浏览器来说,设备存在:

console.log(device)

USBDevice {usbVersionMajor: 2, usbVersionMinor: 0, usbVersionSubminor: 0, deviceClass: 2, deviceSubclass: 2, …}
configuration: null
configurations: [USBConfiguration]
deviceClass: 2
deviceProtocol: 0
deviceSubclass: 2
deviceVersionMajor: 2
deviceVersionMinor: 0
deviceVersionSubminor: 0
manufacturerName: "STMicroelectronics"
opened: true
productId: 22336
productName: "STM32 Virtual ComPort"
serialNumber: "355837673037"
usbVersionMajor: 2
usbVersionMinor: 0
usbVersionSubminor: 0
vendorId: 1155
__proto__: etc...

我关注的例子receiver与Mozilla docs相呼应:

await usbDevice.selectConfiguration(1)

(ReceiverParcer is here)

通过Web.dev article 了解通过网络访问 USB,同时希望获得一些 SO Magic。

我没有看到/做什么?

谢谢。

更新

检查 chrome://device-log(调试级别)返回:

USBUser[14:51:38] USB device added: vendor=1155 "STMicroelectronics", product=22336 "STM32 Virtual ComPort", serial="355837673037", guid=2bd99a9a-75bf-4782-8a0d-2f9e13b06e86

USBUser[14:51:30] USB device removed: guid=1b763328-45db-4152-9c56-9b592d614c3e

USBEvent[14:51:30] Failed to clear halt: Pipe error

【问题讨论】:

  • 您在哪个平台上运行?如果您查看 chrome://device-log(将级别更改为“调试”),您应该会收到有关选择配置失败的更详细错误。
  • @ReillyGrant 谢谢。更新帖子,看到“无法清除停止:管道错误”。
  • 该错误指向对 clearHalt() 的调用失败,而不是 selectConfiguration()。请检查您的代码以确保它在您认为的位置失败。未能清除停止条件可能表示与设备的更致命的通信错误。如果您检查内核日志 (dmesg),可能会有更多错误表明遇到的问题的根源,因为这可能表明与设备的连接不稳定。请使用其他 USB 数据线重试。
  • 我想我已经尝试过使用几种不同的电缆,并且会再试一次,也会重新启动。 dmesg 的输入是gist.github.com/MikeiLL/85e8bdada20fff7c74d3461bc2ca48c8,如果您还有时间看一下。

标签: webusb


【解决方案1】:

因为 USB(甚至 WebUSB)似乎比我使用的 http 连接更脆弱,与使用 Javascript 接口并行,我还致力于使用 PyUSB 提取数据。目标是将设备中的数据写入 CSV 文件,以便两者都可以工作。

在此related post 中,我概述了该过程中的一些其他步骤,包括:

  • 重启机器
  • 设备已连接
  • 一条USB线
  • 在 DEBUG 级别检查 chrome://device-log
  • 使用Serial App 的演示
  • kexstat检查状态,用kextunload“取消认领”
  • dmesg查看内核日志

我愿意接受比这更可靠的“答案”,但我终于看到了一些数据:

let rawStream = new Uint8Array(data.buffer)
console.log(rawstream)

Uint8Array(69) [51, 48, 49, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 13, 10]

let segments = String.fromCharCode.apply(null, rawStream).split(' ')
console.log(segments)

 ["300", "V1.06", "585AEEDD", "00000000", "00000000", "00000000", "00000000", "00000000", "00000000", "
↵"]

【讨论】:

  • 很抱歉没有提前注意到您正在处理串行设备。您可以继续使用操作系统来访问原始 USB 层的设备,但我建议利用新的Web Serial API。此 API 的结构类似于 WebUSB,但专门设计用于访问串行设备,无论是通过 USB 还是其他传输(如蓝牙)。它将使用您可能会使用的内置 macOS 驱动程序来控制设备,并且是“串行”应用程序可能使用的。
  • 此 API 仍在开发中,因此需要启用 chrome://flags/#enable-experimental-web-platform-features 标志或在此处注册您的域以进行 Origin 试用:developers.chrome.com/origintrials/#/view_trial/…跨度>
  • François 写了一篇关于串行 API 入门的优秀文章:web.dev/serial
猜你喜欢
  • 2020-09-03
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多