DOMException:无法设置设备配置Chrome 86

问题描述

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(级别Debug)返回:

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

解决方法

由于USB(甚至是WebUSB)似乎比我使用的http连接更脆弱,所以与使用Javascript界面​​并行的同时,我还使用PyUSB提取数据。目标是将设备中的数据写入CSV文件,以便两者均可工作。

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

  • 重新启动计算机
  • 已连接设备
  • 一条 USB电缆
  • 在调试级别检查chrome://device-log
  • 使用Serial App的演示
  • 使用kexstat检查状态,使用kextunload“取消声明”
  • 使用dmesg查看内核日志

我想接受一个比此更健壮的“答案”,但我终于看到了一些数据:

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

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

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

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