低功耗藍牙學習筆記-鏈路層

聲明:BLE低功耗藍牙系列博客來自個人的學習總結,其中肯定會包含很多錯誤,如果發現歡迎幫忙指正。BLE內容比較多,我現在還沒有完全學完,好在其分層設計,所以可以每學完一個部分就可以做相應的總結。需要說明的是該系列博客的大部分內容來自《低功耗藍牙開發權威指南》這本書,還會包含韋東山藍牙系列課程的部分內容。該系列博客可以提供些什麼?該系列博客是對BLE相關的知識點做歸納總結,註釋個人在學習過程中的觀點、理解。以後的內容計劃有BLE應用的使用和實現過程,儘可能的在博客內容加入協議分析的過程,總之是從作者的學習歷程記錄BLE學習、理解的過程。通過對BLE低功耗藍牙的學習彌補了我對無線通訊技術的空白,今後持續學習BLE這項技術,博客也會不斷完善,必要時進行調整,修改。 

 

低功耗藍牙框架

下面這張圖就是就是低功耗藍牙的框架:上半部分爲主機部分,下半部分爲控制器部分。主機部分主要是軟件協議(藍牙協議棧),控制器部分其實是個帶有無線發送/接收模塊的MCU。當我們的電腦沒有自帶藍牙模塊時,需要買個藍牙適配器(控制器),這時電腦(主機)和藍牙適配器(控制器)通訊是使用USB接口。

 

本章總結的鏈路層(LL)其實就是控制器的組成部分,物理層(PHY)如何進行無線信號傳輸上一章已經講過了。HCI是英文Host Controller Interface的縮寫,上面描述藍牙適配器的傳輸媒介是USB,也可以是UART、SDIO。控制器內部如何實現我們不用關心,它是一套標準化的東西,我們只要瞭解它的工作方式、流程即可(控制器具有一定智能,實現起來還是很複雜的)。上面框架圖看不懂也沒關係,主機部分由後面涉及。

 

鏈路層的狀態機

無規矩不成方圓,鏈路層的狀態機規定了主/從機工作模式切換過程。如下圖:

首先無論主機(發起連接者),從機(被連接者)都是從就緒態開始。一臺機器可以選擇做主機也可以選擇做從機,如果要做從機就得進入到廣播態(必須打開發射器)->發送廣播->等待連接請求。主機則要進入掃描態(必須打開接收器)->獲取廣播包->選擇要連接的設備,進入發起態->發起連接請求->進入連接態。從機收到連接請求後便可進入連接態,之後主機、從機之間就可以傳輸數據報文。

上面爲鏈路層的概述,下面詳細內容:

如上圖鏈路層包含如下幾種狀態:就緒態、廣播態、掃描態、發起態、連接態;

處於廣播態的鏈路層可以發出廣播報文,也可以發出掃描響應,用於迴應主動掃描的設備(此時處於廣播態的設備同時打開了發射器和接收器)。

處於掃描態的設備能夠接受廣播通道的報文,掃描態可用於簡單偵聽哪些設備正在廣播。掃描態有兩個子狀態:被動掃描和主動掃描。被動掃描僅接受廣播報文。主動掃描則發送掃描請求給廣播態設備,並獲取附加的掃描態響應數據。

爲了發起連接,鏈路層需要處於發起態。處於發起態的發起者,其接收機用於偵聽自己試圖連接的設備。如果收到了來自該設備的廣播報文,鏈路層會向其發送連接請求並進入連接態。

從廣播態或發起態均可以進入連接態,兩種情況均源於發起者向廣播者發送連接請求報文。連接態有兩個子狀態:主或從。連接態中,兩個設備相互傳送數據報文。這也是唯一一個用到數據報文的狀態。

主連接態:主連接只能從發起態進入,爲了成爲主設備,它必須向對端設備發起連接。主設備必須定期向向從設備發送報文。從設備只有通過回覆這些報文才能發送自己的數據。

從連接態:從連接態只能從廣播態進入。爲了成爲從設備,它必須向對端設備進行廣播。對於從設備,只有在正確接收主設備的報文後才能發送。收到從設備的一個報文後,從設備可以發送一個自己的報文。如果從設備想發送更多的數據,則必須等待主設備發送另外的報文再回復。從設備也可以隨時忽略主設備已達到節能的目的。這樣一來,從設備可以通過“休眠”來節省大量的能量。

上面這段話講明白了,主從設備間是如何數據傳輸的。主從設備間都有接收器/發送器的情況下,如果雙方都隨意向對方發送信息,這時肯定要亂成一鍋粥。主從之間通訊過程可以描述爲:主機定時向從機發送信息(攜帶主機發往從機的數據),從機收到消息後響應(攜帶從機發往主機的數據),如果當主機或從機沒有數據要發送給對方時,攜帶數據長度爲0即可。

 

鏈路層的報文

