2011-08-02 86 views
9

我一直在搜索互联网,并没有看到如何正确实施OOB配对的方式。我希望这里有人能指点我一些示例代码来帮助我。 Android开发人员网站中的聊天示例并未真正涉及这种类型的配对。Android上的蓝牙“带外”(OOB)配对?

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

我理解OOB的概念,但我在查找android.developers.com网站上查找Android客户端代码时遇到困难,无法找到正确的方法。另外当看着bluez的东西时,我无法找到很多东西来继续写我的C++书写服务器。

基本用例是用户将平板电脑通过USB连接连接到设备。 USB连接将便于每个设备传递键/ MAC地址,然后使用该信息对彼此进行蓝牙连接。

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

我已经有一个客户端/服务器通过一个不安全的连接通话,所以真正唯一的一部分我遇到了两端实际配对。正如我配对一样,我可以使用secureRFComm来完成我未来的所有消息。

感谢任何人都可以帮助!

回答

2

在androind上还没有公开API允许进行OOB配对。 如果您可以或愿意修改底层BlueZ堆栈以将OOB配对挂钩公开给应用程序,那么这是可能的。 (非微不足道的任务)

您计划使用什么OOB机制? NFC?

+0

感谢Dennis的回应。 我设想握手发生的方式是用户通过USB连接将平板电脑连接到设备。 USB连接将有助于每个设备传递密钥/ MAC地址。有了每个设备的MAC地址,我应该能够使用正确的密钥实际设置蓝牙相互配对。这似乎是OOB配对的全部内容。 这是一个自定义工作,而不是为Android市场计划的应用程序。所以,如果这不是处理这种配对的正确方法,那么我可以提供设计建议。 – Brian

+0

我搜索一些更多的android文档,并发现一些方法列出@ hide似乎有用。其中一种方法是“createBondOutofBand”。这是我可以通过反射调用还是需要BlueZ堆栈更改?我也不确定如何处理这是非android的服务器上。通过处理我的意思是我需要调用BlueZ的方法,让服务器和OOB配对。谢谢你的帮助! – Brian

+0

@Brian:OOB配对需要来自每个蓝牙HCI的Hash和Randomizer值(如果只有一方可以发送数据,也可以进行单向认证,但这里不是这种情况)。我假设你会使用['readOutOfBandData'](http://www.androidjavadoc.com/2.3/android/bluetooth/BluetoothAdapter.html#readOutOfBandData%28%29)从android端获取你的值,但是我不'为Android开发,所以不能验证任何东西。 – Hasturkun

10

我有我的问题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信息的方式是将该平板电脑安装在beagle板上。一旦安装平板电脑和beagle板可以写出所需信息的文件。

在android端OOB不支持公共API,所以事情变得棘手。我相信这是因为Honeycomb 3.2没有官方支持OOB绑定的蓝色堆栈,但Google有某种编码方式。我相信这是因为如果您查看蓝牙适配器和蓝牙设备类的gingerbread源代码,您可以看到OOB方法可用,但未通过记录的API公开。

这些方法仍然是公开的,所以你可以通过反射来调用它们。使用反射,你也可以获得一个类中的所有方法签名。这就是我弄清楚我可以使用哪些方法。

请注意,虽然很多都没有记录,并且它并不明显。要注意的重要一点是适配器类中的readOutOfBandData()和设备类中的setDeviceOutOfandData()。

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

希望上述可以帮助其他人解决这个问题。

现在到我的问题。我有我的android应用程序工作得很好,我的比尔格板代码是testOOB示例更新为一端从文件读取OOB信息。现在我看到的问题是执行时每个人都看到对方很棒,但在平板电脑上我仍然收到一条消息,询问是否要与设备xyz配对。没有钥匙或数字。它只是问“与设备XYZ配对”或沿着这些线路。

如果我按下“pair”,它们都是从片剂的角度来配对的,但python脚本返回配对失败。 beagle板上的python脚本正在调用实际的方法来完成设备之间的绑定。即使我有android启动createBond调用,我也会看到相同的结果。我可以保证,我已经在两端都设置了所需的OOB数据,然后再尝试在两种情况下进行配对,这似乎并不是这样。

所以我的问题是我希望有人能帮助我是:

1)为什么我甚至可以在Android上一个消息,如果OOB数据是正确交换?是否有另一个电话我失踪,并在哪一端?

2)为什么beagle板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

你可以在某处发布你的源代码吗?我一直在做一些与此非常相似的事情,但我还没有走得很远。 –

+0

是的,你可以请你发布你的源 – shreyashirday

+0

你好,你想出了解决这个问题的方法吗?我想很多人都在为此而苦苦挣扎。 – ymerdrengene