如何通过esp32从esp32从隐藏式键盘发送扫描代码> 255?

时间:2019-05-24 17:57:18

标签: c embedded hid esp32 esp-idf

我正在使用esp-32 esp-idf HID库(https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_hid_device_demo)制作自定义键盘,该键盘将扫描代码发送到android设备。我需要发送包含两个字节数据的扫描代码= 310。

我有一个设备,需要隐藏键盘按钮的扫描代码= 310 [dec]。当我尝试以uint8_t key_vaule []的形式发送此代码时,因为它在ble_hid_device_demo项目的ble_hid_demo_main.c中使用,该设备收到了另一个扫描代码,该代码从000 0001 0011 0110 [310dec]截断为0011 0110 [155dec]。我想这是因为传输的变量是8位而不是16位。将库从uint8_t大小修改为uint16_t没有任何效果,结果仍然被截断。有没有办法发送两字节代码而不是1字节?

1 个答案:

答案 0 :(得分:2)

HID scan codes始终为8位。在这种情况下,例如left- CTRL + <,之类的组合键是“键修饰符”的序列(left- CTRL 为0x01 )和键码( <,为0x36)。

Whist 0x0136恰好是310 10 ,出于多种原因,将多字节扫描代码序列视为一个整数而不是一个字节序列是一个错误:

  • 机器体系结构的整数字节可能与为HID代码序列定义的整数字节不匹配,
  • 在HID键盘报告中,它有一个键修改器字节和最多六个键代码-用于最多6个常规键的组合和用于同时按下shift,alt,ctrl等组合的八个修饰符位,< / li>
  • 在HID键盘报告中,无论如何在修饰符和第一个键代码之间都有一个“保留”字节,因此无论机器字节顺序如何,0x01和0x36都不是连续的。

对于HID scan codes,实际上您的310 10 是两个字节0x01和0x36(以十六进制表示)。当谈论字节序列时,使用十六进制表示法是更自然的-特别是在修饰符的情况下,修饰符是用于多个shift / ctrl等键的位掩码。 0x36表示键 <,,而0x01是左- CTRL 的键修饰符。

如果在将值310分配给16位整数时将其截断了,很可能是将其作为单个值传递给了一个预期uint8_t的接口。但是如上所述,发送16位整数在任何情况下都是不正确的。

而不是发送0x0136或310 10 ,您需要发送一个字节序列以形成有效的键盘报告,如设备的键盘报告描述符所述。在HID键盘报告中,第一个字节是“修饰符掩码”(0x01 / left- CTRL ),第二个字节被保留,然后最多有6个键控代码(允许多键)组合)支持的键的实际数量,因此报告的长度由报告描述符定义。

看一下您链接的HID演示中的API,但是很明显,所有内容都被抽象了,看来您实际上需要做的事情是这样的:

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将使用它来指示多个移位,但是接收者可能会使用它来允许左右键无区别地显示。