Windows上自定义开发的蓝牙鼠标的问题

问题描述

我一直在研究一个小型项目,以基于嵌入式linux,Bluez和python实现的代码来仿真Bluetooth HID设备。这个想法是在键盘和鼠标设备上寻找输入事件,将其解析并转发给蓝牙主机。一切正常,除了Windows上的鼠标行为。

在Android和Linux目标上,鼠标的行为就很好:按钮,滚动和移动均按预期进行。但是,在Windows目标上,会观察到以下情况:

  1. 跳跃运动,即使是最轻微的运动,i。 e。发送单位运动的报告会产生许多像素的光标运动;
  2. 滚动无响应,即例如,在物理鼠标上滚动会生成输入事件,由应用程序对其进行提示,然后将其转发到主机设备,但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)