低功耗蓝牙学习笔记-链路层
聲明:BLE低功耗藍(lán)牙系列博客來自個(gè)人的學(xué)習(xí)總結(jié),其中肯定會(huì)包含很多錯(cuò)誤,如果發(fā)現(xiàn)歡迎幫忙指正。BLE內(nèi)容比較多,我現(xiàn)在還沒有完全學(xué)完,好在其分層設(shè)計(jì),所以可以每學(xué)完一個(gè)部分就可以做相應(yīng)的總結(jié)。需要說明的是該系列博客的大部分內(nèi)容來自《低功耗藍(lán)牙開發(fā)權(quán)威指南》這本書,還會(huì)包含韋東山藍(lán)牙系列課程的部分內(nèi)容。該系列博客可以提供些什么?該系列博客是對(duì)BLE相關(guān)的知識(shí)點(diǎn)做歸納總結(jié),注釋個(gè)人在學(xué)習(xí)過程中的觀點(diǎn)、理解。以后的內(nèi)容計(jì)劃有BLE應(yīng)用的使用和實(shí)現(xiàn)過程,盡可能的在博客內(nèi)容加入?yún)f(xié)議分析的過程,總之是從作者的學(xué)習(xí)歷程記錄BLE學(xué)習(xí)、理解的過程。通過對(duì)BLE低功耗藍(lán)牙的學(xué)習(xí)彌補(bǔ)了我對(duì)無線通訊技術(shù)的空白,今后持續(xù)學(xué)習(xí)BLE這項(xiàng)技術(shù),博客也會(huì)不斷完善,必要時(shí)進(jìn)行調(diào)整,修改。?
?
低功耗藍(lán)牙框架
下面這張圖就是就是低功耗藍(lán)牙的框架:上半部分為主機(jī)部分,下半部分為控制器部分。主機(jī)部分主要是軟件協(xié)議(藍(lán)牙協(xié)議棧),控制器部分其實(shí)是個(gè)帶有無線發(fā)送/接收模塊的MCU。當(dāng)我們的電腦沒有自帶藍(lán)牙模塊時(shí),需要買個(gè)藍(lán)牙適配器(控制器),這時(shí)電腦(主機(jī))和藍(lán)牙適配器(控制器)通訊是使用USB接口。
?
本章總結(jié)的鏈路層(LL)其實(shí)就是控制器的組成部分,物理層(PHY)如何進(jìn)行無線信號(hào)傳輸上一章已經(jīng)講過了。HCI是英文Host Controller Interface的縮寫,上面描述藍(lán)牙適配器的傳輸媒介是USB,也可以是UART、SDIO。控制器內(nèi)部如何實(shí)現(xiàn)我們不用關(guān)心,它是一套標(biāo)準(zhǔn)化的東西,我們只要了解它的工作方式、流程即可(控制器具有一定智能,實(shí)現(xiàn)起來還是很復(fù)雜的)。上面框架圖看不懂也沒關(guān)系,主機(jī)部分由后面涉及。
?
鏈路層的狀態(tài)機(jī)
無規(guī)矩不成方圓,鏈路層的狀態(tài)機(jī)規(guī)定了主/從機(jī)工作模式切換過程。如下圖:
首先無論主機(jī)(發(fā)起連接者),從機(jī)(被連接者)都是從就緒態(tài)開始。一臺(tái)機(jī)器可以選擇做主機(jī)也可以選擇做從機(jī),如果要做從機(jī)就得進(jìn)入到廣播態(tài)(必須打開發(fā)射器)->發(fā)送廣播->等待連接請求。主機(jī)則要進(jìn)入掃描態(tài)(必須打開接收器)->獲取廣播包->選擇要連接的設(shè)備,進(jìn)入發(fā)起態(tài)->發(fā)起連接請求->進(jìn)入連接態(tài)。從機(jī)收到連接請求后便可進(jìn)入連接態(tài),之后主機(jī)、從機(jī)之間就可以傳輸數(shù)據(jù)報(bào)文。
上面為鏈路層的概述,下面詳細(xì)內(nèi)容:
如上圖鏈路層包含如下幾種狀態(tài):就緒態(tài)、廣播態(tài)、掃描態(tài)、發(fā)起態(tài)、連接態(tài);
處于廣播態(tài)的鏈路層可以發(fā)出廣播報(bào)文,也可以發(fā)出掃描響應(yīng),用于回應(yīng)主動(dòng)掃描的設(shè)備(此時(shí)處于廣播態(tài)的設(shè)備同時(shí)打開了發(fā)射器和接收器)。
處于掃描態(tài)的設(shè)備能夠接受廣播通道的報(bào)文,掃描態(tài)可用于簡單偵聽哪些設(shè)備正在廣播。掃描態(tài)有兩個(gè)子狀態(tài):被動(dòng)掃描和主動(dòng)掃描。被動(dòng)掃描僅接受廣播報(bào)文。主動(dòng)掃描則發(fā)送掃描請求給廣播態(tài)設(shè)備,并獲取附加的掃描態(tài)響應(yīng)數(shù)據(jù)。
為了發(fā)起連接,鏈路層需要處于發(fā)起態(tài)。處于發(fā)起態(tài)的發(fā)起者,其接收機(jī)用于偵聽自己試圖連接的設(shè)備。如果收到了來自該設(shè)備的廣播報(bào)文,鏈路層會(huì)向其發(fā)送連接請求并進(jìn)入連接態(tài)。
從廣播態(tài)或發(fā)起態(tài)均可以進(jìn)入連接態(tài),兩種情況均源于發(fā)起者向廣播者發(fā)送連接請求報(bào)文。連接態(tài)有兩個(gè)子狀態(tài):主或從。連接態(tài)中,兩個(gè)設(shè)備相互傳送數(shù)據(jù)報(bào)文。這也是唯一一個(gè)用到數(shù)據(jù)報(bào)文的狀態(tài)。
主連接態(tài):主連接只能從發(fā)起態(tài)進(jìn)入,為了成為主設(shè)備,它必須向?qū)Χ嗽O(shè)備發(fā)起連接。主設(shè)備必須定期向向從設(shè)備發(fā)送報(bào)文。從設(shè)備只有通過回復(fù)這些報(bào)文才能發(fā)送自己的數(shù)據(jù)。
從連接態(tài):從連接態(tài)只能從廣播態(tài)進(jìn)入。為了成為從設(shè)備,它必須向?qū)Χ嗽O(shè)備進(jìn)行廣播。對(duì)于從設(shè)備,只有在正確接收主設(shè)備的報(bào)文后才能發(fā)送。收到從設(shè)備的一個(gè)報(bào)文后,從設(shè)備可以發(fā)送一個(gè)自己的報(bào)文。如果從設(shè)備想發(fā)送更多的數(shù)據(jù),則必須等待主設(shè)備發(fā)送另外的報(bào)文再回復(fù)。從設(shè)備也可以隨時(shí)忽略主設(shè)備已達(dá)到節(jié)能的目的。這樣一來,從設(shè)備可以通過“休眠”來節(jié)省大量的能量。
上面這段話講明白了,主從設(shè)備間是如何數(shù)據(jù)傳輸?shù)摹V鲝脑O(shè)備間都有接收器/發(fā)送器的情況下,如果雙方都隨意向?qū)Ψ桨l(fā)送信息,這時(shí)肯定要亂成一鍋粥。主從之間通訊過程可以描述為:主機(jī)定時(shí)向從機(jī)發(fā)送信息(攜帶主機(jī)發(fā)往從機(jī)的數(shù)據(jù)),從機(jī)收到消息后響應(yīng)(攜帶從機(jī)發(fā)往主機(jī)的數(shù)據(jù)),如果當(dāng)主機(jī)或從機(jī)沒有數(shù)據(jù)要發(fā)送給對(duì)方時(shí),攜帶數(shù)據(jù)長度為0即可。
?
鏈路層的報(bào)文
下面是報(bào)文的基本結(jié)構(gòu),適用于所有報(bào)文。無論是廣播報(bào)文還是數(shù)據(jù)報(bào)文都遵守該報(bào)文結(jié)構(gòu),BLE無線通訊以該報(bào)文結(jié)構(gòu)作為基礎(chǔ)。
?
前導(dǎo):報(bào)文最開始的8比特是01010101或者10101010序列。這是很簡單的交替序列。接收機(jī)可以用它來配置自動(dòng)增益控制,以及確定“0”、“1”比特所使用的頻率。
接入地址:接入地址的第一個(gè)比特決定了前導(dǎo)是01010101還是10101010,如果接入地址的第一個(gè)比特為“0”,則使用01010101序列;如果是“1”,則使用10101010序列。這保證了任一報(bào)文的前9個(gè)比特都是交替的。32比特的接入地址有兩種類型:
- 廣播接入地址
- 數(shù)據(jù)接入地址
廣播接入地址在廣播數(shù)據(jù),或是廣播、掃描、發(fā)起連接時(shí)使用。數(shù)據(jù)接入地址在連接建立之后的兩個(gè)設(shè)備間使用。
鏈路層也不知道其它設(shè)備什么時(shí)候會(huì)發(fā)送報(bào)文,因此只能保留最近40us接收到的比特,并在新的比特移入到寄存器的時(shí)候檢查序列是否滿足前導(dǎo)和接入地址。這一過程描述為接入地址求相關(guān)。
對(duì)于廣播信道,接入地址是固定值0x8E89BED6。對(duì)于數(shù)據(jù)通道,接入地址是一個(gè)隨機(jī)值。
報(bào)頭:報(bào)頭的內(nèi)容取決于該報(bào)文是廣播報(bào)文還是數(shù)據(jù)報(bào)文
對(duì)于廣播報(bào)文,報(bào)頭包含了廣播報(bào)文的類型以及一些標(biāo)記位,這些標(biāo)記位指出了報(bào)文使用的公共地址還是隨機(jī)地址。廣播報(bào)文類型共有7種,每種類型都具有不同的凈荷格式及行為:
ADV_IND ? ? ? ? ? ? ? ? ? ? ? ? ? 通用廣播指示
ADV_DIRECT_IND ? ? ? ? ? ? 定向連接指示
ADV_NONCONN_IND ? ? ? 不可連接指示
ADV_SCAN_IND????????????????可掃描指示
SCAN_REQ????????????????????????主動(dòng)掃描請求
SCAN_RSP ? ? ? ? ? ? ? ? ? ? ? ?主動(dòng)掃描響應(yīng)
CONNECT_REQ? ??? ??? ??? ? 連接請求?
長度:對(duì)于廣播報(bào)文,長度域包含6個(gè)比特,有效值范圍是6~37。對(duì)于數(shù)據(jù)報(bào)文,長度域包含5個(gè)比特,有效值范圍是0~31。長度域之后是凈荷,其長度是長度域指出的字節(jié)數(shù)。這里要注意的是,如果報(bào)文被加密,則需要包含4字節(jié)的消息完整性檢查域,實(shí)際的凈荷數(shù)據(jù)將被減少到最多27個(gè)字節(jié)。為了使得鏈路層設(shè)計(jì)得到簡化,未加密報(bào)文的凈荷也不允許超過27個(gè)字節(jié)的限制。
凈荷:凈荷是所傳輸?shù)摹罢鎸?shí)”數(shù)據(jù),可以是關(guān)于設(shè)備的廣播數(shù)據(jù),或者發(fā)給一定區(qū)域內(nèi)所有設(shè)備的服務(wù)數(shù)據(jù);可以是主動(dòng)掃描響應(yīng)的附加數(shù)據(jù),如設(shè)備名稱,實(shí)現(xiàn)的服務(wù);可以是建立或保持連接所需要的信息,可以是從一個(gè)設(shè)備到另一個(gè)設(shè)備的應(yīng)用層數(shù)據(jù)。
循環(huán)冗余校驗(yàn):報(bào)文的最后3個(gè)字節(jié)的CRC,CRC對(duì)報(bào)頭、長度域、以及凈荷域進(jìn)行計(jì)算。
?
鏈路層的信道
低功耗藍(lán)牙共有3個(gè)廣播信道和37個(gè)數(shù)據(jù)信道,3個(gè)信道分散在不同的頻段,可避免同時(shí)受到干擾
跳頻:跳頻算法用于數(shù)據(jù)連接中,數(shù)據(jù)信道有37個(gè),跳頻算法的公式如下(hop是一個(gè)5~16范圍內(nèi)的值):
下圖給出的是hop值為13的情況:
?
設(shè)備發(fā)現(xiàn)
共有四種不同類型的廣播:通用的、定向的、不可連接的、以及可發(fā)現(xiàn)的。設(shè)備每次廣播時(shí),會(huì)在3個(gè)廣播信道發(fā)送相同的報(bào)文。這些報(bào)文被稱為一次廣播事件。
除定向報(bào)文外,其它廣播事件均可以選擇20ms~10.28s不等的間隔。廣播事件之間的時(shí)間被稱為廣播間隔。主機(jī)可以控制該間隔。
但設(shè)備周期性的發(fā)送廣播會(huì)有一個(gè)問題:多個(gè)設(shè)備可能在很長一段時(shí)間內(nèi)同時(shí)廣播而造成干擾。為了防止這一情況,除定向廣播之外的其他廣播事件,會(huì)在上一次事件發(fā)生后加入0~10ms的隨機(jī)延時(shí)。
- 通用廣播
通用廣播是用途最廣的廣播方式
- 定向廣播
有時(shí),設(shè)備間需要快速建立連接,定向廣播事件就是為了盡可能快的建立連接。這種報(bào)文包含兩個(gè)地址:廣播者的地址和發(fā)起者的地址。發(fā)起設(shè)備收到發(fā)給自己的定向廣播報(bào)文后,可以立即發(fā)送連接請求作為回應(yīng)。定向廣播也有特殊的時(shí)序要求。完整的廣播事件必須3.75ms重復(fù)一次。如此快的發(fā)送會(huì)讓報(bào)文充斥著廣播信道,所以定向廣播不可以持續(xù)1.28以上的時(shí)間。如果主機(jī)沒有主動(dòng)要求停止,或者連接沒有建立,控制器都會(huì)自動(dòng)停止廣播。
- 不可連接廣播
不想被連接的設(shè)備使用不可連接廣播事件。這種廣播的典型應(yīng)用包括設(shè)備只想廣播數(shù)據(jù),而不想被掃描或者連接。這也是唯一可用于只有發(fā)射機(jī)而沒有接收機(jī)設(shè)備的廣播類型。
- 可發(fā)現(xiàn)廣播
這種廣播不能用于發(fā)起連接,但允許其他設(shè)備掃描該廣播設(shè)備
下面為通用廣播數(shù)據(jù)報(bào)文內(nèi)容:
通用廣播數(shù)據(jù)報(bào)文,頭部數(shù)據(jù)內(nèi)容:
通用廣播數(shù)據(jù)報(bào)文,廣播數(shù)據(jù)內(nèi)容:
廣播數(shù)據(jù)域格式為:長度域(1字節(jié)):類型(1字節(jié)):數(shù)據(jù)。
長度域的值為類型和數(shù)據(jù)的長度和。
廣播數(shù)據(jù)的接收無法被確認(rèn),必須認(rèn)為廣播是一種不可靠的操作。
?
建立連接
兩個(gè)設(shè)備建立連接的過程如下:
發(fā)起連接請求設(shè)備處于發(fā)起態(tài)(廣播報(bào)文),下面為發(fā)起連接請求的報(bào)文:
如上所示,連接請求包含了連接開始時(shí)需要的所有信息,包括:
連接時(shí)使用的接入地址:連接使用的接入地址總是由主設(shè)備來提供的,地址通過隨機(jī)生成(需要遵循一些規(guī)則)。接入地址主從設(shè)備共同使用,如果一個(gè)主設(shè)備對(duì)應(yīng)多個(gè)從設(shè)備,則主設(shè)備會(huì)為每次從設(shè)備選擇不同的隨機(jī)地址。
CRC初始值:CRC初始值是另一個(gè)由主設(shè)備提供的隨機(jī)數(shù)。隨機(jī)數(shù)的意義在于,即使接入地址相同的概率很低,萬一相同則可以比較CRC。
發(fā)送窗口大小
在這個(gè)時(shí)間段內(nèi),接收器持續(xù)監(jiān)聽,窗口大小小于連接間隔。
發(fā)送窗口偏移
發(fā)送連接請求多久后,主設(shè)備會(huì)發(fā)起第一個(gè)連接事件。
連接間隔
如上,連接間隔為24(30ms)
從設(shè)備延遲
如上,設(shè)備延遲為4,可以忽略4個(gè)連接事件
監(jiān)控超時(shí)
如上,監(jiān)控超時(shí)為720ms
自適應(yīng)跳頻信道圖
自適應(yīng)跳頻信道圖是數(shù)據(jù)通道的位掩碼,用來標(biāo)記信道的好壞。由于共有37個(gè)數(shù)據(jù)信道,信道圖的長度于是設(shè)為37位。如果某一位被設(shè)置為1,表明該信道良好。0表示信道很糟,不適合用于通訊。
跳頻算法增量
跳頻算法的跳數(shù)值是在5~16之間的隨機(jī)數(shù)
休眠時(shí)鐘精度
時(shí)鐘精度可以幫助從設(shè)備消除連接事件的不確定性
一旦收到或發(fā)出連接請求報(bào)文,設(shè)備既建立了連接,數(shù)據(jù)交換隨即開始,如建立連接過程所示,建立連接后第一個(gè)數(shù)據(jù)報(bào)文有主設(shè)備發(fā)出(對(duì)于從設(shè)備,只有在正確接收主設(shè)備的報(bào)文后才能發(fā)送)。
?
連接事件
一個(gè)連接事件是指主設(shè)備和從設(shè)備之間相互發(fā)送數(shù)據(jù)包的過程,可能有多次數(shù)據(jù)交互,每次數(shù)據(jù)包發(fā)送需要間隔150us。
當(dāng)主設(shè)備發(fā)送連接請求后,有哪些情況可能發(fā)生:
發(fā)送完連接請求后,主設(shè)備就認(rèn)為自己已經(jīng)建立了連接,緊接著是"發(fā)送窗口偏移",從設(shè)備收到連接請求的話可在此時(shí)啟動(dòng)接收器,在發(fā)送窗口時(shí)間內(nèi),主設(shè)備需要發(fā)起一個(gè)連接事件(數(shù)據(jù)包),否則從設(shè)備將進(jìn)入超時(shí)處理(停止偵聽,并會(huì)在一個(gè)連接間隔后再次嘗試)
如果一切正常,連接事件的進(jìn)行將始終位于一個(gè)頻率,這個(gè)頻率由連接間隔來決定,連接間隔的意思就是說,主設(shè)備多久會(huì)發(fā)起下一次連接事件。連接間隔必須是1.25ms的整數(shù)倍。連接事件定期發(fā)生,但從設(shè)備可以不每個(gè)連接事件都響應(yīng),已達(dá)到省電的目的,這里引入了設(shè)備延遲這個(gè)參數(shù),設(shè)備延遲表示從設(shè)備在必須偵聽之前可以忽略多少個(gè)連接事件。監(jiān)控超時(shí)是指總的超時(shí)時(shí)間不能超過這個(gè)值。
一般建議至少給從設(shè)備留出6次偵聽的機(jī)會(huì)。上面連接間隔為4,從設(shè)備必須偵聽第五個(gè)連接事件。換個(gè)說法是從設(shè)備至少需要在120ms內(nèi)偵聽一次,所以監(jiān)控超時(shí)最少需要比120ms多一點(diǎn),上面的超時(shí)時(shí)間為720,這樣一來,鏈路在最終斷開前從設(shè)備至少會(huì)有6次偵聽機(jī)會(huì)。
?
發(fā)送數(shù)據(jù)
第一次連接事件,主設(shè)備發(fā)給從設(shè)備的數(shù)據(jù)報(bào)文如下:
數(shù)據(jù)報(bào)文的凈荷可以為0~31字節(jié)不等,無論加密層加密與否,傳給控制器的數(shù)據(jù)包最多只能攜帶27個(gè)字節(jié)數(shù)據(jù)。
數(shù)據(jù)報(bào)文的頭部如上所示。
邏輯鏈路標(biāo)示符(LLID):用于判斷數(shù)據(jù)報(bào)文屬于下列哪種類型
11????鏈路層控制報(bào)文,用于管理連接,鏈路層之間的報(bào)文不會(huì)上傳到主機(jī),用于鏈路層與鏈路層之間的管理。
主機(jī)能夠發(fā)送大于27字節(jié)的數(shù)據(jù),但由于無法放入單個(gè)鏈路層的數(shù)據(jù)包,因此必須支持分段。具體的做法是把數(shù)據(jù)貼上“高層報(bào)文開始”,“高層報(bào)文延續(xù)”的標(biāo)簽。下圖給出了一個(gè)例子,三個(gè)數(shù)據(jù)報(bào)文屬于同一連接事件。
10????高層報(bào)文開始,也可以用于一個(gè)完整報(bào)文(提醒一下:上面報(bào)文LLID是......01,是大端格式)
01????高層報(bào)文延續(xù)
序列號(hào)(SN)、下一個(gè)預(yù)期的序列號(hào)(NESN)
建立連接后,第一個(gè)數(shù)據(jù)包的序列號(hào)為0,每一次發(fā)送新的數(shù)據(jù)包時(shí),其序號(hào)與上個(gè)數(shù)據(jù)包的序列號(hào)不同。這使得接收裝置能否判斷接收的數(shù)據(jù)包的性質(zhì):如果序列號(hào)與之前一樣,則為重傳報(bào)文,如果序列號(hào)與之前的不同,則為新報(bào)文。
如果從設(shè)備成功接收序列號(hào)為0的報(bào)文,在其確認(rèn)報(bào)文中,應(yīng)將下一個(gè)預(yù)期序列號(hào)設(shè)為1,否則序列號(hào)為0的數(shù)據(jù)包將被重傳。下一個(gè)預(yù)期的序列號(hào)由從設(shè)備設(shè)置。
更多數(shù)據(jù)位
用來通知對(duì)端設(shè)備自己還有其他的數(shù)據(jù)準(zhǔn)備發(fā)送。如果收到設(shè)置了更多數(shù)據(jù)位的數(shù)據(jù)包,應(yīng)該在當(dāng)前連接事件中繼續(xù)與對(duì)端設(shè)備通訊。一旦不再有數(shù)據(jù)發(fā)送,連接事件會(huì)迅速關(guān)閉。
下圖,講述了關(guān)于序列號(hào)、下一個(gè)預(yù)期序列號(hào)和更多數(shù)據(jù)位的例子。下面有兩個(gè)連接事件。
總結(jié)
以上是生活随笔為你收集整理的低功耗蓝牙学习笔记-链路层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wpf响应式布局
- 下一篇: 数字孪生智慧园区教学实训平台建设研究案例