关于BLE的重连接的问题

由于项目的用到低功耗蓝牙的模块,对这块内容做了一些了解,其中也借鉴了一些前辈写的开源项目,这里推荐一个BLE开源框架,有时间可以浏览下源代码,还是挺简单的,使用起来也挺不错的,但是这个库没有实现蓝牙重连接这个问题,由于我要用到这个功能,所以就改了下源码,让设备可以重连接,因此产生了今天的问题

BLE如何实现重连接

连接

要想实现重连接,至少我们需要知道如何去连接一个BLE设备,关键就是调用api了(这就是废话),关键的连接API是
BluetoothDevice.connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
这个api会返回一个BluetoothGatt 的对象,调用这个连接的话,可以看到下方的logcat会输出如下日志

07-27 17:52:02.629 19106-19106/com.icecold.sleepbandtest D/BluetoothGatt: connect() - device: C6:0F:E8:41:58:8B, auto: false
07-27 17:52:02.629 19106-19106/com.icecold.sleepbandtest D/BluetoothGatt: registerApp()
07-27 17:52:02.629 19106-19106/com.icecold.sleepbandtest D/BluetoothGatt: registerApp() - UUID=2feb8823-4072-4ba0-8695-c43f960ed167
07-27 17:52:02.645 19106-19118/com.icecold.sleepbandtest D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5

等待一段时间就会回调下方的回调函数

07-27 17:52:05.421 19106-19119/com.icecold.sleepbandtest D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=5 device=C6:0F:E8:41:58:8B

这里尤其需要注意的是clientIf=5,这个clientIf的个数是有限的,如果不断开clientIf=5,下次再调用上面的connectGatt()方法就会使得clientIf++变成6,这样加下去的话,等超出了设置的上限的话,就会导致手机无法在连接蓝牙设备,只能开关系统蓝牙重置才行,所以要实现重连接不能让这个值一直去累加

因此每调用一次connectGatt()方法就需要调用一次disconnect()方法以及close()方法真正做清除clientIf这个事情的是close()方法来取消之前的clientIf=5

调用disconnect()和close()方法会在logcat产生如下的日志

07-27 18:04:18.682 19106-19222/com.icecold.sleepbandtest D/BluetoothGatt: cancelOpen() - device: C6:0F:E8:41:58:8B
07-27 18:04:18.687 19106-19222/com.icecold.sleepbandtest D/BluetoothGatt: close()
07-27 18:04:18.688 19106-19222/com.icecold.sleepbandtest D/BluetoothGatt: unregisterApp() - mClientIf=5

注意这里的disconnect()和close()方法的调用,都是需要一个BluetoothGatt对象才能调用的,所以这个时候发现上面connectGatt()方法返回的BluetoothGatt对象就显的非常重要了,需要用这个返回的对象调用disconnect()和close()方法否则clientIf则会一直在累加,需要保证这点

onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState)

通过上面的这个回调函数就能实现重连接操作,需要注意上面提到的内容就行了

你可能感兴趣的:(关于BLE的重连接的问题)