#windows #bluetooth #mouse #hid
#Windows #bluetooth #мышь #скрытый
Вопрос:
Я работал над небольшим проектом по эмуляции устройства Bluetooth HID на основе встроенного Linux, Bluez с кодом, реализованным на python. Идея состоит в том, чтобы искать события ввода на клавиатурах и устройствах мыши, анализировать их и пересылать на хост bluetooth. Все идет нормально, за исключением поведения мыши в Windows.
На устройствах Android и Linux мышь работает просто отлично: кнопки, прокрутка и движения работают должным образом. Однако в целевых системах Windows наблюдается следующее:
- Резкие движения, даже при малейших движениях, т. Е. Отправка отчета с перемещениями единиц измерения, приводит к перемещению курсора на много пикселей;
- Прокрутка безответственна, т. Е. прокрутка на физической мыши генерирует события ввода, переносимые приложением, оно перенаправляется на хост-устройство, но 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)