0

我正在尝试使用 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 吗?

4

3 回答 3

0

我想我找到了这个问题的答案。

API 返回您可以在设备上找到的元素列表。无论是哪个报告 ID,也无论列表中元素的顺序如何(实际上有一个逻辑,但不是我所期望的)

但是 API 在每个元素上添加了一个名为“cookie”的键,并且该键似乎尊重描述符中元素的顺序。我可以使用这个 cookie 以正确的顺序构建我的结构并计算正确的偏移量以正确解析输入报告。

device 0x7ff1f42072a0 is Apple Optical USB Mouse (vendor 5ac), max report size 6 
nb element descriptor : 11
    cookie: 1 - element (usage name) Generic Desktop item 0002 
    cookie: 2 - element (usage name) Generic Desktop item 0001 
    cookie: 3 - element (usage name) Button 1 
    cookie: 4 - element (usage name) Button 2 
    cookie: 5 - element (usage name) Button 3 
    cookie: 6 - element (usage name) Button 4 
    cookie: 7 - element (usage name) X 
    cookie: 8 - element (usage name) Y 
    cookie: 9 - element (usage name) Z 
    cookie: 10 - element (usage name) Wheel 
    cookie: 11 - element (usage name) Apple Reserved Mouse Data 

编辑:经过更多测试,此解决方案不适用于所有设备。在触摸屏的情况下,Cookie Key 不尊重描述符顺序,例如:/

于 2014-01-10T14:47:37.360 回答
0

我没有使用此 API 的经验,因此此答案可能不正确。另外,我发现你的问题有点令人困惑。

听起来您正在使用IOHIDManager API,并且无法从 USB 设备中找出某些 HID 报告的确切位结构。

我怀疑确切的位结构正是应该通过像这样的高级 API 从您那里抽象出来的那种细节。为什么你需要知道确切的结构?您可以只使用IOHIDManagerRegisterInputValueCallback从设备读取数据吗?

于 2014-01-09T22:08:26.627 回答
0

It's hard to see exactly what it is you're asking, but it seems that you're happy to use the raw input report descriptor, and yet you're trying to rely on Linux' descriptor? (don't forget the driver can rewrite descriptors and reports)

You can access the raw report descriptor on OSX using IOHIDDeviceGetProperty(hid_device_ref, CFSTR(kIOHIDReportDescriptorKey));

于 2014-07-09T12:06:59.857 回答