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

Windows上自定义开发的蓝牙鼠标的问题,windows,bluetooth,mouse,hid,Windows,Bluetooth,Mouse,Hid,我一直在做一个模拟蓝牙HID设备的小项目,它基于嵌入式linux、Bluez和python实现的代码。这个想法是寻找键盘和鼠标设备上的输入事件,解析它并转发给蓝牙主机。除了在Windows上的鼠标行为外,一切正常 在Android和Linux的目标系统上,鼠标表现得很好:按钮、滚动和移动都按预期工作。但是,在Windows目标上,观察到以下情况: 跳跃的动作,即使是最轻微的动作,我。e、 ,发送带有单位移动的报告会产生许多像素的光标移动 我认为卷轴是不负责任的。e、 ,在物理鼠标上滚动会生成输入

我一直在做一个模拟蓝牙HID设备的小项目,它基于嵌入式linux、Bluez和python实现的代码。这个想法是寻找键盘和鼠标设备上的输入事件,解析它并转发给蓝牙主机。除了在Windows上的鼠标行为外,一切正常

在Android和Linux的目标系统上,鼠标表现得很好:按钮、滚动和移动都按预期工作。但是,在Windows目标上,观察到以下情况:

  • 跳跃的动作,即使是最轻微的动作,我。e、 ,发送带有单位移动的报告会产生许多像素的光标移动
  • 我认为卷轴是不负责任的。e、 ,在物理鼠标上滚动会生成输入事件,该事件由应用程序控制,它会发送到主机设备,但Windows不会响应
  • 我设计了一个USB HID描述符,它嵌入在SDP记录中,包括滚动的定义,如下所示-如果正确解析为:)

    对这件事有什么想法吗

    0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
    0x09, 0x06,        // Usage (Keyboard)
    0xA1, 0x01,        // Collection (Application)
    0x85, 0x01,        //   Report ID (1)
    0xA1, 0x00,        //   Collection (Physical)
    0x05, 0x07,        //     Usage Page (Kbrd/Keypad)
    0x19, 0xE0,        //     Usage Minimum (0xE0)
    0x29, 0xE7,        //     Usage Maximum (0xE7)
    0x15, 0x00,        //     Logical Minimum (0)
    0x25, 0x01,        //     Logical Maximum (1)
    0x75, 0x01,        //     Report Size (1)
    0x95, 0x08,        //     Report Count (8)
    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x95, 0x01,        //     Report Count (1)
    0x75, 0x08,        //     Report Size (8)
    0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x95, 0x08,        //     Report Count (8)
    0x75, 0x08,        //     Report Size (8)
    0x15, 0x00,        //     Logical Minimum (0)
    0x25, 0x65,        //     Logical Maximum (101)
    0x05, 0x07,        //     Usage Page (Kbrd/Keypad)
    0x19, 0x00,        //     Usage Minimum (0x00)
    0x29, 0x65,        //     Usage Maximum (0x65)
    0x81, 0x00,        //     Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0xC0,              //   End Collection
    0xC0,              // End Collection
    0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
    0x09, 0x02,        // Usage (Mouse)
    0xA1, 0x01,        // Collection (Application)
    0x85, 0x02,        //   Report ID (2)
    0x09, 0x01,        //   Usage (Pointer)
    0xA1, 0x00,        //   Collection (Physical)
    0x05, 0x09,        //     Usage Page (Button)
    0x19, 0x01,        //     Usage Minimum (0x01)
    0x29, 0x03,        //     Usage Maximum (0x03)
    0x15, 0x00,        //     Logical Minimum (0)
    0x25, 0x01,        //     Logical Maximum (1)
    0x75, 0x01,        //     Report Size (1)
    0x95, 0x03,        //     Report Count (3)
    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x75, 0x05,        //     Report Size (5)
    0x95, 0x01,        //     Report Count (1)
    0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x05, 0x01,        //     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, 0x08,        //     Report Size (8)
    0x95, 0x03,        //     Report Count (3)
    0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
    0xC0,              //   End Collection
    0xC0,              // End Collection
    
    // 104 bytes
    

    发现了问题。实际上有一些

    首先,蓝牙配置文件的服务记录(未发布在原始帖子上)格式不正确:它在属性0x0009(BluetoothProfileDescriptorList)上存在问题,该属性未正确设置应设置的内容:根据人机界面设备配置文件1.1蓝牙规范,配置文件版本。一旦我做对了,鼠标就开始工作了,但键盘又在我身上停了下来

    然后,我注意到我正在使用的样板HID描述符期望我在读取时为活动密钥发送8个字节(参见原始帖子):

    我只发送了6个字节的报告。在我得到正确答案后,windows正确地接受了鼠标和键盘的输入

    毕竟,Linux的HIDP实现似乎比windows的更为宽松


    (从自定义键盘和鼠标组合设备本身键入:D)

    我认为您需要更具体,并尽可能缩小问题范围。如果问题发生在Windows上,那么您可能应该标记此Windows,而不是Linux。当然,我的错误。我进入了“嵌入式linux”,旨在描述开发环境,但这确实是一种误导。编辑好了,谢谢!
    ...
    0x95, 0x08,        //     Report Count (8)
    0x75, 0x08,        //     Report Size (8)
    ...