android ble连接慢

Posted

技术标签:

【中文标题】android ble连接慢【英文标题】:android ble connect slowly 【发布时间】:2014-04-08 11:38:23 【问题描述】:

您好,我正在编写一个 android 应用程序来连接 BLE 外围设备。安卓 4.4.2,银河 Nexus。

我的设备上有一个 LED 来指示连接状态。

问题是从 connectGatt() 调用到接收 onConnectionStateChange STATE_CONNECTED 的持续时间是如此不一致。有时它非常快,但大多数时候需要 5 秒或更长时间。关闭/打开蓝牙没有任何效果。

我在 PC 上使用 TI BLE Dongle 尝试了 TI BTool,它总是很快建立连接。

我也试过 iPhone 5S,速度也很快。

    有人也遇到过这个问题吗? 我们是否有机会改进这一点?

【问题讨论】:

好的,我找到了原因,我认为我滥用了 API:以前我用第二个参数调用 connectGatt = true connectGatt(context, true, gattCallback);但现在我将其更改为 connectGatt(context, false, gattCallback);并且连接时间大大提高 我已经设置了 connectGatt(context, false, gattCallback) 但仍然需要 4-5 秒来连接 ble 设备 【参考方案1】:

将 true 传递给 connectGatt() 自动连接参数请求后台连接,而传递 false 请求直接连接。 BluetoothGatt#connect() 总是请求后台连接。

后台连接(根据来自 4.4.2 AOSP 的 Bluedroid 来源)的扫描间隔为 1280 毫秒,窗口为 11.25 毫秒。这对应于大约 0.9% 的占空比,这解释了为什么连接在不扫描时可能需要很长时间才能完成。

直接连接的间隔为 60 毫秒,窗口为 30 毫秒,因此连接完成速度更快。此外,一次只能有一个未决的直接连接请求,并且在 30 秒后超时。 onConnectionStateChange() 以 state=2, status=133 被调用以指示此超时。

我已经在 Nexus5 上验证了这种行为,但显然是 YMMV。

我应该提一下,即使将 autoconnect=true 传递给 BluetoothDevice#connectGatt(),BluetoothGatt.java 中的竞争条件也会导致直接连接请求。

【讨论】:

如果 Android 的文档真的提到了这些,那就太棒了。这很重要。 导致直接连接而不是后台的竞争条件的详细描述:code.google.com/p/android/issues/detail?id=69834 我刚刚注意到,运行 Android 5.0.2 的 Sony Xperia (D5803) 不会调用 status=133 和 newState=Connected 的“onConnectionStateChange”,而是调用 newState= 的“onConnectionStateChange”已断开连接。 直到 2016-08-09 在官方文档中没有任何接近这个答案的东西。然而,超时现在似乎收到了“断开连接”的信号。 这非常有用。只是改变了这一点并大大提高了连接速度。【参考方案2】:

我尝试过慢速连接,但只有在尝试重新连接远程设备时,第一次连接设备没有问题,但重新连接仍然是 onClientRegistered() 方法中的连接

【讨论】:

我遇到了完全相同的问题,请发布答案

以上是关于android ble连接慢的主要内容,如果未能解决你的问题,请参考以下文章

Android 10 BLE 连接问题

Android中不稳定的BLE连接

如何通过android应用连接多个BLE设备?

与 BLE 设备保持连接的 Android 应用

如何在 Android 中获取当前连接的 BLE 外围设备

Android BLE Gatt 连接更改状态