安卓系統藍牙配對流程分析

安卓系統藍牙配對流程分析

在這裏插入圖片描述

配對流程基本上始於首次連接一個藍牙設備的過程中,本端的搜索流程結束獲取到該設備的BluetoothDevice信息,就可以開啓配對流程。

配對,顧名思義就是將兩個設備通過相關技術進行綁定,達到能夠互相識別彼此的目的。因此通過藍牙技術進行的配對就是大家理解中的藍牙配對。隨着藍牙技術在消費市場上越來越普及,生活中很容易就能遇到藍牙配對這一使用藍牙功能事必不可缺失的步驟。本期我們就簡單聊聊安卓系統藍牙配對的流程是如何運行的。

Application通過framework層BluetoothDevice對外提供的接口createBond()開啓這一流程。createBondOutOfBand()通過OOB技術進行配對的接口,一般很少使用。所以應用層需要根據自己的實際使用場景選擇正確的接口。

藍牙服務層在配對流程中基本沒有複雜的操作,只是簡單地下發指令成功後,通過JNI層的異步回調處理配對狀態變化並將該變化對外廣播。其時序圖如下:
在這裏插入圖片描述

從上圖我們唯一需要注意的點就是配對流程開始前需要停掉搜索掃描流程(如果底層正在進行該流程),增加該操作的主要目的是爲了確保配對流程能夠正常進行。因爲搜索掃描和配對流程都會對遠端設備進行Discovery操作,防止這兩個流程衝突導致配對失敗。

協議棧接收到開始配對指令後,主要按照如下的配對狀態機進行切換(Numeric Comparison模式):
在這裏插入圖片描述

  • IDLE:初始狀態值
  • GET_REM_NAME:獲取遠端設備的藍牙名字
  • WAIT_PIN_REQ:等待Controller請求PIN
  • WAIT_LOCAL_IOCAPS:等待本端提供IO能力
  • WAIT_NUM_CONFIRM:等待本端Host確認配對
  • WAIT_AUTH_COMPLETE:等待鑑權(配對)流程完成

狀態切換對應到HCI上的交互見下圖:
在這裏插入圖片描述

每一個配對狀態的切換觸發時機從上面這張圖就十分明瞭,這裏我就不做過多分析。感興趣的同學可以嘗試跟着上圖中HCI命令跟蹤下代碼流程。

協議棧的配對狀態隨着鑑權完成事件Authentication Complete的上報就切換到初始值了,那這時是不是就代表整個配對流程完成了呢?非也,其實在安卓系統中到這裏還不代表配對已經完成,因爲上報JNI層的配對狀態變化回調並不是通過鑑權完成事件上報完成而回調的。

配對流程的主要工作完成後,協議棧還會繼續對該設備嘗試進行SDP服務發現,搜索該設備支持哪些協議服務,SDP服務搜索完成後纔會上報JNI層配對狀態變成Bonded。

觸發SDP服務搜索的觸發時機是處理上報Link Key的回調bta_dm_new_link_key_cback()中通過 event = BTA_DM_AUTH_CMPL_EVT 觸發的。

隨後在函數btif_dm_auth_cmpl_evt()中嘗試對該設備進行SDP服務發現,如下圖:
在這裏插入圖片描述

SDP服務發現完成後通過回調處理函數btif_dm_search_services_evt()中 event = BTA_DM_DISC_RES_EVT上 報JNI 層配對狀態變化到Bonded。

至此安卓系統中藍牙配對流程纔算閉環完成,上述過程我以Numeric Comparison配對模型爲依據介紹了整個流程,其他配對模型類似,就不一一做出說明了,但協議棧配對狀態機的全部值如下,其他模型的配對流程也是在這幾種狀態機組合下進行切換運行的:

enum {
  BTM_PAIR_STATE_IDLE, 					/* Idle */
  	
  BTM_PAIR_STATE_GET_REM_NAME, 			/* Getting the remote name
  												(to check for SM4) */
  BTM_PAIR_STATE_WAIT_PIN_REQ, 			/* Started authentication, waiting for PIN req
                                  				(PIN is pre-fetched) */
  BTM_PAIR_STATE_WAIT_LOCAL_PIN,       	/* Waiting for local PIN code */
  
  BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM, 	/* Waiting user 'yes' to numeric confirmation */
  
  BTM_PAIR_STATE_KEY_ENTRY, 			/* Key entry state (we are a keyboard) */
  
  BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP, 	/* Waiting for local response to peer OOB
  												data */
  BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS, 	/* Waiting for local IO capabilities and OOB
                                       			data */
  BTM_PAIR_STATE_INCOMING_SSP, 			/* Incoming SSP (got peer IO caps when idle) */
  
  BTM_PAIR_STATE_WAIT_AUTH_COMPLETE, 	/* All done, waiting authentication
                                        		cpmplete */
  BTM_PAIR_STATE_WAIT_DISCONNECT     	/* Waiting to disconnect the ACL */
};

配對流程實際上並不是孤立而存在的,配合着搜索掃描、連接等流程共同起作用的,彼此依賴,缺一不可。

本期的分享就到這裏,感興趣的小夥伴歡迎私信留言一起討論。

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

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