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

问题描述 投票:5回答:2

我有一个蓝牙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.javacom_android_bluetooth_hid.cpp]上的JNI包装器

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

我已将日志添加到AOSP中以跟踪呼叫,并且上述所有内容似乎都是正确的。

BUT

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

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

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

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

如果我可以通过Intents获得,我错过了任何步骤吗?我基本上只有具有意图过滤器的BroadcastReceiver以及接收HID报告的BLUETOOTHBLUETOOTH_ADMIN权限。

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

android android-intent bluetooth android-source hid
2个回答
4
投票

[更新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套接字服务器。 Bluedroid将所有传入的HID报告发送到此服务器,并从该服务器接受传出的HID报告。我的应用程序通过未命名的套接字与此服务器通信。一切都很好。

我只需要正确设置套接字的权限SELinux即可。

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


0
投票

您解决了这个问题吗?经过长时间的挖掘,我发现您遇到了同样的问题。

我使用android来源提供的隐藏演示hid-example.c。使用相同的蓝牙隐藏设备,我在Ubuntu和Android上运行演示,运行reslut有所不同。在Android平台中,/ dev / hidraw *节点未报告mac地址,并且write()操作必须失败,尽管write()函数返回wirte len。

© www.soinside.com 2019 - 2024. All rights reserved.