这真的很晚了,但如果您还没有提出解决方案或其他人正在寻求这样做,这就是我的解决方案。我应该提一下,我对这些都不是很有经验,所以有些细节可能会被关闭,但总体情况是存在的。
UsbDeviceConnection.controlTransfer 需要 7 个变量:
- 请求类型
- 请求
- 请求值
- 请求索引
- 输出缓冲区
- 缓冲区大小
- 超时
请求类型描述了转移的方向、类型和接收者。在这种情况下,我们想要使用标准 (00) 传输读取 (1),并且我们想要查询接口 (00001)。我们要查询一个接口,因为 HID 是设备的一个接口。所以,0b10000001 或 0x81。
请求描述了我们的具体请求。我们正在寻找 HID 报告描述符,而 GET_DESCRIPTOR 被规范定义为 0x06。
请求值由高字节的描述符类型和低字节的接口索引组成。在我们的例子中,描述符类型是 HID Report 或 0x22(这是来自 HID 规范,特别是类描述符)。该接口的索引与下面的请求索引相同。就我而言,它是0x00,但你的可能会有所不同。结合高位和低位,我们得到0x2200作为我们的请求值。
请求索引指定您正在查询的接口。如果 HID 是设备的唯一接口,那么这将是 0x00。否则,您必须检查配置描述符中可用的接口类型及其索引。
输出缓冲区是为交易返回分配的空间,应该是缓冲区大小指定的大小,解释如下。
缓冲区大小描述报告描述符中的字节数。此值在配置描述符中指定,在特定于 HID 类的描述符 (bDescriptorType = 0x21) 中指定,并且是总共 9 个字节中的第 8 个字节 (wDescriptorLength) 的值。在我的例子中,这个值为 104。
Timeout 是放弃的毫秒数。我用2000。
把这些放在一起,UsbDeviceConnection.controlTranfer(0x81, 0x06, 0x2200, 0x00, byte[] buffer, 104, 2000)。
https://www.beyondlogic.org/usbnutshell/usb6.shtml 很好地概述了controlTransfer 中使用的位字段,如果您需要更多上下文,请查看。
https://eleccelerator.com/usbdescreqparser/ 是理解 USB 和 HID 描述符的非常有用的工具,可能比单独阅读规格表和 API 更有洞察力。