【问题标题】:How to send scan code >255 from hid ble keyboard from esp32 over gatt?如何通过gatt从esp32的hid ble键盘发送扫描码> 255?
【发布时间】:2019-05-25 14:41:14
【问题描述】:

我正在使用 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_device_demo 项目的 ble_hid_demo_main.c 中使用,设备收到了另一个扫描代码,它从 000 0001 0011 0110 [310dec] 被截断为 0011 0110 [155dec]。我想这是因为传输变量的 8 位大小而不是 16 位。将库从 uint8_t 大小修改为 uint16_t 没有给出任何结果,结果仍然被截断。有没有办法发送一个两字节的代码而不是一个字节?

【问题讨论】:

  • 欢迎来到 StackOverflow。请考虑改进问题的格式(另请参阅此处stackoverflow.com/help/formatting)。这将有助于其他人了解您面临的问题。
  • 旁注:截断的代码不是十进制的155。二进制 0011 0110 是十进制 54。十进制 155 是所需 310 的一半,所以你忽略了什么?
  • 如果您发布了代码,建议会容易得多。到场外材料的链接可能会过时,并且是您的代码失败了,因此要修复它,您必须显示它。 描述它更容易更准确!
  • 看来这是XY problem。也许您应该简单地问一下,“使用这个esp-32 esp-idf HID library,我怎样才能发出组合键CTRL+,”。然后可能会在代码中展示您失败的尝试(不是代码描述)。相反,您设计了一个有缺陷的解决方案,并询问了解决方案的问题并掩盖了您真正想要实现的目标。下次发帖时可能要考虑一些事情。

标签: c embedded hid esp32 esp-idf


【解决方案1】:

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

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

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

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

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

而不是发送 0x0136 或 31010 你需要发送一个字节序列来形成一个有效的键盘报告,如设备的键盘报告描述符所述。在 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 会使用它来指示多个班次,但接收器可能会使用它来允许无区别地使用左键或右键。

【讨论】:

  • 感谢您的回答,我尝试了您的方法,但没有奏效。当我尝试使用 ctrl 修改器发送 HID_KEY_COMMA 时,我的设备仍然收到它,因为它是逗号,所以扫描码仍然是 54。我可以在我的 android 设备上的关键事件记录器中看到它。我还收到了来自 esp 的一个 andice 来修改 link 中的报告映射,但我不明白修改它的问题,我应该在哪里更改我的报告大小的值以便我可以发送两个字节值(他们说这是可能的顺便说一句)
  • @OPyshkin :您没有按照我的建议发布您的代码,这并没有帮助自己——它留下了很多猜测。您显然对扫描码有一些误解 - 我的回答中的信息来自 HID 设备规范。此外,显然 ESP HIDD API 使用 8 位类型的扫描码。我提出的调用确实在 HID 报告中指定了两个字节。问题可能在于阅读而不是发送,或者在于您对正在阅读的内容的解释。与其对这个答案发表评论,不如把你的证据放在问题中。
  • @OPyshkin ,如果您不理解来自 ESP 支持的建议,请让他们澄清或提出其他问题 - 或将该建议添加到您的问题中,以便我们都能受益。
  • 抱歉耽搁了。这是esp的回复。 link 澄清一下,该项目的主要目的是将 ble hid 按钮连接到基于 android 的数据采集终端,因此通过按下按钮我们就可以启动扫描仪。绑定到终端扫描按钮的扫描码是310。所以我无法清楚地理解我的问题在哪里。关于代码,我没怎么改过,所以和esp的样例工程差不多。
  • 关于 esp 的建议,他们建议修改隐藏报告映射,link 我不清楚我应该更改哪些参数。我尝试在 Key arrays 部分更改 log max 和 usage max,所以没有结果。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2021-08-16
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多