您好我正在编写一个Android应用程序来连接BLE外围设备。 Android 4.4.2,Galaxy Nexus。
设备上有一个LED指示连接状态。
问题是从 connectGatt()调用到接收onConnectionStateChange STATE_CONNECTED
的持续时间是如此不一致。有时候它很快,但大部分时间需要5秒或更长时间。关闭/打开蓝牙没有任何影响。
我在PC上使用 TI BLE Dongle尝试了 TI BTool ,它总是能够非常快速地建立连接。
我也尝试使用iPhone 5S,速度也很快。
答案 0 :(得分:52)
将true传递给connectGatt()autoconnect参数请求后台连接,同时传递false请求直接连接。 BluetoothGatt #connect()始终请求后台连接。
背景连接(根据4.4.2 AOSP的Bluedroid来源)扫描间隔为1280ms,窗口为11.25ms。这相当于约0.9%的占空比,这解释了为什么连接在不扫描时可能需要很长时间才能完成。
直接连接的间隔为60ms,窗口为30ms,因此连接完成得更快。此外,一次只能有一个直接连接请求待处理,并且在30秒后超时。使用state = 2,status = 133调用onConnectionStateChange()以指示此超时。
我已经在Nexus5上验证了这种行为,但显然是YMMV。
我应该提一下,BluetoothGatt.java中存在竞争条件,即使将autoconnect = true传递给BluetoothDevice #connectGatt(),也会导致直接连接请求。
答案 1 :(得分:2)
我尝试过慢速连接,但只有在尝试重新连接远程设备时,首次连接设备才会出现问题,但重新连接仍然是onClientRegistered()方法中的连接