藍牙自動重連機制

扒一扒藍牙自動重連機制的實現原理

在這裏插入圖片描述
在日常使用藍牙的過程中,想必大家都發現了這樣一個現象:連接藍牙設備的手機在關閉再重新打開藍牙後,會自動連接上先前連接着的那個設備,同樣的場景對於安卓車機系統效果也是一致的。那這是怎麼實現的呢,本篇文章我們就來聊一聊安卓系統中藍牙的自動重連機制。

由於藍牙分爲Server和Client兩端,也就是手機和藍牙設備(車機系統)這兩類具體載體,所以藍牙重連機制也會有所差異,但是整體上的流程基本相同:
監聽藍牙的狀態變化 -> 獲取關閉藍牙前連接的設備信息 -> 自動連接

1、手機藍牙自動重連機制的主要在進程com.android.bluetooth中實現的,路徑:
packages\apps\Bluetooth\src\com\android\bluetooth\btservice\PhonePolicy.java
在這裏插入圖片描述
For循環中通過判斷設備某一個協議的優先級決定是否發起該協議的連接,只有Priority = BluetoothProfile.PRIORITY_AUTO_CONNECT(1000)的設備纔會自動連接。

2、車機藍牙自動重連機制的主要在進程com.android.car中實現的,路徑:
packages\services\Car\service\src\com\android\car\BluetoothDeviceConnectionPolicy.java
在這裏插入圖片描述

由於流程相差無幾,所以本篇就從車機藍牙系統的角度來分析下自動重連機制的實現原理,手機端的藍牙自動重連機制有機會再給大家扒(先挖個坑,待以後慢慢填…)。

車機藍牙的自動重連主要是在com.android.car這個服務進程中實現的,先來整體認識下這個進程吧。從該進程的清單文件中可以知道其始於CarService.java:
在這裏插入圖片描述

從系統的全局變量Settings中讀取已連接的設備信息,後面等監聽到藍牙狀態打開後,再去重連這些設備對應的各個協議。
該全局變量存儲路徑:/data/system/users/0/settings_secure.xml

註冊監聽的藍牙廣播有如下幾種類型:

  • BluetoothDevice.ACTION_BOND_STATE_CHANGED—設備配對狀
  • BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED—媒體音頻協議連接狀態
  • BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED—手機音頻協議連接狀態
  • BluetoothPan.ACTION_CONNECTION_STATE_CHANGED—共享網絡協議連接狀態
  • BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED—電話簿協議連接狀態
  • BluetoothMapClient.ACTION_CONNECTION_STATE_CHANGED—短信協議連接狀態
  • BluetoothAdapter.ACTION_STATE_CHANGED—藍牙開關狀態
  • BluetoothDevice.ACTION_UUID—設備UUID
    在這裏插入圖片描述

CarBluetoothUserService是通過bind服務PerUserCarService後getBluetoothUserService()間接使能起來的。

最後對協議重連是按照如下的協議順序來依次連接:

  1. BluetoothProfile.HEADSET_CLIENT
  2. BluetoothProfile.A2DP_SINK
  3. BluetoothProfile.PBAP_CLIENT
  4. BluetoothProfile.MAP_CLIENT
  5. BluetoothProfile.PAN

從整個流程分析下來最爲關鍵的部分就是從Setting中讀取數據,並且會在藍牙關閉或進程退出時將已連接設備的信息保存到Setting中。

實際上重連機制不單單適用於上述這種打開藍牙後的場景,有時藍牙設備間由於各種原因而導致鏈路斷開,過了一段時間需要自動重連上藍牙設備,這種場景在上面的重連機制中就不適用了,那該如何實現呢?

方法那也是有的,還記得我有寫過一篇《藍牙鏈路斷開的原因》中詳細講解了藍牙ACL鏈路斷開的幾種原因,然而不是每種斷開都需要自動重連的。比如用戶手動斷開藍牙這種情況下還發起自動重連,那就太讓人無語了。

所以我們只需要對由於鏈路超時導致的ACL斷開的場景,自動發起重連。這樣等兩個藍牙設備再次靠近時,就能自動連接成功。

具體實現方案可以參考《藍牙鏈路斷開的原因》中將ACL鏈路斷開的原因獲取到,然後判斷原因是鏈路超時,則發起重連。
在這裏插入圖片描述

由於兩個藍牙設備超時斷開後,再次靠近的時間是不確定的,如果只發起一次自動重連可能無法成功連接上設備,因此這裏的自動重連機制中需要加個循環以保證某一次成功連接。

藍牙重連機制就簡單分析到這兒,感興趣的小夥伴歡迎私信留言一起討論。

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章