1. 程式人生 > >詳解BLE 空中包格式—兼BLE Link layer協議解析

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

廣播包 emp 功能 4.0 ID 5.0 下一個 標示 ini

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(空中包)格式,如下所示:

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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,初始向量為:

技術分享圖片

藍牙廣播包

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

技術分享圖片

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

技術分享圖片

  • PDU Type為3bit,具體定義如下。可以看出掃描PDU和發起連接PDU都屬於廣播包。

技術分享圖片

註:CONNECT_REQ也可寫作CONNECT_IND

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

Payload length定義如下所示,所以廣播包PDU最長37個字節。

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

如下為一個完整的真實的廣播包示例,註意:BLE空中包采用小端模式。技術分享圖片

  • 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)兩種,空包格式如下。

技術分享圖片

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

普通數據包格式如下所示:

技術分享圖片

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

技術分享圖片

  • 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的一種。在不引起上下文歧義的時候,我們把他們統一稱作“數據包”。

技術分享圖片

Link layer支持如下control PDU:

技術分享圖片

  • 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

0

#2

S -> M

1

1

#3

M -> S

0

1

1

0

#4

S -> M

0

0

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是相互相反的。

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

技術分享圖片

  • 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)。

技術分享圖片

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

技術分享圖片

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使用固定的通道編號,定義如下所示:

技術分享圖片

BLE L2CAP Signaling Channel支持的PDU命令只有三個:

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

Security Manager Protocol(SMP用來實現配對和密鑰分發的,SMP支持如下PDU命令:

技術分享圖片

Attribute Protocol(ATT,就是我們經常用到的應用層,應用數據就跟在ATT命令後面,ATT支持如下命令列表:

技術分享圖片

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

技術分享圖片

  • AAAB5D65501E08040004001B130053D550F6
    • AA – 前導幀(preamble)
    • 0x50655DAB – 訪問地址(access address)
    • 1E – LL幀頭字段(LL header)
    • 08 – 有效數據包長度(payload length)
    • 04000400 – ATT數據長度,以及L2CAP通道編號
    • 1B – notify command
    • 0x0013 – 電量數據handle
    • 0x53 – 真正要發送的電量數據
    • 0xF650D5 – CRC24值

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