Как отправить код сканирования>255 со спрятанной клавиатуры от esp32 через гатт?

Я использую HID-библиотеку esp-32 esp-idf ( https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_hid_device_demo) для создания настраиваемой клавиатуры, которая отправляет коды сканирования на устройство Android, Мне нужно отправить код сканирования = 310, который содержит два байта данных.

У меня есть устройство, которое требует код сканирования кнопки спрятанной клавиатуры = 310[dec]. Когда я попытался отправить этот код как uint8_t key_vaule[], так как он используется в ble_hid_demo_main.c в проекте ble_hid_device_demo, устройство получило другой код сканирования, оно было усечено с 000 0001 0011 0110 [310dec] до 0011 0110 [155dec]. Я предполагаю, что это происходит из-за 8-битного размера переданных переменных вместо 16-битного. Перенос библиотек с размера uint8_t на uint16_t ничего не дал, результат все еще был усечен. Есть ли способ отправить двухбайтовый код вместо 1 байта?

1 ответ

Коды HID сканирования всегда 8 бит. Комбинации клавиш, такие как левыйCTRL+<, в данном случае представляют собой последовательность "модификатора ключа" (0x01 для левогоCTRL) и код клавиши (0x36 для <,).

В то время как 0x0136 равен 31010, ошибочно считать последовательности кодов многобайтового сканирования как одно целое число, а не как последовательность байтов по ряду причин:

  • целочисленный байт для машинной архитектуры может не соответствовать определенному для кодовых последовательностей HID,
  • В отчете HID-клавиатуры это один байт модификатора клавиши и до шести кодов клавиш - для комбинаций из до 6 обычных клавиш и восьми битов модификаторов для комбинаций shift, alt, ctrl и т. Д., Нажатых одновременно,
  • В отчете HID-клавиатуры есть "зарезервированный" байт между модификатором и первым кодом клавиши в любом случае, поэтому 0x01 и 0x36 ни в коем случае не являются смежными независимо от порядка байтов машины.

В случае кодов сканирования HID ваш 31010 - это два байта 0x01 и 0x36 (в шестнадцатеричном формате). Когда речь идет о байтовых последовательностях, более естественно использовать шестнадцатеричные обозначения - особенно в случае модификатора, который является битовой маской для нескольких клавиш shift/ctrl и т. Д. 0x36 представляет ключ <, а 0x01 - ключевой модификатор для левойклавиши CTRL.

Если ваше значение 310 было усечено при назначении его 16-разрядному целому числу, скорее всего, вы передали его как одно значение интерфейсу, который ожидал uint8_t, Но, как объяснено выше, отправка 16-битного целого числа не является правильной в любом случае.

Вместо отправки 0x0136 или 31010 необходимо отправить последовательность байтов, чтобы сформировать действительный отчет о клавиатуре, как описано в дескрипторе отчета клавиатуры вашего устройства. В отчете HID-клавиатуры первый байт является "маской-модификатором" (0x01/ лево-CTRL), второй байт зарезервирован, затем имеется до 6 кодов клавиш (допускающих комбинации нескольких клавиш) фактического количества клавиш поддерживается и, следовательно, длина отчета определяется дескриптором отчета.

Однако, глядя на API в демонстрационной версии HID, на которую вы ссылаетесь, становится ясно, что все это абстрагировано, и кажется, что вам действительно нужно сделать что-то вроде:

uint8_t key = HID_KEY_COMMA ;
esp_hidd_send_keyboard_value( hid_conn_id, LEFT_CONTROL_KEY_MASK, &key, 1 ) ;

Обратите внимание, что модификатор является битовой маской, допускающей любую комбинацию клавиш-модификаторов, например LEFT_CONTROL_KEY_MASK|RIGHT_CONTROL_KEY_MASK, HID будет использовать это для указания нескольких смен, но получатель может использовать его, чтобы разрешить левую или правую клавиши без различия.

Другие вопросы по тегам