如何在Android中创建不安全的RFCOMM套接字?

时间:2011-03-15 06:49:20

标签: android bluetooth insecure-connection

我正在寻找不安全地连接rfcomm socket的方法。我能够找到下面提到的方式

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

这暂时正在做我想做的事。即使是here上的文档也说我们需要使用createInsecureRfcommSocketToServiceRecord进行不安全的连接。但是没有这样的方法。我发现的唯一方法是使用如上所示的反射。甚至在createInsecureRfcommSocket中传递的方法,而不是createInsecureRfcommSocketToServiceRecord。我只是想知道这种方式有多可靠。如果我在方法中提到createInsecureRfcommSocketToServiceRecord,则连接永远不会发生。

3 个答案:

答案 0 :(得分:29)

从Android API级别10开始包含

createInsecureRfcommSocketToServiceRecord(),因此文档会鼓励您使用它,因为文档始终遵循最新版本的API。如果您的目标API低于10(a.k.a。2.3.3或Gingerbread),那么您无法公开访问该方法。

您通过反射createInsecureRfcommSocket()调用的方法是BluetoothDevice内部的私有方法,自大约Android 2.0以来一直存在。调用隐藏方法的问题在于它们不能保证在所有设备上或将来存在......所以你赌博了一下。我的猜测是你的方法大部分时间都可能在大多数2.0以上的设备上运行,因为实现其公共表兄createRfcommSocketToServiceRecord()所需的服务在堆栈层非常相似。

最重要的是,如果您希望保证与蓝牙实施的通用兼容性,则必须将2.3.3(API级别10)与您的应用程序对准。现在公开的API暴露在不安全的RFCOMM中,很难说底层私有实现是否更有可能发生变化。

答案 1 :(得分:5)

这里回答的大部分答案都是在2011年3月30日之前,在这篇文章中。

在我的应用中寻找类似问题的解决方案时,我发现这个博客是在3月30日写的。

它将帮助所有仍在寻找此问题解决方案的人

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/

解决方案现在变得非常简单。只需在项目中包含InsecureBluetooth.java,然后在BluetoothChatService.java中更改2行。

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);

tmp   = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);

多数民众赞成!

答案 2 :(得分:0)