簡體   English   中英

如何通過esp32從esp32從隱藏式鍵盤發送掃描代碼> 255?

[英]How to send scan code >255 from hid ble keyboard from esp32 over gatt?

我正在使用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個字節?

HID掃描代碼始終為8位。 在這種情況下,諸如left- CTRL + <之類的鍵組合是一個序列的“鍵修飾符”(left- CTRL為0x01)和一個鍵代碼(對於<,,為0x36)。

Whist 0x0136恰好是310 10 ,出於多種原因,將多字節掃描代碼序列視為單個整數而不是字節序列是錯誤的:

  • 機器架構的整數字節可能與為HID代碼序列定義的整數字節不匹配,
  • 在HID鍵盤報告中,它有一個鍵修改器字節和最多六個鍵代碼-用於最多6個常規鍵的組合和八個用於移位,alt,ctrl等組合的修飾符位。
  • 在HID鍵盤報告中,無論如何,在修飾符和第一個鍵代碼之間都存在一個“保留”字節,因此無論機器字節順序如何,0x01和0x36都不是連續的。

對於HID掃描代碼 ,您的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將使用它來指示多個移位,但是接收器可能會使用它來允許左鍵或右鍵進行區分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM