蓝牙配对码配置错误_安卓系统蓝牙配对流程分析
安卓系統藍牙配對流程分析
配對流程基本上始于首次連接一個藍牙設備的過程中,本端的搜索流程結束獲取到該設備的BluetoothDevice信息,就可以開啟配對流程。
配對,顧名思義就是將兩個設備通過相關技術進行綁定,達到能夠互相識別彼此的目的。因此通過藍牙技術進行的配對就是大家理解中的藍牙配對。隨著藍牙技術在消費市場上越來越普及,生活中很容易就能遇到藍牙配對這一使用藍牙功能是必不可缺失的步驟。本期我們就簡單聊聊安卓系統藍牙配對的流程是如何運行的。
Application通過framework層BluetoothDevice對外提供的接口createBond()?開啟這一流程。createBondOutOfBand()?通過OOB技術進行配對的接口,一般很少使用。所以應用層需要根據自己的實際使用場景選擇正確的接口。
藍牙服務層在配對流程中基本沒有復雜的操作,只是簡單地下發指令成功后,通過JNI層的異步回調處理配對狀態變化并將該變化對外廣播。其時序圖如下:
從上圖我們唯一需要注意的點就是配對流程開始前需要停掉搜索掃描流程(如果底層正在進行該流程),增加該操作的主要目的是為了確保配對流程能夠正常進行。因為搜索掃描和配對流程都會對遠端設備進行Discovery操作,防止這兩個流程沖突導致配對失敗。
協議棧接收到開始配對指令后,主要按照如下的配對狀態機進行切換(NumericComparison模式):
IDLE?:初始狀態值
GET_REM_NAME?:獲取遠端設備的藍牙名字
WAIT_PIN_REQ?:等待Controller請求PIN碼
WAIT_LOCAL_IOCAPS?:等待本端提供IO能力
WAIT_NUM_CONFIRM?:等待本端Host確認配對
WAIT_AUTH_COMPLETE?:等待鑒權(配對)流程完成
狀態切換對應到HCI上的交互見下圖:
每一個配對狀態的切換觸發時機從上面這張圖就十分明了,這里我就不做過多分析。感興趣的同學可以嘗試跟著上圖中HCI命令跟蹤下代碼流程。
協議棧的配對狀態隨著鑒權完成事件 Authentication Complete 的上報就切h換到初始值了,那這時是不是就代表整個配對流程完成了呢?非也,其實在安卓系統中到這里還不代表配對已經完成,因為上報JNI層的配對狀態變化回調并不是通過鑒權完成事件上報完成而回調的。
配對流程的主要工作完成后,協議棧還會繼續對該設備嘗試進行SDP服務發現,搜索該設備支持哪些協議服務,SDP服務搜索完成后才會上報JNI層配對狀態變成Bonded。
觸發SDP服務搜索的觸發時機是處理上報LinkKey的回調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 (tocheck?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?theACL?*/};配對流程實際上并不是孤立而存在的,配合著搜索掃描、連接等流程共同起作用的,彼此依賴,缺一不可。
本期的分享就到這里,感興趣的小伙伴歡迎私信留言一起討論。
總結
以上是生活随笔為你收集整理的蓝牙配对码配置错误_安卓系统蓝牙配对流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为mate与pro的区别
- 下一篇: java信息管理系统总结_java实现科