【问题标题】:android ble connect slowlyandroid ble连接慢
【发布时间】: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,速度也很快。

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

【问题讨论】:

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

标签: android performance bluetooth bluetooth-lowenergy connect


【解决方案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() 方法中的连接

【讨论】:

  • 我遇到了完全相同的问题,请发布答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2014-10-20
  • 1970-01-01
  • 2021-05-05
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多