能夠經過如下兩點加速藍牙鏈接:
一、更新鏈接參數
interval:鏈接間隔(connection intervals ),範圍在 7.5 毫秒 到 4 秒。
latency:鏈接延遲
。。。 還有一些其它參數.
Android API不提供具體的參數值, 只提供了三個常量:
CONNECTION_PRIORITY_HIGH
CONNECTION_PRIORITY_BALANCED
CONNECTION_PRIORITY_LOW_POWER
從Android的源碼找到對應的參數:
在發起鏈接請求時,經過BluetoothGatt實例發起更新:
mBluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
二、在請求鏈接時,設置自動鏈接標識爲 false。
自動鏈接標識爲true 時,雖然能提升鏈接成功的機率,可是會致使鏈接時間加長.
具體解釋以下:
鏈接失敗的問題
因爲Android的藍牙協議棧bluedroid 在低版本存在一些bug,如當鏈接的時候,callback 返回 status=133 的狀況. 出現這種狀況的緣由應該手機APP頻繁的操做鏈接以及斷開。解決的方式能夠參考如下幾種:
一、當斷開鏈接時,調用mBluetoothGatt.disconnect(); 該方式只是斷開鏈接,並無真正釋放資源,能夠在 disconnect 的回調裏調用 mBluetoothGatt.close()
二、當鏈接同一臺設備時,可經過判斷地址是否同樣,使用mBluetoothGatt.connect(); 但這方式彷佛會致使鏈接放慢.
三、出現這種狀況,delay 一下子,而後再重連. 只能經過屢次重連方式。
四、從google 回來的一些資料顯示,當手機斷開鏈接 mBluetoothGatt.disconnect(); 甚至是mBluetoothGatt.close()。 app藍牙只是給藍牙服務發送了一個斷開鏈接,藍牙服務是以隊列的形式去處理它. 要完全斷開該鏈接,能夠經過讓對方設備(從設備)也主動斷開。我嘗試過這種方式,確實解決了我當前的問題.
connection fail 資料:
status=133, 對於狀態的錯誤:GATT_ERROR
connections fail :
1)If your connections fail to happen, the BLE peripheral may be sending packets too slowly, or their signal level may be too low. This can be an issue with output power, range between the devices, interference, or other issues.
2)The BLE connection settings are some of the most critical parameters to understand in BLE. Connection interval, slave latency and other settings are sent upon during a connection, and they can tell you a lot about what the devices agree to. If you’re having connection problems, it can be that the two devices don’t agree on the parameters (and the central device disconnects).
另外能夠查看一下Android源碼 packages\apps\Bluetooth 目錄下 bluetooth APP 的源碼,看處理的方式.
BLE 鏈接過程:
注:圖中M表明手機,S表明設備B,M->S表示手機將數據包發給設備B,即手機開啓Tx窗口,設備B開啓Rx窗口;S->M正好相反,表示設備B將數據包發給手機,即設備B開啓Tx窗口,手機開啓Rx窗口。
如圖所示,手機在收到A1廣播包ADV_IND後,以此爲初始錨點(這個錨點不是鏈接的錨點),T_IFS後給Advertiser發送一個connection request命令,即A2數據包,告訴advertiser我將要過來連你,請作好準備。Advertiser根據connect_req命令信息作好接收準備,connect_req包含以下關鍵信息:
- Transmit window offset,發送窗口偏移
- Transmit window size, 發送窗口大小
- connection interval 鏈接間隔
- latency 從設備延遲
- timeout 監控超時
.......
這些參數能夠由主設備肯定,也可讓從設備肯定. 咱們取了最優(也是最耗電的配置)
connection interval = 7.5ms
latency = 0
timeout = 4000ms
當主設備發起一個鏈接請求後(意思告訴從設備,我要連你, 要你作好準備), 在一個1.25ms時間單位, 加上發送窗口大小,發送窗口偏移時間後,發送一個空白給 從設備,並準備接收從設備的包,當接收到從設備的空包後,表示鏈接正式確立。咱們能夠理想大概這樣計算鏈接時間:
time = 1.25ms + Transmit window offset + Transmit window size + connection interval
鏈接成功後,master和slave在每個connection interval開始的時候,都必須交互一次,即master給slave發一個包,slave再給master發一個包,整個交互過程稱爲一個connection event。
其它資料:
Android BLE Issues:
開源框架 SweetBlue 對藍牙問題的總結:
google bluetooth的問題列表: