问题描述
我一直在研究一个小型项目,以基于嵌入式linux,Bluez和python实现的代码来仿真Bluetooth HID设备。这个想法是在键盘和鼠标设备上寻找输入事件,将其解析并转发给蓝牙主机。一切正常,除了Windows上的鼠标行为。
在Android和Linux目标上,鼠标的行为就很好:按钮,滚动和移动均按预期进行。但是,在Windows目标上,会观察到以下情况:
- 跳跃运动,即使是最轻微的运动,i。 e。发送单位运动的报告会产生许多像素的光标运动;
- 滚动无响应,即例如,在物理鼠标上滚动会生成输入事件,由应用程序对其进行提示,然后将其转发到主机设备,但Windows不会对其进行响应。
我设计了一个USB HID描述符,该描述符嵌入在SDP记录中,包括滚动定义,如下所示-如果由https://eleccelerator.com/usbdescreqparser/正确解析了:)
对此事有何想法?
0x05,0x01,// Usage Page (Generic Desktop Ctrls)
0x09,0x06,// Usage (Keyboard)
0xA1,// Collection (Application)
0x85,// Report ID (1)
0xA1,0x00,// Collection (Physical)
0x05,0x07,// Usage Page (Kbrd/Keypad)
0x19,0xE0,// Usage Minimum (0xE0)
0x29,0xE7,// Usage Maximum (0xE7)
0x15,// Logical Minimum (0)
0x25,// Logical Maximum (1)
0x75,// Report Size (1)
0x95,0x08,// Report Count (8)
0x81,0x02,// Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95,// Report Count (1)
0x75,// Report Size (8)
0x81,// Input (Const,Array,// Report Count (8)
0x75,// Report Size (8)
0x15,0x65,// Logical Maximum (101)
0x05,// Usage Minimum (0x00)
0x29,// Usage Maximum (0x65)
0x81,No Null Position)
0xC0,// End Collection
0xC0,// End Collection
0x05,// Usage (Mouse)
0xA1,// Report ID (2)
0x09,// Usage (Pointer)
0xA1,0x09,// Usage Page (Button)
0x19,// Usage Minimum (0x01)
0x29,0x03,// Usage Maximum (0x03)
0x15,// Report Count (3)
0x81,No Null Position)
0x75,0x05,// Report Size (5)
0x95,// Report Count (1)
0x81,No Null Position)
0x05,// Usage Page (Generic Desktop Ctrls)
0x09,0x30,// Usage (X)
0x09,0x31,// Usage (Y)
0x09,0x38,// Usage (Wheel)
0x15,0x81,// Logical Minimum (-127)
0x25,0x7F,// Logical Maximum (127)
0x75,// Report Size (8)
0x95,Rel,// End Collection
// 104 bytes
解决方法
发现了问题。实际上有一些。
首先,对蓝牙配置文件的服务记录(未发布在原始帖子中)进行不良记录:它在属性0x0009(BluetoothProfileDescriptorList)上存在问题,该属性未正确设置应该设置的内容:配置文件版本,例如根据人机接口配置文件1.1蓝牙规范。一旦设置正确,鼠标就会开始工作,但键盘又一次退出了我。
然后,我注意到我正在使用的样板HID描述符期望我发送8个字节的活动密钥,因为它读取时(请参阅原始帖子):
...
0x95,0x08,// Report Count (8)
0x75,// Report Size (8)
...
我在报告中只发送了6个字节。正确后,Windows会正确接受鼠标和键盘的输入。
毕竟,似乎Linux的HIDP实现比Windows的宽容。
(从自定义键盘和鼠标组合设备本身输入:D)