如何在Android上使用UsbDeviceConnection从HID设备请求USB HID报告描述符
我正在尝试使用如何在Android上使用UsbDeviceConnection从HID设备请求USB HID报告描述符,android,usb,hid,Android,Usb,Hid,我正在尝试使用UsbDeviceConnection.controlTransfer获取USB设备的HID报告描述符,以便查看USB HID设备有哪些按钮 我已经能够通过使用bulkTransfer从HID设备获取实际输入数据 我已经查过了,只能找到创建和解析HID报告描述符的教程。我试着在不同的周长内进入controlTransfer,但我一直无法找到答案 我应该将哪些值传递到controlTransfer以获取USB HID报告描述符,这样我就可以开始解析设备有哪些按钮以及它们分配给哪些字节
UsbDeviceConnection.controlTransfer
获取USB设备的HID报告描述符,以便查看USB HID设备有哪些按钮
我已经能够通过使用bulkTransfer
从HID设备获取实际输入数据
我已经查过了,只能找到创建和解析HID报告描述符的教程。我试着在不同的周长内进入controlTransfer
,但我一直无法找到答案
我应该将哪些值传递到
controlTransfer
以获取USB HID报告描述符,这样我就可以开始解析设备有哪些按钮以及它们分配给哪些字节?或者您不应该使用controlTransfer
获取HID报告描述符吗?我刚开始使用USB。这真的很晚了,但如果你还没有想出解决方案,或者其他人正在寻找解决方案,这就是我的解决方案。我应该提到的是,我对这些都不是很有经验,所以一些细节可能不清楚,但总体情况是这样的
UsbDeviceConnection.controlTransfer
需要7个变量:
- 请求类型
- 请求
- 请求值
- 请求索引
- 输出缓冲区
- 缓冲区大小
- 超时
0b10000001
或0x81
请求描述了我们的具体请求。我们正在寻找HID报告描述符,GET\u描述符
被规范定义为0x06
请求值由描述符类型作为高字节和接口索引作为低字节组成。在我们的例子中,描述符类型是HID报告或0x22
(这来自HID规范,特别是类描述符)。接口的索引与下面的请求索引相同。在我的例子中,它是0x00
,但你的可能不同。结合高位和低位,我们得到请求值的0x2200
请求索引指定要查询的接口。如果HID是设备的唯一接口,则这将是0x00
。否则,您必须检查配置描述符中可用接口的类型及其索引
输出缓冲区是分配给事务返回的空间,应为缓冲区大小指定的大小,如下所述
缓冲区大小描述报告描述符中的字节数。该值在配置描述符、HID类特定描述符(bDescriptorType
=0x21
)中指定,是9个总字节中第8个字节(wDescriptorLength
)的值。在我的例子中,这个值是104
Timeout是放弃的毫秒数。我使用了2000
把这些放在一起,UsbDeviceConnection.controltransfer(0x81、0x06、0x2200、0x00,byte[]buffer,1042000)
提供了controlTransfer
中使用的位字段的极好概述,如果需要更多上下文,请查看
是理解USB和HID描述符的非常有用的工具,可能比单独阅读规范表和API更有见地。谢谢,我用一个通用USB游戏板测试了它,它成功了。你知道如何使用上述方法(UsbDeviceConnection.ControlTransfer)在USB读卡器中发出嘟嘟声吗?