我正在尝试使用 IOHIDManager API 从 Mac OsX 上设备的 HID 报告中读取数据,例如鼠标的 X、Y、button1、Button2(Magic Apple Mouse)
使用 API,我可以动态读取描述符,但我有几个问题: - API 没有从描述符中提供我需要的所有信息:例如,我找不到有关填充位的信息!...我必须自己计算填充以正确构建我的结构。- API 没有按照描述符或 HID 报告的顺序为我提供特征(X、Y、btn1 ...)!!那我怎么知道阅读 HID 报告的正确顺序!?
所以我没有与 HID 报告数据正确匹配。
这是 OsX API 从描述符中提供给我的信息。
device 0x7f94f4804c70 is Apple Optical USB Mouse (vendor 5ac), max report size 6
nb element descriptor : 11
element (usage name) Generic Desktop item 0002
element (usage name) Generic Desktop item 0001
element (usage name) X
element (usage name) Y
element (usage name) Z
element (usage name) Wheel
element (usage name) Button 1
element (usage name) Button 2
element (usage name) Button 3
element (usage name) Button 4
element (usage name) Apple Reserved Mouse Data
所以我建立了一个结构:X、Y、Z、Wheel、Btn1|Btn2|Btn3|Btn4、ARMD
这是从描述符中在 Linux 上给我的 RAW 信息。
0x05, 0x01, // Usage Page (Generic Desktop) 0
0x09, 0x02, // Usage (Mouse) 2
0xa1, 0x01, // Collection (Application) 4
0x05, 0x09, // Usage Page (Button) 6
0x19, 0x01, // Usage Minimum (1) 8
0x29, 0x04, // Usage Maximum (4) 10
0x15, 0x00, // Logical Minimum (0) 12
0x25, 0x01, // Logical Maximum (1) 14
0x95, 0x04, // Report Count (4) 16
0x75, 0x01, // Report Size (1) 18
0x81, 0x02, // Input (Data,Var,Abs) 20
0x95, 0x01, // Report Count (1) 22
0x75, 0x04, // Report Size (4) 24
0x81, 0x01, // Input (Cnst,Arr,Abs) 26
0x05, 0x01, // Usage Page (Generic Desktop) 28
0x09, 0x01, // Usage (Pointer) 30
0xa1, 0x00, // Collection (Physical) 32
0x09, 0x30, // Usage (X) 34
0x09, 0x31, // Usage (Y) 36
0x09, 0x32, // Usage (Z) 38
0x09, 0x38, // Usage (Wheel) 40
0x15, 0x81, // Logical Minimum (-127) 42
0x25, 0x7f, // Logical Maximum (127) 44
0x75, 0x08, // Report Size (8) 46
0x95, 0x04, // Report Count (4) 48
0x81, 0x06, // Input (Data,Var,Rel) 50
0xc0, // End Collection 52
0x05, 0xff, // Usage Page (Vendor Usage Page 0xff) 53
0x09, 0xc0, // Usage (Vendor Usage 0xc0) 55
0x75, 0x08, // Report Size (8) 57
0x95, 0x01, // Report Count (1) 59
0x81, 0x02, // Input (Data,Var,Abs) 61
0xc0, // End Collection 63
所以我可以建立一个结构:Btn1|Btn2|Btn3|Btn4|0|0|0|0, X, Y, Z, Wheel, ARMD
从那里开始,基于 OsX API,我正在构建一个几乎相同的结构(包括填充位)以“匹配”HID 报告。所以我有:X、Y、Z、Wheel、Btn1|Btn2|Btn3|Btn4|0|0|0|0、ARMD
我订阅了 HID 报告并解析它,因为它应该适合我的结构......但它不
在这里,这是我在 OsX 上单击 Btn1 时所拥有的:
device : 0x7fe609007500, id: 0 --- 01 00 00 00 00 00 size - 48
X : 1 Y : 0 Z : 0 Wheel : 0 Button 1 : 0 Button 2 : 0 Button 3 : 0 Button 4 : 0 ARMData : 0
报告告诉我 X=1 !!!!
在这里,这就是我在 Linux 上所拥有的
2.384001 B1: 1 | B2: 0 | B3: 0 | B4: 0 | # | X: 0 | Y: 0 | Z: 0 | Wheel: 0 | 0xff00c0: -127
该程序适用于除 Magic Apple Mouse 之外的一些设备作为鼠标,但我与其他设备有类似的问题...... API 以错误的顺序和部分信息为我提供了功能!
有什么我不明白的吗?有人有同样的问题或更好地理解你如何在 OSX 上使用 HID API 吗?