Android: 在应用程序中直接使用 HID over GATT (Gadget=HID → control Application)

Android: Using HID over GATT directly in Application (Gadget=HID → control Application)

我有一个带有几个按钮的蓝牙 LE 操纵杆。我想不使用蓝牙设置直接将它连接到应用程序,而是通过 BluetoothLeScanner.

连接到它

我已经可以连接到心率监测器并定期收到心率值通知。

我还创建了一个带有 ESP32 的小型 temperature/light/humidity 传感器,我也可以连接到它并在应用程序中显示传感器值。

我对这个 HID 设备的理解可能有误。在 App BLE Scanner 的帮助下,我可以通过 BLE 连接到这个小工具并查看提供的服务。

其中一个是 0x1812 HUMAN INTERFACE DEVICE,它包含几个 REPORT 类型的特征,其中描述了 HID OVER GATT PROFILE SPECIFICATION (HOGP_SPEC)

如何知道按下了哪个按钮,摇杆移动到了什么位置?我想这必须通过我必须订阅的通知来实现。

是否有任何 Android 库可用于处理 HID 输入设备?我不想做的是使用蓝牙设置并连接到设备并将其检测为 HID 设备并用一些奇怪的映射替换键盘。我根本不希望 OS 参与其中,就像我连接并使用 HRM 和 ESP32 一样。

我找不到这方面的任何信息。

我可以用我的应用程序连接到设备,列举服务和特征。但从那以后,我不知道如何使用 HID。理想情况下,我会收到像 "Button A has been pressed" "Joystick got moved to x=32" 这样的通知,例如,其中 x 的范围从 -127 到 127。

自 Android 5.0 起,访问 HID 特性需要 BLUETOOTH_PRIVILEGED 权限。应用程序获得该权限的唯一方法是使用与系统应用程序相同的证书进行签名。

这是一项安全功能,可防止应用从您的键盘接收 HID 事件并窃取您的密码。

引用自https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/BLE_5F00_on_5F00_Android_5F00_v1.0.1.pdf

4.6 Protected services

Android does not allow to read or write data to the following characteristics (and their descriptors):

  1. HID Service (since Android 5):
a.  HID Information
b.  Report Map
c.  HID Control Point
d.  Report
  1. FIDO (https://fidoalliance.org/) (since Android 6)
a.  U2F (0000FFFD-0000-1000-8000-00805F9B34FB)

Only applications with BLUETOOTH_PRIVILEGED, that is, applications signed with the same certificate as the system, are able to read and write data to those characteristics.