2

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

我有一个需要 ble 隐藏键盘按钮的扫描码 = 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 没有给出任何结果,结果仍然被截断。有没有办法发送一个两字节的代码而不是一个字节?

4

1 回答 1

2

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

虽然 0x0136 恰好是 310 10,但将多字节扫描码序列视为单个整数而不是字节序列是错误的,原因有很多:

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

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

如果您的值 310 在您将其分配给 16 位整数时被截断,则很可能您将其作为单个值传递给期望 a 的接口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 将使用它来指示多个班次,但接收器可能会使用它来允许无区别地使用左键或右键。

于 2019-05-24T20:10:03.973 回答