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

Bri*_*ian 9 android android-bluetooth bluetooth-oob pairing

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

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

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

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

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

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

Bri*_*ian 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脚本返回配对失败,即使我按下平板电脑上显示的"pair"弹出窗口.平板电脑和蓝调监视器都显示设备已配对.有些人再次倾向于我错过了一些东西的想法.

感谢任何可以帮助的人:)

编辑:

在这里添加更多信息是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
Run Code Online (Sandbox Code Playgroud)

最后两行似乎是触发Android上的弹出窗口与问题中的设备配对/取消.我希望Android知道只是自动绑定甚至不问.对于我所知道的一切,我可能会错过一个电话或做一些无序的事情.我在代码中做的最后一件事就是创建一个看起来很明显的地方......

谢谢你的任何建议!

  • 你能在某个地方发布你的来源吗?我一直在做与此类似的事情,但我还没有走得太远. (2认同)

Den*_*ews 3

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

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