Как отправить скан-код ›255 со скрытой клавиатуры от esp32 через gatt?

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

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


person OPyshkin    schedule 24.05.2019    source источник
comment
Добро пожаловать в StackOverflow. Пожалуйста, подумайте об улучшении форматирования вашего вопроса (см. Также здесь stackoverflow.com/help/formatting). Это поможет другим понять проблему, с которой вы столкнулись.   -  person NOhs    schedule 24.05.2019
comment
Боковое примечание: усеченный код не является десятичным 155. Двоичный 0011 0110 является десятичным 54. Десятичное число 155 составляет половину требуемого 310, так что вы что-то упустили?   -  person Weather Vane    schedule 24.05.2019
comment
Было бы намного проще посоветовать, если бы вы разместили свой код. Ссылки на сторонние материалы, вероятно, устареют, и это ваш код, который дает сбой, поэтому, чтобы исправить это, вы должны его показать. Намного проще и точнее описать это!   -  person Clifford    schedule 24.05.2019
comment
Похоже, это была проблема XY. Возможно, вам следовало просто спросить: Используя этот esp- 32 esp-idf HID library, как я могу выдать комбинацию клавиш CTRL+,?. Затем, возможно, представил ваши неудачные попытки в коде (не описания кода). Вместо этого вы придумали ошибочное решение и спросили, в чем проблема, связанная с решением, и скрывая, чего вы действительно хотите достичь. Возможно, есть о чем подумать в следующий раз.   -  person Clifford    schedule 25.05.2019


Ответы (1)


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

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

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

В случае кодов сканирования HID ваш 310 10 находится в Фактически два байта 0x01 и 0x36 (в шестнадцатеричном формате). Говоря о последовательностях байтов, более естественно использовать шестнадцатеричную нотацию - особенно в случае модификатора, который представляет собой битовую маску для нескольких клавиш shift / ctrl и т. Д. 0x36 представляет собой ключ ‹,, а 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 будет использовать это, чтобы указать несколько сдвигов, но получатель может использовать его, чтобы разрешить левую или правую клавиши без различия.

person Clifford    schedule 24.05.2019
comment
Спасибо за ответ, попробовал ваш метод, но не сработало. Когда я пытался отправить HID_KEY_COMMA с помощью модификатора ctrl, мое устройство все еще получало его, так как это была запятая, поэтому код сканирования все еще был 54. Я вижу его в регистраторе ключевых событий на моем устройстве Android. Я также получил andice от esp для изменения карты отчета в ссылка, но я не понимаю, в чем проблема его изменения, где мне следует изменить значение размера моего отчета, чтобы я мог отправить двухбайтовое значение (они сказали, что это возможно, кстати) - person OPyshkin; 28.05.2019
comment
@OPyshkin: Вы не помогаете себе, не публикуя свой код, как я предлагал - это оставляет много догадок. Вы явно ошибаетесь в отношении скан-кодов - информация в моем ответе взята из спецификации устройства HID. Более того, очевидно, что ESP HIDD API использует 8-битный тип для сканирующего кода. Предложенный мной вызов действительно определяет два байта в отчете HID. Проблема, скорее всего, будет в чтении, а не в отправке, или в вашей интерпретации того, что вы читаете. Вместо того, чтобы комментировать этот ответ, включите в вопрос свои доказательства. - person Clifford; 29.05.2019
comment
@OPyshkin, если вы не понимаете совета службы поддержки ESP, попросите их уточнить или задать другой вопрос - или добавьте этот совет к своему вопросу, чтобы мы все могли получить пользу. - person Clifford; 29.05.2019
comment
Извините за задержку. Это ответ от esp. ссылка. Чтобы уточнить, основная цель проекта - подключить скрытую кнопку к терминалу сбора данных на базе Android, поэтому, нажав кнопку, мы сможем запустить сканер. Скан-код, привязанный к кнопке сканирования терминала, - 310. Поэтому я не могу четко понять, в чем моя проблема. Что касается кода, я его особо не менял, так что он почти похож на пример проекта esp. - person OPyshkin; 12.06.2019
comment
Что касается совета esp, они предложили изменить карту отчетов hid, ссылка. Я не совсем понимаю, какие параметры мне следует изменить. Я попытался изменить максимальное значение журнала и максимальное использование в разделе «Массивы ключей», так что это не дало результата. - person OPyshkin; 12.06.2019