天天看點

詳解BLE 空中包格式—兼BLE Link layer協定解析

BLE有幾種空中包格式?常見的PDU指令有哪些?PDU和MTU的差別是什麼?DLE又是什麼?BLE怎麼實作重傳的?BLE ACK機制原理是什麼?希望這篇文章能幫你回答以上問題。

雖然BLE空中包(packet)涉及BLE協定棧link layer,L2CAP,SMP和ATT等各層次,但link layer跟空中包格式關系最緊密,掌握了BLE packet的格式,就很容易了解BLE link layer協定的工作原理,是以文章取名“詳解BLE空中包格式—兼BLE link layer協定解析”

BLE Packet格式

BLE鍊路層(link layer)隻定義了一種packet(空中包)格式,如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

而且PDU(protocol data unit,協定資料單元)前兩個位元組固定為LL header(1個位元組長)和payload length(1個位元組長,又稱data length),即上面的Packet可以展開為:

詳解BLE 空中包格式—兼BLE Link layer協定解析

preamble(前導幀)為1個位元組,根據Access Address第一個Bit,有兩種取值情況:0x55或者0xAA(純PHY層行為),如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Access Address用來标示接收者ID或者空中包身份,如前所示,BLE隻有一種packet格式,根據Access Address的不同,又區分兩種Packet類型:廣播包和資料包:

  • 廣播包Access Address 固定為0x8E89BED6,廣播包隻能在廣播信道(channel)上傳輸,即隻能在37/38/39信道上傳輸。廣播包發送給附近所有的observer(掃描者)。
  • 資料包Access Address為一個32bit的随機值,由Initiator生成。資料包,其實是資料信道上的空中包的簡稱,資料包隻在資料信道上傳輸,即除37/38/39之外的其餘37信道(BLE總共占用40個信道)。每建立一次連接配接,重新生成一次Access address。資料包是給連接配接通信使用的,即用于master和slave之間通信的。

CRC為24bit,初始向量為:

詳解BLE 空中包格式—兼BLE Link layer協定解析

藍牙廣播包

藍牙廣播包,全名藍牙廣播通道(channel)空中包,即在藍牙廣播通道(37/38/39信道(channel))上傳輸的空中包,為兩種空中包的一種,其具體格式如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Advertising Header即前述的LL header,長度為一個位元組,其每bit定義如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • PDU Type為3bit,具體定義如下。可以看出掃描PDU和發起連接配接PDU都屬于廣播包。
詳解BLE 空中包格式—兼BLE Link layer協定解析

       注:CONNECT_REQ也可寫作CONNECT_IND

  • TxAdd/RxAdd,各占1bit,表示随後的Device Address字段代表的藍牙MAC位址類型,值0代表Public位址,值1代表Random位址。

Payload length定義如下所示,是以廣播包PDU最長37個位元組。

詳解BLE 空中包格式—兼BLE Link layer協定解析

Device Address,廣播包中的強制字段,俗稱藍牙MAC位址,如果是廣播包,則是advertiser的MAC位址;如果是scan包或者連接配接請求包,則是scanner的MAC位址。藍牙device address為6個位元組,這樣Advertising data最長為:37-6 = 31B,這就是廣播包資料最長隻能31個位元組的由來。如前所述,device address分public和random兩種,定義如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Random device address又有三種類型,定義如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Advertising data我會另寫一篇文章來詳述,這裡就不再介紹了。

如下為一個完整的真實的廣播包示例,注意:BLE空中包采用小端模式。

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2
    • AA – 前導幀(preamble)
    • D6BE898E – 通路位址(access address)
    • 60 – LL幀頭字段(LL header)
    • 0E – 有效資料包長度(payload length)
    • 3B75AB2A02E1 – 廣播者裝置位址(advertiser address)
    • 02010504FF590053 – 廣播資料
    • 8EC7B2 – CRC24值

注:上述廣播包是藍牙4.x格式,藍牙5.0廣播包除了包含上述格式外(記住:藍牙5是跟藍牙4.x相容的!),還有一些新的定義,以後我也會寫一篇關于藍牙5廣播的文章來專門闡述藍牙5擴充廣播包。

藍牙資料通道空中包(資料包)

與藍牙廣播包相對應,藍牙資料包是另一種BLE packet。藍牙資料包是藍牙資料信道空中包的簡稱,表示空中包隻在藍牙資料信道上傳輸,即除37/38/39之外的其他37信道。從格式上來說,藍牙資料包分空包(empty packet)和普通資料包(data packet)兩種,空包格式如下。

詳解BLE 空中包格式—兼BLE Link layer協定解析

由圖可見,空包整個payload為空,故名空包。                      

普通資料包格式如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Data header,即前述的LL header,在資料包中的定義如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • LLID(2bits), link layer ID,對LL PDU進行分類:LL data PDU和LL control PDU。也就是說,普通的資料信道空中包包含LL資料包和LL控制包兩種,具體定義如下所示。請大家注意厘清data channel packet(資料信道空中包)和LL data packet(LL資料包)的差別,如前所示data channel packet包含LL data packet和LL control packet,LL data packet隻是data channel packet的一種。在不引起上下文歧義的時候,我們把他們統一稱作“資料包”。
詳解BLE 空中包格式—兼BLE Link layer協定解析

Link layer支援如下control PDU:

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • NESN/SN,NESN和SN各占1bit。SN全稱為sequence number,表示目前發送的packet編号。NESN,next expected sequence number,用來告知對方下一個期待的packet的編号。Link layer使用SN來告知對方這個packet是新資料包還是重傳包,用NESN來告訴對方你之前發我的包已經收到了(相當于ACK的作用),我現在期待下一個新的資料包了,是以BLE沒有專門的ACK包,它是通過NESN/SN來實作ACK和重傳雙重功能的。請參考如下表格,仔細揣摩NESN和SN是如何編碼的,以同時完成ACK和重傳功能。
空中包編号 傳輸方向 NESN SN NESNꞌ SNꞌ
#1 M -> S 1
#2 S -> M 1 1
#3 M -> S 1 1
#4 S -> M 1 1

