繁体   English   中英

如何在 Android 5.0+ 上运行蓝牙 HID 主机

[英]How to get Bluetooth HID host on Android 5.0+ working

我有一个蓝牙HID设备,我需要得到与从的是Android 5.0分叉一台Nexus 7平板电脑2013运行自定义生成运行我的应用程序工作 所以:

  • @hide不是约束
  • 允许更改 AOSP
  • 任何 Android 版本 5.0* - 5.1* 都可以

现在我的设备有一个键盘,并且发送和接受一些供应商特定的 HID 报告。 通过工作,我的意思是发送和接收所有 HID 报告

基于我所做的 AOSP 源代码探索,似乎:

  1. HidService服务为所有输入 HID 报告广播BluetoothInputDevice.ACTION_REPORT意图 [我的应用程序有一个BroadcastReceiver来接收ACTION_REPORT意图]

  2. BluetoothInputDevice提供其它接口等setReport() sendData() connect()等通过HidService

  3. BluetoothInputDevice使用HidService提供 HID 设备接口。

  4. HidService.java是通过JNI包装com_android_bluetooth_hid.cpp

  5. com_android_bluetooth_hid.cpp ,在初始化HidService ,将注册自己的回调Bluedroid

我已将日志添加到 AOSP 以跟踪调用,似乎以上所有内容都是正确的。

get_report_callback()com_android_bluetooth_hid.cpp不会被调用,因此,我的应用程序不会收到ACTION_REPORT意图。

如果我从我的应用程序发送虚拟ACTION_REPORT意图,那么我的BroadcastReceiver会收到这些意图。

我的 HID 设备已连接并正常工作,因为我确实在我的应用程序的 edittext 字段中看到了收到的密钥。

有什么办法可以在我的应用程序中接收设备的 HID 报告? 通过意图还是通过任何其他方式?

如果我可以通过 Intents 接收,是否有遗漏的步骤? 我基本上只有带有意图过滤器的BroadcastReceiver以及用于接收 HID 报告的BLUETOOTHBLUETOOTH_ADMIN权限。

如果必须使用任何其他方法,请提出建议。

[更新2]

我可能没有明确提到它,但我使用的设备通过 GATT 实现 HID,并且是 BLE 设备。

在较新的 Android 版本(7、8、9)上,我可以通过订阅 HID 报告通知、添加 BLUETOOTH_PRIVILEGGED 权限并安装为平台应用程序来接收 HID 报告。

这些版本不需要其他 Android 代码杂耍。 我没有(也不会)用旧版本的 Android 进行测试,但是这个解决方案可能已经在那里工作了。


[上一个答案]

BluetoothInputDevice 根本不起作用。

我使用 C 代码中的 /dev/hidraw* 来访问蓝牙 hidraw 设备。

/dev/hidraw* 节点不报告 mac 地址。

在 Android 5.x 中,它们工作并且所有设置/发送/接收报告操作都在工作。 不被测试。

在 Android 6.x 上,只有 recv 操作从 /dev/hidraw 工作。 设置/发送不起作用。 不被测试。

当我有更好的答案时,我会发布更新。


更新

我修改了 bluedroid 并在其中添加了一个小型 unix-socket 服务器。 Bluedroid 将所有传入的 HID 报告传送到此服务器,并接受来自它的传出 HID 报告。 我的应用程序通过未命名的套接字与此服务器通信。 一切都很好。

我只需要正确设置套接字的 SELinux 权限即可使其正常工作。

这适用于我可以用(4.4 - 6.0)测试的所有版本的 Bluedroid,但每个版本的 Bluedroid 都需要它自己的补丁版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM