Search code examples
iosbluetooth-lowenergyhid

iOS ignores input report of Consumer Page of HID over Gatt


I use CSR1010 and wrote a BLE HID over Gatt application which sends only Play/Pause, Volume Increment/Decrement to iOS.

The report descriptor of the consumer report was configured as:

05 0C        (GLOBAL) USAGE_PAGE         0x000C Consumer Device Page
09 01        (LOCAL)  USAGE              0x000C0001 Consumer Control (CA=Application Collection)
A1 01        (MAIN)   COLLECTION         0x01 Application (Usage=0x000C0001: Page=Consumer Device Page, Usage=Consumer Control, Type=CA)
85 01          (GLOBAL) REPORT_ID          0x01 (1)
19 00          (LOCAL)  USAGE_MINIMUM      0x000C0000 Unassigned
2A 9C02        (LOCAL)  USAGE_MAXIMUM      0x000C029C AC Distribute Vertically (Sel=Selector)
15 00          (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
26 9C02        (GLOBAL) LOGICAL_MAXIMUM    0x029C (668)
95 01          (GLOBAL) REPORT_COUNT       0x01 (1) Number of fields
75 10          (GLOBAL) REPORT_SIZE        0x10 (16) Number of bits per field
81 00          (MAIN)   INPUT              0x00000000 (1 field x 16 bits) 0=Data 0=Array 0=Absolute 0=Ignored 0=Ignored 0=PrefState 0=NoNull
C0           (MAIN)   END_COLLECTION     Application

I validated this report descriptor using hidrdd so I am quite confident that it will be parsed fine.

The raw data bytes sent to iOS as shown in the sniffer were 05 0c 09 01 a1 01 85 01 19 00 2a 9c 02 15 00 26 9c 02 95 01 75 10 81 00 c0 which is exactly as configured.

I also saw from the sniff result that iOS registered for notification from Client Character Configuration of the consumer report characteristic.

Everything looks good but when I send 2 bytes 0xcd 0x00 (Play/Pause) to iOS, nothing happens.

Now I just felt like I did everything I could but iOS was still unhappy. There is no way to tell what iOS is unhappy about because there is no iOS app involved. Can anybody who has experience in this give me some pointers?

[EDIT] Added some screenshots of the sniffer below:

Report Map 1st part Report Map 2nd part iOS writes client configuration HID report ignored by iOS


Solution

  • When you include a report id in your report descriptor then all HID reports (on that interface) must be prefixed with a report id. In your case you would need to send a 3 byte report:

    0x01 0xcd 0x00
    

    ...or remove the report id from your report descriptor.