您好,我正在编写一个 Android 应用程序来连接 BLE 外围设备。安卓 4.4.2,银河 Nexus。
我的设备上有一个 LED 来指示连接状态。
问题是从 connectGatt() 调用到接收 onConnectionStateChange STATE_CONNECTED
的持续时间是如此不一致。有时它非常快,但大多数时候需要 5 秒或更长时间。关闭/打开蓝牙没有任何作用。
我用 TI BLE 加密狗在 PC 上尝试了 TI BTool,它总是很快建立连接。
我也试过 iPhone 5S,速度也很快。
- 有人也遇到过这个问题吗?
- 我们是否有机会改进这一点?
最佳答案
将 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 ble连接慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214254/