9

我一直在搜索互联网,但没有看到任何关于如何准确实现 OOB 配对的方法。我希望这里有人可以向我指出一些示例代码来帮助我。Android 开发者网站中的聊天示例根本没有真正深入探讨这种配对。

基本上,我有一个 Android 平板电脑,我想安全地与一个设备配对,用 C++ 编写,没有内置的显示/IO 机制。要配对的平板电脑将充当 GUI/IO 接口,我将通过蓝牙发送回消息和第四个消息。因此,我想通过 OOB 配对方案将平板电脑与每个设备安全配对。

我了解 OOB 的概念,但是在 android.developers.com 网站上查找我的 android 客户端代码时,我很难找到要调用的正确方法。此外,在查看 bluez 的东西时,我找不到太多可用于我的 C++ 编写服务器的内容。

基本用例是用户将通过 USB 连接将平板电脑连接到设备。USB 连接将有助于为每个设备传递密钥/mac 地址,然后使用该信息对蓝牙彼此。

我可以弄清楚 USB 部分,但是一旦我在客户端和服务器上获得了密钥和必要的信息,我似乎无法找到正确的方法来调用两端以成功和安全地配对。

我已经有一个客户端/服务器通过不安全的连接进行通信,所以我唯一遇到的问题是两端的实际配对。配对后,我可以使用secureRFComm 来处理我未来的所有消息传递。

4

2 回答 2

11

我的问题解决了 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 知道自动绑定,甚至不问。据我所知,我可能会错过一个电话或做一些不正常的事情。我在代码中做的最后一件事是创建绑定,这似乎是显而易见的地方......

感谢您的任何建议!

于 2011-08-18T05:09:04.680 回答
3

android 上还没有允许 OOB 配对的公共 API。仅当您能够或愿意修改底层 BlueZ 堆栈以将 OOB 配对挂钩暴露给应用程序时,才有可能。(不平凡的任务)

您打算使用哪种 OOB 机制?近场通讯?

于 2011-08-03T00:40:49.653 回答