Low Power Bluetooth

一、ClientIf Value超過32,導致Gatt通道無法建立(257)

ClientIf:

ClientIf Value簡而言之是andorid系統中用於唯一表示某個Gatt鏈接的ID號,唯一標識,當我們的應用建立起一個Gatt通道,系統會查詢當前可用的ClientIf Value,然後註冊該ClientIf Value,代表該Gatt通道。當應用close gatt時,該ClientIf Value纔會再次變爲可用狀態。系統ClientIf的最大值爲32。

原因:

從上小節ClientIf的信息知道ClientIf的最大值爲32,每次建立Gatt通道後,系統會爲此註冊一個ClientIf Value,所以當設備斷鏈時沒有將Gatt通道資源destory,所以系統認爲當前ClientIf Value值是可用的,當設備重複斷鏈鏈接時,ClientIf Value會一直增加,直到到最大限度32,導致Gatt之後再也無法建立。

BluetoothGattCallback.onConnectionStateChange中state返回257

這裏寫圖片描述

解決辦法:
在每次設備斷鏈後,主動調用:

mBluetoothGatt.close();
mBluetoothGatt.disconnect();

二、write data failed,系統log提示already has a pending command!!

問題情形:
當我通過

writeSuc =  mbluetoothgatt.writeCharacteristic(mcharacteristic);

writeSuc 老是返回false,導致於設備交互失敗,後面儘管重複可能也會一直失敗的情況

原因分析:
通過抓取系統log看到

 already has a pending command!!

已經有一個等待的命令。

在藍牙協議棧中write data是通過隊列緩存去寫數據,但添加一組數據到藍牙協議棧,當藍牙協議棧還未處理完成這一組數據我們立馬又添加了另一組數據,於是有了剛纔的提示 already has a pending command!!

解決辦法:
當收到

BluetoothGattCallback.onCharacteristicWrite

回調才繼續write下一組data。

發佈了91 篇原創文章 · 獲贊 165 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章