Как отправить код сканирования> 255 со спрятанной клавиатуры от esp32 через гатт? - PullRequest
1 голос
/ 24 мая 2019

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

У меня есть устройство, которое требует код сканирования кнопки спрятанной клавиатуры = 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 Ответ

2 голосов
/ 24 мая 2019

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

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

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

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

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

Вместо отправки 0x0136 или 310 10 вам необходимо отправить последовательность байтов, чтобы сформировать действительный отчет о клавиатуре, как описано в дескрипторе отчета клавиатуры вашего устройства. В отчете HID-клавиатуры первый байт является «маской-модификатором» (0x01 / left- 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 будет использовать это, чтобы указать несколько смен, но получатель может использовать его, чтобы разрешить левую или правую клавиши без различия.

...