關(guān)于BLE的重連接的問題

由于項目的用到低功耗藍牙的模塊,對這塊內(nèi)容做了一些了解,其中也借鑒了一些前輩寫的開源項目,這里推薦一個BLE開源框架,有時間可以瀏覽下源代碼,還是挺簡單的,使用起來也挺不錯的,但是這個庫沒有實現(xià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)致手機無法在連接藍牙設(shè)備,只能開關(guān)系統(tǒng)藍牙重置才行,所以要實現(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)容就行了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容