Android上的蓝牙“带外”(OOB)配对?

时间:2011-08-02 20:35:55

标签: android android-bluetooth pairing bluetooth-oob

我一直在网上搜索,并没有看到任何关于如何准确实现OOB配对的方法。我希望有人能指点我一些示例代码来帮助我。 Android开发者网站中的聊天示例根本没有真正涉及这种类型的配对。

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

我理解OOB的概念,但是当我在android.developers.com网站上查找我的Android客户端代码时,我很难找到适当的方法来调用。另外,在查看bluez的东西时,我找不到很多可以继续使用我的C ++编写的服务器。

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

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

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

2 个答案:

答案 0 :(得分:10)

我的问题95%已经解决,但我遇到了一个小路障。首先,我将使用对原始问题的更具体的答案更新此帖,并在最后发布我的问题。

总结一下,我的任务是使用带外(oob)配对将使用Honeycomb 3.2的安卓平板电脑通过USB安全地配对beagle板。我无法发布特定代码,但我会告诉您完成此操作所需的所有步骤。

在beagle主板上,我安装了带有dbusoob插件的bluez 4.96堆栈。要确认设置正确,请在beagle板上安装2个蓝牙适配器,然后运行测试文件夹中bluez存档中的OOB测试代码。这是一个python脚本。该脚本应成功配对2个蓝牙适配器,如果不是bluez可能无法正确设置。

要使用平板电脑进行USB通信,您需要安装mtpfs和mtp-tools。这些用于安装您的平板电脑。我解决了两台设备之间获取OOB信息的方法是将平板电脑安装在比格犬板上。安装后,平板电脑和beagle板可以写出一个包含所需信息的文件。

在android端,公共API不支持OOB,所以事情变得棘手。我相信这是因为Honeycomb 3.2没有官方支持OOB绑定的bluez堆栈,但Google有一些编码实现。我相信这是因为如果你看看蓝牙适配器和蓝牙设备类的姜饼源代码,你可以请参阅可用的OOB方法,但不能通过记录的API公开。

这些方法仍然是公开的,因此您可以通过反射调用它们。使用反射,您还可以获取类中的所有方法签名。这就是我弄清楚我可以使用哪些方法的方法。

请注意,虽然很多都没有记录,但有些人做的并不明显。需要注意的重要事项是适配器类中的readOutOfBandData()和设备类中的setDeviceOutOfandData()。

您可能遇到的另一个问题是当您将oob数据写入平板电脑上的文件以供beagle板读取时。由于android使用mtp,因此必须在将文件写入内部SD卡存储后对其进行索引。要解决此问题,您需要使用MediaScannerConnection类和scanFile()方法。

希望以上帮助其他人解决同样的问题。

现在回答我的问题。我的android应用程序运行良好,我的beagle板代码是更新的testOOB示例,让一端从文件中读取OOB信息。现在我看到的问题是,当执行时每个人都看到对方很棒,但在平板电脑上我仍然会收到一条消息,询问我是否要与设备xyz配对。没有钥匙或数字。它只是询问“与设备XYZ配对”或类似的东西。

如果我按“对”,它从平板电脑的角度来看都是配对的,但是python脚本会返回配对失败。 beagle board上的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知道只是自动绑定甚至不问。对于我所知道的一切,我可能会错过一个电话或做一些无序的事情。我在代码中做的最后一件事就是创建一个看起来很明显的地方......

感谢您的任何建议!

答案 1 :(得分:2)

orroind上还没有允许OOB配对的公共API。 如果您能够或者愿意修改底层的BlueZ堆栈以向应用程序公开OOB配对挂钩,那么这是可能的。 (非平凡的任务)

您计划使用哪种OOB机制? NFC?