由于項目的用到低功耗藍(lán)牙的模塊羡亩,對這塊內(nèi)容做了一些了解丹禀,其中也借鑒了一些前輩寫的開源項目状勤,這里推薦一個BLE開源框架鞋怀,有時間可以瀏覽下源代碼,還是挺簡單的持搜,使用起來也挺不錯的密似,但是這個庫沒有實現(xiàn)藍(lán)牙重連接這個問題,由于我要用到這個功能葫盼,所以就改了下源碼残腌,讓設(shè)備可以重連接,因此產(chǎn)生了今天的問題
BLE如何實現(xiàn)重連接
連接
要想實現(xiàn)重連接贫导,至少我們需要知道如何去連接一個BLE設(shè)備抛猫,關(guān)鍵就是調(diào)用api了(這就是廢話),關(guān)鍵的連接API是
BluetoothDevice.connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
這個api會返回一個BluetoothGatt 的對象孩灯,調(diào)用這個連接的話闺金,可以看到下方的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
等待一段時間就會回調(diào)下方的回調(diào)函數(shù)
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的個數(shù)是有限的峰档,如果不斷開clientIf=5败匹,下次再調(diào)用上面的connectGatt()方法就會使得clientIf++變成6,這樣加下去的話面哥,等超出了設(shè)置的上限的話哎壳,就會導(dǎo)致手機無法在連接藍(lán)牙設(shè)備,只能開關(guān)系統(tǒng)藍(lán)牙重置才行尚卫,所以要實現(xiàn)重連接不能讓這個值一直去累加
因此每調(diào)用一次connectGatt()方法就需要調(diào)用一次disconnect()方法以及close()方法真正做清除clientIf這個事情的是close()方法來取消之前的clientIf=5
調(diào)用disconnect()和close()方法會在logcat產(chǎn)生如下的日志
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()方法的調(diào)用归榕,都是需要一個BluetoothGatt對象才能調(diào)用的,所以這個時候發(fā)現(xiàn)上面connectGatt()方法返回的BluetoothGatt對象就顯的非常重要了吱涉,需要用這個返回的對象調(diào)用disconnect()和close()方法否則clientIf則會一直在累加刹泄,需要保證這點
onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState)
通過上面的這個回調(diào)函數(shù)就能實現(xiàn)重連接操作,需要注意上面提到的內(nèi)容就行了