以下均為自己在Android ble開發項目中遇到的問題 1.儘量不要在BluetoothGattCallback裡面的回調函數中執行讀寫通知操作,最多一個,因為例如在onServicesDiscovered回調函數中只會傳一個寫操作,不管裡面有多少個,而通知如setCharacteristicNo ...
以下均為自己在Android ble開發項目中遇到的問題
1.儘量不要在BluetoothGattCallback裡面的回調函數中執行讀寫通知操作,最多一個,因為例如在onServicesDiscovered回調函數中只會傳一個寫操作,不管裡面有多少個,而通知如setCharacteristicNotification(characterist,true)也有寫操作,所以如果需要同時執行多步徵特操作時,不能在回調函數中執行,不然只會執行第一步特征操作。
2.讀寫通知都是非同步操作,但是一般必須一步一步地執行,只有當一個寫特征操作完成並回調後才能執行下一個,不然只會執行最後一個,所以需要在兩個寫特征操作之間加一個睡眠時間如Thread.sleep(500),具體時間自己把握;
3.很多藍牙設備產家都會弄入自己的編碼格式,所以有必要需要閱讀對應品牌的通訊協議,因為發送的數據和接收的數據都需要根據產品的通訊協議來解讀,可能在讀取藍牙設備的數據時需要先向設備發送命令,讓其響應才行,有時還不只需要寫一條命令,我遇到的問題是需要寫兩條不同的命令
4.status為133時並不一定是GATT沒有關閉,也有可能是藍牙適配器沒電了,如果軟體代碼自認為沒問題,那就觀察一下藍牙是否正常工作,藍牙燈是否有在閃,我遇到的是藍牙燈沒閃數據就讀不到,然後status變為8並且再連接之後會出現133,只有當有電藍牙燈亮時133才會消失且正常讀取數據。
5.使用characteristic.getValue()時得到的是一個byte[]數組,可以將其轉化為十六進位字元串方便查看協議解碼,在寫特征操作設置值是應該傳入byte[],因為自己認為寫入的字元串是十六進位的,其實不是,應該將字元串轉為byte[]
6.藍牙設備一般只能發送20個位元組的數據,可能一次接收的數據不是完整的數據,需要將後面的數據連接起來構成一串完整的數據
註:未經允許禁止轉載!!!