Bluetooth HID(人机界面设备)-发送键CMD+空格

Bluetooth HID(人机界面设备)-发送键CMD+空格,bluetooth,escaping,hid,Bluetooth,Escaping,Hid,我想使用HID将键盘快捷键CMD+空格发送到mac,mac将打开Spotlight。所以我需要CMD作为一个hold键,需要空格来触发快捷键。我该怎么做?我使用的是LightBlueBean,它使用HID协议通过蓝牙与mac进行通信。在其他地方对我有用的一个例子是: BeanHid.sendKeys("/dnd "); //turn do not disturb off if it is on BeanHid.sendKeys("\r\n"); //return / newline light

我想使用HID将键盘快捷键CMD+空格发送到mac,mac将打开Spotlight。所以我需要CMD作为一个hold键,需要空格来触发快捷键。我该怎么做?我使用的是LightBlueBean,它使用HID协议通过蓝牙与mac进行通信。在其他地方对我有用的一个例子是:

BeanHid.sendKeys("/dnd "); //turn do not disturb off if it is on
BeanHid.sendKeys("\r\n"); //return / newline
lightblue bean的HID类的参考如下:


我猜我需要holdKey、sendKey和releaseKey方法。但我需要的是表示cmd和空格的任何键码。

苹果命令键、Windows Windows键和Linux超级键都由USB GUI键修改器位表示

其中有两个:左GUI和右GUI。空格键只是USB空格键的用法。例如,您需要在缓冲区中构建并发送左GUI修改器+空格键

该缓冲区的确切内容取决于您使用的HID报告描述符,但对于以下相当典型的键盘报告描述符:

05 01        (GLOBAL) USAGE_PAGE         0x0001 Generic Desktop Page 
09 06        (LOCAL)  USAGE              0x00010006 Keyboard (CA=Application Collection) 
A1 01        (MAIN)   COLLECTION         0x00000001 Application (Usage=0x00010006: Page=Generic Desktop Page, Usage=Keyboard, Type=CA)
05 07          (GLOBAL) USAGE_PAGE         0x0007 Keyboard/Keypad Page 
19 E0          (LOCAL)  USAGE_MINIMUM      0x000700E0 Keyboard Left Control (DV=Dynamic Value) 
29 E7          (LOCAL)  USAGE_MAXIMUM      0x000700E7 Keyboard Right GUI (DV=Dynamic Value) 
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0)
25 01          (GLOBAL) LOGICAL_MAXIMUM    0x01 (1)  
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
95 08          (GLOBAL) REPORT_COUNT       0x08 (8) Number of fields  
81 02          (MAIN)   INPUT              0x00000002 (8 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
81 01          (MAIN)   INPUT              0x00000001 (1 field x 8 bits) 1=Constant 0=Array 0=Absolute 
95 05          (GLOBAL) REPORT_COUNT       0x05 (5) Number of fields  
75 01          (GLOBAL) REPORT_SIZE        0x01 (1) Number of bits per field  
05 08          (GLOBAL) USAGE_PAGE         0x0008 LED Indicator Page 
19 01          (LOCAL)  USAGE_MINIMUM      0x00080001 Num Lock (OOC=On/Off Control) 
29 05          (LOCAL)  USAGE_MAXIMUM      0x00080005 Kana (OOC=On/Off Control) 
91 02          (MAIN)   OUTPUT             0x00000002 (5 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields  
75 03          (GLOBAL) REPORT_SIZE        0x03 (3) Number of bits per field  
91 01          (MAIN)   OUTPUT             0x00000001 (1 field x 3 bits) 1=Constant 0=Array 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 06          (GLOBAL) REPORT_COUNT       0x06 (6) Number of fields  
75 08          (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field  
25 65          (GLOBAL) LOGICAL_MAXIMUM    0x65 (101)  
05 07          (GLOBAL) USAGE_PAGE         0x0007 Keyboard/Keypad Page 
19 00          (LOCAL)  USAGE_MINIMUM      0x00070000 Keyboard No event indicated (Sel=Selector) 
29 65          (LOCAL)  USAGE_MAXIMUM      0x00070065 Keyboard Application (Sel=Selector) 
81 00          (MAIN)   INPUT              0x00000000 (6 fields x 8 bits) 0=Data 0=Array 0=Absolute 
C0           (MAIN)   END_COLLECTION     Application 
…表示LeftGUI修饰符+空格键的缓冲区应为十六进制:

08 2C
或者,您可以发送RightGUI修改器+空格键:

80 2C
发送上述其中一项后,您需要通过发送无按键缓冲区来指示未按下按键:

00 00
值得注意的是,2C是逻辑_最小值0x00到逻辑_最大值0x65之间的索引,该索引是在HID报告描述符中定义的从使用_最小值0x00到使用_最大值0x65的使用数组中的索引,而不是键盘使用页面中的实际使用代码0x0007002C

如果您只想指示按下空格键,可以在HID报告描述符中对用法0007002C、逻辑_最小值1、逻辑_最大值1进行编码,然后发送:

80 01
…指示当前已按下空格键和GUI修改器,然后是:

00 00 

…表示当前未按下任何键。

这很有帮助-但似乎不是我可以在HID协议中使用的东西,或者至少不是通过Lightblue Bean的sendKeys方法。如果您可以使用wireshark获取数据包捕获,例如在插入设备时进行握手,则可以分析HID报告描述符以找到答案如果它们支持空格键的使用…那么您可以在调用holdKeyKEY\u LEFT\u GUI之后发送该使用的索引