我的问题解决了 95%,但我遇到了一个小障碍。首先,我将用对原始问题的更具体的答案来更新这篇文章,并在最后发布我的问题。
回顾一下,我的任务是使用带外 (oob) 配对,通过 USB 将使用 Honeycomb 3.2 的 android 平板电脑安全地配对到 beagle 板。我不能发布具体的代码,但我会给你完成这项工作所需的所有步骤。
在 beagle 板上,我安装了带有 dbusoob 插件的 bluez 4.96 堆栈。要确认此设置正确,请在 beagle 板上安装 2 个蓝牙加密狗,并运行测试文件夹中 bluez 存档中的 OOB 测试代码。这是一个python脚本。该脚本应成功配对 2 个蓝牙加密狗,如果不是 bluez,则可能未正确设置。
要使平板电脑与 USB 通信正常工作,您需要安装 mtpfs 和 mtp-tools。这些用于安装您的平板电脑。我解决在两个设备之间获取 OOB 信息的方法是将平板电脑安装在小猎犬板上。安装后,平板电脑和小猎犬板可以写出包含所需信息的文件。
在 android 端,公共 API 不支持 OOB,所以事情变得棘手。我相信这是因为 Honeycomb 3.2 没有正式支持 OOB 绑定的 bluez 堆栈,但 Google 有某种编码实现。我相信这是因为如果您查看蓝牙适配器和蓝牙设备类的姜饼源代码,您可以请参阅可用但未通过文档化 API 公开的 OOB 方法。
这些方法仍然是公开的,因此您可以通过反射调用它们。使用反射,您还可以获得类中的所有方法签名。这就是我如何弄清楚我可以使用哪些方法。
请注意,尽管许多都没有记录在案,而且有些人做了什么并不明显。需要注意的重要一点是适配器类中的 readOutOfBandData() 和设备类中的 setDeviceOutOfandData()。
您可能会遇到的另一个问题是,当您将 oob 数据写入平板电脑上的文件以供 beagle 板读取时。由于 android 使用 mtp,因此您必须在将文件写入内部 sdcard 存储后对其进行索引。要解决这个问题,您需要使用 MediaScannerConnection 类和 scanFile() 方法。
希望以上内容可以帮助其他人解决同样的问题。
现在谈谈我的问题。我的 android 应用程序运行良好,我的 beagle 板代码是 testOOB 示例,已更新为一端从文件中读取 OOB 信息。现在我看到的问题是执行时每个人都觉得彼此很棒,但是在平板电脑上我仍然收到一条消息,询问我是否要与设备 xyz 配对。没有键或数字。它只是询问“与设备 XYZ 配对”或类似的内容。
如果我按“配对”,从平板电脑的角度来看,它都是配对的,但是 python 脚本返回配对失败。beagle 板上的 python 脚本正在调用实际方法来进行设备之间的绑定。即使我让 android 启动 createBond 调用,我也会看到相同的结果。我可以保证在尝试在两种情况下配对之前,我已经在两端设置了所需的 OOB 数据,所以这似乎不是。
所以我希望有人可以帮助我的问题是:
1)如果OOB数据交换正确,为什么我什至会在android上收到消息?是否还有另一个电话我错过了,在哪一端?
2)为什么即使我按下平板电脑上显示的“配对”弹出窗口,beagle board python 脚本返回配对失败。平板电脑和蓝调显示器都显示设备已配对。再一次,我倾向于认为我错过了一些东西。
感谢任何可以提供帮助的人:)
编辑:
在此处添加更多信息是 logcat 输出:
D/UIBluetooth( 4363): !!!!!! Start Bond !!!!!!
D/BluetoothService( 1703): Setting out of band data for: 00:02:76:24:C2:8F:[-37, -1, 65, -42, -121, -75, -60, -4, -47, -86, -88, 14, 64, 83, 16, 96]:[-112, 34, 121, -97, 15, -54, -83, -
93, 104, -83, -124, -25, 89, 114, 66, 62]
D/BluetoothBondState( 1703): 00:02:76:24:C2:8F bond state 10 -> 11 (0)
D/UIBluetooth( 4363): createOobBond Successful
V/BluetoothEventManager( 2174): Received android.bluetooth.device.action.BOND_STATE_CHANGED
D/BluetoothEventLoop( 1703): Property Changed: Devices : 1
D/BluetoothEventLoop( 1703): Device property changed: 00:02:76:24:C2:8F property: Connected value: true
I/BluetoothEventLoop.cpp( 1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData
I/BluetoothEventLoop.cpp( 1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData
最后两行似乎触发了 Android 上的弹出窗口,以与有问题的设备配对/取消。我希望 Android 知道自动绑定,甚至不问。据我所知,我可能会错过一个电话或做一些不正常的事情。我在代码中做的最后一件事是创建绑定,这似乎是显而易见的地方......
感谢您的任何建议!