Android BLE應用開發的注意事項
1.在工廠中生產了很多裝置一起堆放時應用會可能發生ANR,原因是裝置很多時會不停的呼叫onLeScan()方法,在 BluetoothAdapter.startLeScan()
的時候,在BluetoothAdapter.LeScanCallback.onLeScan()
中不能做太多事情。
2.使用 BluetoothDevice.connectGatt()
或者 BluetoothGatt.connect()
等建立BluetoothGatt
連線的時候,在任何時刻都只能最多一個裝置在嘗試建立連線。如果同時對多個藍芽裝置發起建立 Gatt 連線請求。如果前面的裝置連線失敗了,後面的裝置請求會被永遠阻塞住,不會有任何連接回調。最後採取入隊出隊的形式有序的連線裝置,也就是上一次的連線成功、失敗或者Timeout後才進行下一次連線,需要注意的是連線超時時要呼叫BluetoothGatt.disconnect()
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升級的手機不能控制不能正常獲取裝置資訊,該問題待解決-----嘗試了很多方法。。。