下面是報文的基本結構,適用於所有報文。無論是廣播報文還是數據報文都遵守該報文結構,BLE無線通訊以該報文結構作爲基礎。

 

前導:報文最開始的8比特是01010101或者10101010序列。這是很簡單的交替序列。接收機可以用它來配置自動增益控制,以及確定“0”、“1”比特所使用的頻率。

接入地址:接入地址的第一個比特決定了前導是01010101還是10101010,如果接入地址的第一個比特爲“0”,則使用01010101序列;如果是“1”,則使用10101010序列。這保證了任一報文的前9個比特都是交替的。32比特的接入地址有兩種類型:

  • 廣播接入地址
  • 數據接入地址

廣播接入地址在廣播數據,或是廣播、掃描、發起連接時使用。數據接入地址在連接建立之後的兩個設備間使用。

鏈路層也不知道其它設備什麼時候會發送報文,因此只能保留最近40us接收到的比特,並在新的比特移入到寄存器的時候檢查序列是否滿足前導和接入地址。這一過程描述爲接入地址求相關。

對於廣播信道,接入地址是固定值0x8E89BED6。對於數據通道,接入地址是一個隨機值。

報頭:報頭的內容取決於該報文是廣播報文還是數據報文

對於廣播報文,報頭包含了廣播報文的類型以及一些標記位,這些標記位指出了報文使用的公共地址還是隨機地址。廣播報文類型共有7種,每種類型都具有不同的淨荷格式及行爲:

ADV_IND                           通用廣播指示

ADV_DIRECT_IND             定向連接指示

ADV_NONCONN_IND       不可連接指示

ADV_SCAN_IND                可掃描指示

SCAN_REQ                        主動掃描請求

SCAN_RSP                        主動掃描響應

CONNECT_REQ                連接請求 

長度:對於廣播報文,長度域包含6個比特,有效值範圍是6~37。對於數據報文,長度域包含5個比特,有效值範圍是0~31。長度域之後是淨荷,其長度是長度域指出的字節數。這裏要注意的是,如果報文被加密,則需要包含4字節的消息完整性檢查域,實際的淨荷數據將被減少到最多27個字節。爲了使得鏈路層設計得到簡化,未加密報文的淨荷也不允許超過27個字節的限制。

淨荷:淨荷是所傳輸的“真實”數據,可以是關於設備的廣播數據,或者發給一定區域內所有設備的服務數據;可以是主動掃描響應的附加數據,如設備名稱,實現的服務;可以是建立或保持連接所需要的信息,可以是從一個設備到另一個設備的應用層數據。

循環冗餘校驗:報文的最後3個字節的CRC,CRC對報頭、長度域、以及淨荷域進行計算。

 

鏈路層的信道

低功耗藍牙共有3個廣播信道和37個數據信道,3個信道分散在不同的頻段,可避免同時受到干擾

跳頻:跳頻算法用於數據連接中,數據信道有37個,跳頻算法的公式如下(hop是一個5~16範圍內的值):

下圖給出的是hop值爲13的情況:

 

設備發現

共有四種不同類型的廣播:通用的、定向的、不可連接的、以及可發現的。設備每次廣播時,會在3個廣播信道發送相同的報文。這些報文被稱爲一次廣播事件。

除定向報文外,其它廣播事件均可以選擇20ms~10.28s不等的間隔。廣播事件之間的時間被稱爲廣播間隔。主機可以控制該間隔。

但設備週期性的發送廣播會有一個問題:多個設備可能在很長一段時間內同時廣播而造成干擾。爲了防止這一情況,除定向廣播之外的其他廣播事件,會在上一次事件發生後加入0~10ms的隨機延時。

  • 通用廣播

通用廣播是用途最廣的廣播方式

  • 定向廣播

有時,設備間需要快速建立連接,定向廣播事件就是爲了儘可能快的建立連接。這種報文包含兩個地址:廣播者的地址和發起者的地址。發起設備收到發給自己的定向廣播報文後,可以立即發送連接請求作爲迴應。定向廣播也有特殊的時序要求。完整的廣播事件必須3.75ms重複一次。如此快的發送會讓報文充斥着廣播信道,所以定向廣播不可以持續1.28以上的時間。如果主機沒有主動要求停止,或者連接沒有建立,控制器都會自動停止廣播。

  • 不可連接廣播

不想被連接的設備使用不可連接廣播事件。這種廣播的典型應用包括設備只想廣播數據,而不想被掃描或者連接。這也是唯一可用於只有發射機而沒有接收機設備的廣播類型。

  • 可發現廣播

這種廣播不能用於發起連接,但允許其他設備掃描該廣播設備

下面爲通用廣播數據報文內容:

 

通用廣播數據報文,頭部數據內容:

 

通用廣播數據報文,廣播數據內容:

廣播數據域格式爲:長度域(1字節):類型(1字節):數據。

長度域的值爲類型和數據的長度和。

