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