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

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

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

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

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

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

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

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

android android-bluetooth pairing bluetooth-oob
2个回答
10
投票

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

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

在beagle board上,我安装了bluez 4.96堆栈并安装了dbusoob插件。要确认设置正确,请在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知道只是自动绑定甚至不问。对于我所知道的一切,我可能会错过一个电话或做一些无序的事情。我在代码中做的最后一件事就是创建一个看起来很明显的地方......

谢谢你的任何建议!


2
投票

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

您打算使用哪种OOB机制? NFC?

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