廣播數據的接收無法被確認,必須認爲廣播是一種不可靠的操作。

 

建立連接

兩個設備建立連接的過程如下:

發起連接請求設備處於發起態(廣播報文),下面爲發起連接請求的報文:

如上所示,連接請求包含了連接開始時需要的所有信息,包括:

連接時使用的接入地址:連接使用的接入地址總是由主設備來提供的,地址通過隨機生成(需要遵循一些規則)。接入地址主從設備共同使用,如果一個主設備對應多個從設備,則主設備會爲每次從設備選擇不同的隨機地址。

CRC初始值:CRC初始值是另一個由主設備提供的隨機數。隨機數的意義在於,即使接入地址相同的概率很低,萬一相同則可以比較CRC。

發送窗口大小

在這個時間段內,接收器持續監聽,窗口大小小於連接間隔。

發送窗口偏移

發送連接請求多久後,主設備會發起第一個連接事件。

連接間隔

如上,連接間隔爲24(30ms)

從設備延遲

如上,設備延遲爲4,可以忽略4個連接事件

監控超時

如上,監控超時爲720ms

自適應跳頻信道圖

自適應跳頻信道圖是數據通道的位掩碼,用來標記信道的好壞。由於共有37個數據信道,信道圖的長度於是設爲37位。如果某一位被設置爲1,表明該信道良好。0表示信道很糟,不適合用於通訊。

跳頻算法增量

跳頻算法的跳數值是在5~16之間的隨機數

休眠時鐘精度

時鐘精度可以幫助從設備消除連接事件的不確定性

一旦收到或發出連接請求報文,設備既建立了連接,數據交換隨即開始,如建立連接過程所示,建立連接後第一個數據報文有主設備發出(對於從設備,只有在正確接收主設備的報文後才能發送)。

 

連接事件

一個連接事件是指主設備和從設備之間相互發送數據包的過程,可能有多次數據交互,每次數據包發送需要間隔150us。

當主設備發送連接請求後,有哪些情況可能發生:

發送完連接請求後,主設備就認爲自己已經建立了連接,緊接着是"發送窗口偏移",從設備收到連接請求的話可在此時啓動接收器,在發送窗口時間內,主設備需要發起一個連接事件(數據包),否則從設備將進入超時處理(停止偵聽,並會在一個連接間隔後再次嘗試)

如果一切正常,連接事件的進行將始終位於一個頻率,這個頻率由連接間隔來決定,連接間隔的意思就是說,主設備多久會發起下一次連接事件。連接間隔必須是1.25ms的整數倍。連接事件定期發生,但從設備可以不每個連接事件都響應,已達到省電的目的,這裏引入了設備延遲這個參數,設備延遲表示從設備在必須偵聽之前可以忽略多少個連接事件。監控超時是指總的超時時間不能超過這個值。

一般建議至少給從設備留出6次偵聽的機會。上面連接間隔爲4,從設備必須偵聽第五個連接事件。換個說法是從設備至少需要在120ms內偵聽一次,所以監控超時最少需要比120ms多一點,上面的超時時間爲720,這樣一來,鏈路在最終斷開前從設備至少會有6次偵聽機會。

 

發送數據

第一次連接事件,主設備發給從設備的數據報文如下:

數據報文的淨荷可以爲0~31字節不等,無論加密層加密與否,傳給控制器的數據包最多隻能攜帶27個字節數據。

數據報文的頭部如上所示。

邏輯鏈路標示符(LLID):用於判斷數據報文屬於下列哪種類型

11    鏈路層控制報文,用於管理連接,鏈路層之間的報文不會上傳到主機,用於鏈路層與鏈路層之間的管理。

主機能夠發送大於27字節的數據,但由於無法放入單個鏈路層的數據包,因此必須支持分段。具體的做法是把數據貼上“高層報文開始”,“高層報文延續”的標籤。下圖給出了一個例子,三個數據報文屬於同一連接事件。

10    高層報文開始,也可以用於一個完整報文(提醒一下:上面報文LLID是......01,是大端格式)

01    高層報文延續

序列號(SN)、下一個預期的序列號(NESN)

建立連接後,第一個數據包的序列號爲0,每一次發送新的數據包時,其序號與上個數據包的序列號不同。這使得接收裝置能否判斷接收的數據包的性質:如果序列號與之前一樣,則爲重傳報文,如果序列號與之前的不同,則爲新報文。

如果從設備成功接收序列號爲0的報文,在其確認報文中,應將下一個預期序列號設爲1,否則序列號爲0的數據包將被重傳。下一個預期的序列號由從設備設置。

更多數據位

用來通知對端設備自己還有其他的數據準備發送。如果收到設置了更多數據位的數據包,應該在當前連接事件中繼續與對端設備通訊。一旦不再有數據發送,連接事件會迅速關閉。

下圖,講述了關於序列號、下一個預期序列號和更多數據位的例子。下面有兩個連接事件。

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