我們來分析#3資料包,#3是master發給slave的,那麼#3的NESN和SN是如何确定的呢?其實#3的NESN和SN是通過比較#1和#2的NESN/SN的值來确定的,Master把#1傳完之後,會把#1包的NESN和SN記錄下來,即表格右邊的NESNꞌ和SNꞌ。然後Master會拿SNꞌ跟#2的NESN相比,兩者不等,說明slave已經收到了#1包,并期待master發一個新的包給它,此時Master會把SNꞌ增1,形成#3包的SN,表示這個資料包是一個新包,然後發出去;兩者相等,說明slave沒有收到#1包,此時master需要重傳。Master還會拿NESNꞌ跟#2的SN相比,兩者相等,說明#2包為新包,然後Master會把NESNꞌ增1,形成#3包的NESN發出去,告訴slave我已經收到#2包了并期待你的下一個包;兩者不等,說明#2包為重傳包。注意:大家可以從上述表格發現一個規律,就是同一方向相鄰的兩個資料包,他們的NESN和SN與另一個包的NESN和SN是相反的,比如#3 NESN = #1 #NESN ,#3 SN = #1 #SN ,同樣#2和#4 各自的NESN和SN是互相相反的。

我們可以用下面的流程圖來描述上述過程。

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • MD(1bit),more data,用來訓示對方我還有資料包要傳,請繼續打開射頻視窗準備接收。比如Nordic nRF51822一個connection interval可以發6個包或者更多的包(也就是說,一個connection event包含多個資料包互動),用的就是MD來實作的。以notify指令為例,裝置(Server)notify第一個資料包并将MD置1,Client(比如手機)收到這個notify指令後,就知道Server還有資料包要傳,此時手機可以繼續發一個空包給裝置,以讓裝置把第二個notify指令發過來,詳情如下所示。注:Master為手機(Client),Slave為裝置(Server)。
詳解BLE 空中包格式—兼BLE Link layer協定解析

Payload Length or Data Length,BT4.0/4.1定義如下所示,這就是藍牙4.0/4.1一個包隻能傳20個位元組的根源。

詳解BLE 空中包格式—兼BLE Link layer協定解析

BT4.2之後,Payload length 8 bits全部用來表示長度,這樣的話,payload size最大可達251位元組(255 – MIC size)。BLE連接配接建立之後,可以動态更改data length長度(預設為27位元組),這個特性叫做Data Length Extension(DLE),DLE是通過Link layer指令:LL_LENGTH_REQ和LL_LENGTH_RSP來實作的。Data length直接跟藍牙晶片的射頻能力有關,像Nordic的nRF51822隻支援BT4.1的Data length,就是因為PHY層已經做死了,無法擴充,但Nordic最新的nRF52832和nRF52840,就都支援DLE,即data length最大可到251位元組。

L2CAP length,2位元組長度,表示後面information payload的長度,information payload最大長度除了受這個L2CAP length字段限制,同時還受MTU的限制。MTU,Maximum Transmission Unit,是ATT層與L2CAP層可以互動的最大資料長度,或者說是Client與Server可以互動的最大長度。

總結一下,藍牙spec裡面定義了2個長度字段:LL data length和L2CAP length,同時ATT層還定義了一個MTU,以限制ATT PDU最大長度。LL data length可以通過LL_LENGTH_REQ和LL_LENGTH_RSP動态改變,MTU size則可以通過後面要講到的Exchange MTU Request和Exchange MTU Response來改變,而L2CAP length無法動态改變,也就是說不能超過65535。

L2CAP CID,2位元組長度,邏輯通道的ID,BLE使用固定的通道編号,也就是說雖然藍牙spec裡面也允許BLE使用connection oriented channel,但大部分BLE協定棧實作的時候都是使用固定的通道編号,通道編号定義如下所示:

詳解BLE 空中包格式—兼BLE Link layer協定解析

BLE L2CAP Signaling Channel支援的PDU指令隻有三個:

  • Command reject
  • Connection parameter update request,更新連接配接參數,比如最小連接配接間隔,最大連接配接間隔,slave latency等
  • Connection parameter update response,接受或者拒絕上面的請求

Security Manager Protocol(SMP)用來實作配對和密鑰分發的,SMP支援如下PDU指令:

詳解BLE 空中包格式—兼BLE Link layer協定解析

Attribute Protocol(ATT),就是我們經常用到的應用層,應用資料就跟在ATT指令後面,ATT支援如下指令清單:

詳解BLE 空中包格式—兼BLE Link layer協定解析

至此BLE空中包解析就告一段落了,再往上就是應用層資料解析了,這個就不是空中包的範疇,而不是GATT和profile要定義的事情,我會另寫文章來專門談談GATT層協定。

如下為一個完整的真實的資料包示例,注意:BLE空中包采用小端模式。

詳解BLE 空中包格式—兼BLE Link layer協定解析
  • AAAB5D65501E08040004001B130053D550F6
    • AA – 前導幀(preamble)
    • 0x50655DAB – 通路位址(access address)
    • 1E – LL幀頭字段(LL header)
    • 08 – 有效資料包長度(payload length)
    • 04000400 – ATT資料長度,以及L2CAP通道編号
    • 1B – notify command
    • 0x0013 – 應用資料handle
    • 0x53 – 真正要發送的應用資料
    • 0xF650D5 – CRC24值

繼續閱讀