【问题标题】:Unable to connect Android to a specific BLE device无法将 Android 连接到特定的 BLE 设备
【发布时间】:2018-05-11 23:50:02
【问题描述】:

我正在维护一个从多个 BLE 外围设备检索数据的旧版 Android 应用。尝试添加对新外围设备的支持,我发现应用程序无法连接到它。基本问题似乎是,当它调用.connectGatt() 时,我立即收到“已连接”错误。

我使用RxAndroidBle 库编写了一些测试代码。关闭autoConnect 标志后,设备会报告DISCONNECTED,然后是CONNECTING,然后(大约1.5 秒后)出现连接错误:Disconnected from <device address>。当autoConnect开启时,会顺利通过DISCONNECTEDCONNECTINGCONNECTED状态并正常运行。

我的测试的早期版本允许在连接阶段继续扫描。如果autoConnect 开启,它仍然有效,但它首先(错误地)报告“已经连接”,然后几秒钟后自行修复并连接正常。

无论autoConnect 的设置如何,旧版应用都不会连接。到目前为止,我最好的猜测是,该应用程序在找到设备后并没有很快停止扫描(这无关紧要,但正如我们所知,那里有很多片状 BLE 设备 - 如上所述,问题仅在此设备上发生)。是否有可能只是发现设备会导致它建立某种半断开的连接,从而阻止成功连接?

我使用的是 API 21,因此无法尝试其他形式的 .connectGatt()。 Nordic 的移动 nRF 扫描仪应用程序连接成功,但我认为该应用程序充满了针对行为不端设备的解决方法。

【问题讨论】:

  • “已连接”错误是什么意思? Android 的 BLE API 中没有定义这样的错误。
  • RxAndroidBle 库定义了一个 BleAlreadyConnectedException

标签: android bluetooth-lowenergy rxandroidble


【解决方案1】:

在 Android 6.0 及更高版本上,BluetoothDevice 的 connectGatt 方法支持允许强制 BLE 连接的“传输”参数。在旧版本的 Android 上,可以通过反射访问此版本的方法。使用 TRANSPORT_LE 选项可以解决许多双模设备的连接问题(至少对我而言 - 它没有记录默认的 TRANSPORT_AUTO 选项实际上做了什么 - 当两种模式都可用时,一些蓝牙堆栈可能更喜欢 BLE)

nRF Connect 应该有一个选项,优先选择 BLE 连接而不是 BR/EDR(甚至默认)。

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 2015-05-07
    • 1970-01-01
    • 2023-04-03
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2016-05-25
    相关资源
    最近更新 更多