我有我的问题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知道只是汽车债券,甚至不问。对于我所知道的,我可能会错过一个电话或做一些事情。我在我的代码中做的最后一件事是创建债券,似乎是显而易见的地方做它...
谢谢你的任何建议!
感谢Dennis的回应。 我设想握手发生的方式是用户通过USB连接将平板电脑连接到设备。 USB连接将有助于每个设备传递密钥/ MAC地址。有了每个设备的MAC地址,我应该能够使用正确的密钥实际设置蓝牙相互配对。这似乎是OOB配对的全部内容。 这是一个自定义工作,而不是为Android市场计划的应用程序。所以,如果这不是处理这种配对的正确方法,那么我可以提供设计建议。 – Brian
我搜索一些更多的android文档,并发现一些方法列出@ hide似乎有用。其中一种方法是“createBondOutofBand”。这是我可以通过反射调用还是需要BlueZ堆栈更改?我也不确定如何处理这是非android的服务器上。通过处理我的意思是我需要调用BlueZ的方法,让服务器和OOB配对。谢谢你的帮助! – Brian
@Brian:OOB配对需要来自每个蓝牙HCI的Hash和Randomizer值(如果只有一方可以发送数据,也可以进行单向认证,但这里不是这种情况)。我假设你会使用['readOutOfBandData'](http://www.androidjavadoc.com/2.3/android/bluetooth/BluetoothAdapter.html#readOutOfBandData%28%29)从android端获取你的值,但是我不'为Android开发,所以不能验证任何东西。 – Hasturkun