Проблемы с пользовательской Bluetooth-мышью в Windows

#windows #bluetooth #mouse #hid

#Windows #bluetooth #мышь #скрытый

Вопрос:

Я работал над небольшим проектом по эмуляции устройства Bluetooth HID на основе встроенного Linux, Bluez с кодом, реализованным на python. Идея состоит в том, чтобы искать события ввода на клавиатурах и устройствах мыши, анализировать их и пересылать на хост bluetooth. Все идет нормально, за исключением поведения мыши в Windows.

На устройствах Android и Linux мышь работает просто отлично: кнопки, прокрутка и движения работают должным образом. Однако в целевых системах Windows наблюдается следующее:

  1. Резкие движения, даже при малейших движениях, т. Е. Отправка отчета с перемещениями единиц измерения, приводит к перемещению курсора на много пикселей;
  2. Прокрутка безответственна, т. Е. прокрутка на физической мыши генерирует события ввода, переносимые приложением, оно перенаправляется на хост-устройство, но Windows на него не реагирует.

Я разработал дескриптор USB HID, который встроен в запись SDP, включая определения для прокрутки, представленные ниже — если они правильно проанализированы https://eleccelerator.com/usbdescreqparser / 🙂

Есть мысли по этому поводу?

 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
  

Комментарии:

1. Я думаю, вам нужно быть более конкретным и попытаться максимально сузить проблему. Если проблема возникает в Windows, то вам, вероятно, следует пометить эту Windows, а не Linux.

2. Конечно, моя ошибка. Я ввел «встроенный linux», стремясь изобразить среду разработки, но это действительно вводило в заблуждение. Отредактировал это, спасибо!

Ответ №1:

Обнаружена проблема. На самом деле их было несколько.

Во-первых, была неправильно сформирована служебная запись для профиля Bluetooth (не опубликованная в исходном сообщении): у нее были проблемы с атрибутом 0x0009 (BluetoothProfileDescriptorList), в котором неправильно устанавливалось то, что должно быть установлено: версия профиля в соответствии со спецификацией Bluetooth HUMAN INTERFACE DEVICE PROFILE 1.1. Как только я понял это правильно, мышь начала работать, но затем клавиатура снова перестала работать.

Затем я заметил, что используемый мной шаблонный дескриптор HID ожидал, что я отправлю 8 байт для активных ключей по мере чтения (см. Исходное сообщение):

 ...
0x95, 0x08,        //     Report Count (8)
0x75, 0x08,        //     Report Size (8)
...
  

И я отправлял только 6 байт в отчете. После того, как я понял это правильно, Windows правильно приняла ввод как с мыши, так и с клавиатуры.

В конце концов, кажется, что реализации HIDP для Linux более мягкие, чем Windows.

(Вводится с самого пользовательского комбинированного устройства клавиатуры и мыши: D)