天天看點

Android ble開發中遇到的問題

1.在工廠中生産了很多裝置一起堆放時應用會可能發生ANR,原因是裝置很多時會不停的調用onLeScan()方法,在

BluetoothAdapter.startLeScan()

的時候,在

BluetoothAdapter.LeScanCallback.onLeScan()

中不能做太多事情。

2.使用 

BluetoothDevice.connectGatt()

或者 

BluetoothGatt.connect()

等建立

BluetoothGatt

連接配接的時候,在任何時刻都隻能最多一個裝置在嘗試建立連接配接。如果同時對多個藍牙裝置發起建立 Gatt 連接配接請求。如果前面的裝置連接配接失敗了,後面的裝置請求會被永遠阻塞住,不會有任何連接配接回調。最後采取入隊出隊的形式有序的連接配接裝置,也就是上一次的連接配接成功、失敗或者Timeout後才進行下一次連接配接,需要注意的是連接配接逾時時要調用

BluetoothGatt.disconnect()

來釋放建立連接配接請求,在Android BLE中以請求響應的思維去做開發會避免掉很多問題,這裡說的入隊出隊形式後面還有幾個地方涉及。

3.在連續頻繁調用writeCharacteristic() /readCharacteristic()的情況下最好是要等到onCharacteristicWrite() / onCharactericRead()回調後在發送下一個讀寫指令,即隊列形式的去發送write/read指令。

4.在工廠生産環境下,選擇裝置連接配接時找不到裝置,開始是采取裝置包裝上列印裝置碼通過輸入裝置碼或者掃描二維碼來進行連接配接裝置,但是後面發現這種方法效率太低;研究發現當裝置靠手機最近時信号是最強的,是以在搜尋清單按照信号強度來排序顯示裝置,是以這種情況往往拿在手上的裝置排在搜尋裝置清單的第一位

5.開啟搜尋時要定時的主動停止搜尋,不然久了之後會無法搜尋到裝置或者手機搜尋裝置很慢

6.在搜尋中或者連結裝置的過程中關閉手機藍牙會導緻app發生ANR,是以當監聽到藍牙關閉廣播時要主動停止搜尋裝置,調用disconnect()取消連結

7.Android手機部分手機有個BUG對于bonded的裝置discoverServier()時候會擷取到之前綁定裝置的server緩存導緻擷取不到裝置的最新的服務清單,是以要用反射調用BluetoothGatt類的隐藏方法reflesh()去重新整理cache。此方法見與Nordic的Android dfu更新子產品有解釋

8.華為手機做dfu更新時無法控制裝置而且擷取到的電量之類的資料都是亂碼的,但是用其他手機連接配接該裝置又可以正常擷取,唯除用于進行DFU更新的手機不能控制不能正常擷取裝置資訊,該問題待解決-----嘗試了很多方法。。。