【问题标题】:How to create Insecure RFCOMM Socket in Android?如何在 Android 中创建不安全的 RFCOMM 套接字?
【发布时间】:2011-07-15 13:38:30
【问题描述】:

我正在研究不安全地通过 rfcomm 套接字进行连接的方法。我能够找到下面提到的方式

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

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

【问题讨论】:

    标签: android bluetooth insecure-connection


    【解决方案1】:

    createInsecureRfcommSocketToServiceRecord() 从 Android API 级别 10 开始包含在内,因此文档将鼓励您使用它,因为文档始终遵循 API 的最新版本。如果您的目标 API 低于 10(也称为 2.3.3 或 Gingerbread),那么您无法公开访问该方法。

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

    归根结底,如果您想保证与您的蓝牙实现的通用兼容性,您的应用程序必须以 2.3.3(API 级别 10)为目标。由于现在为不安全的 RFCOMM 公开了一个公共 API,很难说底层私有实现是否有可能发生变化。

    【讨论】:

    • 非常感谢您为我指明了正确的方向。如果该 API 自 API 级别 10 起才可用,那么如果我使用 Android 2.1 进行开发,如何不安全地连接到设备
    • ATM,你找到了最好的折衷方案。请记住,反射解决方案可能会在以后的版本中消失,因此您可能需要编写代码以使用 Build.VERSION 检查设备上的版本,并使用 2.3 及更高版本的公共 API。这将要求您将目标 API 级别提高到 10,但将最低 API 级别保留为 5(或 7),以便它仍可在运行 2.1 或 2.2 的早期设备上运行。希望有帮助!
    • @Wireless,但它可以与 API 7 中的 createInsecureRfcommSocketToServiceRecord() 方法一起使用吗?
    • @Veer 我不确定你的意思,因为 createInsecureRfcommSocketToServiceRecord() 不在 API 7 中,它是在 API 10 中引入的。在此之前只能通过反射进行访问,这不能保证。也许重新阅读答案和后续的 cmets。
    • @Devunwired 如果我能对你的答案投票 10 次。刚刚弄清楚为什么我永远无法在我的应用中自动配对,现在我可以了,谢谢!
    【解决方案2】:

    这里大部分回复的答案都是在 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);
    

    就是这样!

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多