传统蓝牙BR/EDR的搜索Inquiry
傳統(tǒng)藍(lán)牙BR/EDR的搜索Inquiry
一提到藍(lán)牙想必大家都會(huì)隨口而出藍(lán)牙音樂、藍(lán)牙免提電話等等藍(lán)牙技術(shù)提供的這些功能,這也是用戶使用藍(lán)牙的目的。但所有這些功能得以正常使用,有一個(gè)必要條件——藍(lán)牙搜索。操作藍(lán)牙的這些功能必須得知道對(duì)端藍(lán)牙設(shè)備的存在,再與之建立ACL連接,那這就離不開這期的主題,本篇文章就簡(jiǎn)單介紹下傳統(tǒng)藍(lán)牙搜索Inquiry。
藍(lán)牙搜索協(xié)議簡(jiǎn)介
參考文件:藍(lán)牙核心協(xié)議《Core_v5.0.pdf》,第二卷,F部分
搜索Inquiry顧名思義就是檢測(cè)和收集周圍環(huán)境中的藍(lán)牙設(shè)備,根據(jù)詢問的方式可分為 One-Time Inquiry(一次性詢問) 和 Periodic inquiry(周期性詢問) 兩種搜索模式。需要周期性地搜索藍(lán)牙設(shè)備的情況下才會(huì)采用周期性詢問這種方式,但是由于該種模式使用的場(chǎng)景有限且對(duì)功耗是個(gè)不小的負(fù)擔(dān),所以現(xiàn)在市面上的藍(lán)牙設(shè)備基本不采用這種搜索模式,接下來就主要介紹下一次性詢問。
One-Time Inquiry:
步驟1:藍(lán)牙Host通過命令HCI_Inquiry告知控制器Controller進(jìn)入查詢模式,用于發(fā)現(xiàn)周圍環(huán)境中的其他藍(lán)牙設(shè)備。
步驟2:藍(lán)牙控制器Controller接收到上層開啟搜索指令后將以指定的查詢?cè)L問代碼(IAC)和查詢時(shí)長(zhǎng)啟動(dòng)藍(lán)牙基帶搜索查詢流程,對(duì)外發(fā)送ID包。周圍環(huán)境中的藍(lán)牙設(shè)備接收到ID包后會(huì)自己的設(shè)備信息封裝到FHS包中做出響應(yīng),控制器解析FHS包獲取所需的信息,并使用一個(gè)或多個(gè)查詢結(jié)果事件將找到的設(shè)備相關(guān)信息返回給主機(jī)Host。
步驟3(a):如果主機(jī)Host希望停止搜索查詢,則使用HCI_Inquiry_Cancel命令通知控制器Controller立即停止查詢過程,控制器接收到指令就會(huì)停止對(duì)外發(fā)送ID包執(zhí)行停止查詢流程。
步驟3(b):如果主機(jī)Host沒有主動(dòng)停止查詢,則控制器Controller會(huì)在查詢上報(bào)的結(jié)果已達(dá)數(shù)量限制或者查詢時(shí)長(zhǎng)已到而停止查詢,并將查詢的完成事件上報(bào)給Host。
經(jīng)過以上三步,一個(gè)完整的搜索查詢Inquiry流程就完成了。對(duì)于流程中涉及到的HCI命令或事件再做如下說明:
1、 HCI_Inquiry
命令中三個(gè)參數(shù)的含義如下所示
LAP:上述步驟2中的查詢?cè)L問代碼就是從該值派生得到的,具體取值范圍為是 0x9E8B00 ~ 0x9E8B3F,但是只有 0x9E8B00 和 0x9E8B33 這兩個(gè)數(shù)值是有效的,其他值保留供將來使用。
- 0x9E8B33 代表一般/無限制查詢?cè)L問代碼(GIAC)
- 0x9E8B00 代表有限的專用查詢?cè)L問代碼(LIAC)
由于LIAC的使用有其局限性,所以參數(shù)LAP基本上都是使用GIAC這一固定參數(shù)。
詳細(xì)介紹可以參考藍(lán)牙SIG官網(wǎng)Assigned Numbers中的Baseband部分。
鏈接:https://www.bluetooth.com/specifications/assigned-numbers/baseband/
Inquiry_Length:查詢模式的總持續(xù)時(shí)間,當(dāng)此時(shí)間超時(shí)后查詢將被停止,該參數(shù)的取值范圍及對(duì)應(yīng)的超時(shí)時(shí)間如下圖:
Num_Responses:在查詢停止之前可以接收的響應(yīng)數(shù),當(dāng)響應(yīng)數(shù)達(dá)到該值后,控制器Controller停止當(dāng)前的查詢,并上報(bào)Host查詢完成事件。該參數(shù)的取值范圍如下:
2、 上報(bào)查詢的結(jié)果
在當(dāng)前查詢期間響應(yīng)的藍(lán)牙設(shè)備如果未被上報(bào)過且該設(shè)備沒有被命令Set_Event_Filter過濾掉應(yīng)始終以如下三種事件之一(Inquiry Result、Inquiry Result with RSSI或者Extended Inquiry Result)上報(bào)主機(jī)Host查詢的結(jié)果,不管采用哪個(gè)事件上報(bào)Host,都是將查詢到的設(shè)備信息告知主機(jī)。事件中具體包含什么信息感興趣的同學(xué)可以執(zhí)行查看具體協(xié)議中HCI COMMANDS AND EVENTS部分。主機(jī)協(xié)議棧依次接收到這些設(shè)備信息后,解析出相應(yīng)的數(shù)據(jù)保存并上報(bào)藍(lán)牙服務(wù)層。
如果搜索到的藍(lán)牙設(shè)備在當(dāng)前查詢或查詢期間已經(jīng)被上報(bào)過,則該設(shè)備這次可能被上報(bào),也可能不被上報(bào),這取決于控制器Controller中的實(shí)現(xiàn)(對(duì)同一設(shè)備是只上報(bào)一次,還是只要設(shè)備響應(yīng)就上報(bào))。
最后隨著HCI_Inquiry_Complete事件的上報(bào),查詢流程就完結(jié)了。那本篇傳統(tǒng)藍(lán)牙查詢協(xié)議分享就到這,感興趣的小伙伴歡迎私信留言一起討論。
更多互聯(lián)互通技術(shù),歡迎關(guān)注微信公眾號(hào):Connectivity
總結(jié)
以上是生活随笔為你收集整理的传统蓝牙BR/EDR的搜索Inquiry的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Could not read JSON:
- 下一篇: 拓嘉辰丰:拼多多店铺DSR动态评分的更新