空中包格式
BLE鏈路層的空中包格式非常簡單,它所有的空中包都遵循下圖所示的格式:
有上圖可見,BLE空中包由4個部分組成,他們分別是:
- 前導碼(Preamble)
- 訪問地址(Access Address)
- 協議資料單元(Protocol Data Unit)
- CRC
前導碼佔1個位元組,訪問地址佔4個位元組,PDU佔2到257個位元組,CRC佔3個位元組,一個完整的空中包大小為10個位元組到265個位元組之間
LSB(The Least Significant)表示最低有效位;MSB(The Most Significant)表示最高有效位。最低有效位最先被鏈路層發往空中,最高有效位最後傳送。也就是說前導碼最先被髮送出去,其次是訪問地址,再次是PDU,最後才是CRC
前導碼(Preamble)
前導碼佔8個位元,所有廣播通道中,空中包的前導碼都是10101010b;資料通道中,空中包的前導碼是10101010b或者是01010101
如果從電平的角度來說,前導碼其實是一個高低變化矩形波,接收者可以將接收電路的頻率同步到該矩形波的頻率,這就是所謂的接收端頻率同步的機制。通俗點講就是,接收者可以藉此預估出一個位元的起始位置以及一個位元的寬度,從而可以準確的接收後續每一個有效位元位。
同時,前導碼標記著一個有效空中包的起始位置,避免空中無效資料的干擾。
訪問地址(Access Address)
廣播通道和資料通道中的訪問地址是不同的。廣播通道的訪問地址固定為0x8E89BED6;資料通道的訪問地址由發起者決定。因此簡單理解就是,從訪問地址首先可以區分,這個空中包是一個廣播包還是一個連線態的資料包。
上文講到了資料通道的前導碼是10101010b或者是01010101b,其實這取決於資料通道中的訪問地址的最低有效位是0還是1,如果是1,則前導碼是01010101b,否則是10101010b
當發起者向廣播者發起一個連線請求的時候,它會把訪問地址的值放入連線請求的相應欄位中,當鏈路層連線成功建立之後,雙方進入到連線態,以後的空中包雙方都使用這個訪問地址進行通訊。
由此可見,訪問地址也是跟一個具體的鏈路層連線相互繫結的。例如,一個裝置跟多個裝置都建立了鏈路層的連線,也就是說一個裝置同時維護多個連結,當這個裝置收到一個空中包的時候,它只需通過訪問地址就可以知道該空中包是哪個連線的包了。
協議資料單元(Protocol Data Unit)
協議資料單元是空中包的有效載荷部分,不同型別的空中包,它的PDU都不相同,大致可分為廣播通道的PDU和資料通道的PDU
BLE採用跳頻機制,鏈路層一共有40個通道,其中3個通道是廣播通道,另外37個通道是資料通道
當裝置處於廣播態或者發起態的時候,裝置傳送或者接收廣播通道的PDU;當裝置與另一個裝置建立鏈路層連線之後,雙方進入到連線態,他們傳送或者接收資料通道的PDU
廣播通道PDU
廣播通道PDU的結構由兩部分組成,分別是Header和Payload,如下圖所示:
由上圖可知,Header大小為16bits,也就是2個位元組,Payload的長度由Header中的Length欄位決定,那麼先看下Header欄位的組成,如下圖所示:
Header欄位由以下6個部分組成:
- PDU型別:廣播包的型別
- RFU(Reserve For Future):保留未來使用
- TxAdd:傳送者的地址型別
- RxAdd:接收者地址型別
- Length:Payload部分的長度
- RFU(Reserve For Future):保留未來使用
廣播包的型別如下表所示:
PDU Type | Packet Name |
---|---|
0000 | 可連線非定向廣播 (ADV_IND) |
0001 | 可連線定向廣播 (ADV_DIRECT_IND) |
0010 | 不可連線廣播 (ADV_NONCONN_IND) |
0011 | 掃描請求 (SCAN_REQ) |
0100 | 掃描響應 (SCAN_RSP) |
0101 | 連線請求 (CONNECT_REQ) |
0110 | 可掃描指示 (ADV_SCAN_IND) |
0111-1111 | 保留 (Reserved) |
這裡不展開介紹各個包的型別了,以後的博文中會有詳細介紹
資料通道PDU
資料通道PDU包含16位元的頭部和一個⻓度可變的payload,以及可能還包含一個
MIC(Message Itegrity Check:訊息完整性檢查),資料通道PDU格式如下圖所示:
其中Header的結構如下圖所示:
Header包括6個部分:
LLID:
2個位元組,表示這個包是LL Data PDU(鏈路層資料包)還是LL Control PDU(鏈路層控制包),它可能的取值如下:
- 00b:保留
- 01b:LL Data PDU(鏈路層資料包)或者是一個Empty PDU(空包)。如果是鏈路層資料包,由於一個過長的L2CAP包會被分片成多個包分別傳送,這個包就是被分片之後的非第一個分片包
- 10b:LL Data PDU(鏈路層資料包),它表示未被分片的完整的資料包,或者是分片之後的第一個分片包。
- 11b:是LL Control PDU(鏈路層控制包)
NESN:
下一個包的序列號
SN:
空中包的序列號
MD:
More Data的意思,由於BLE是低功耗藍芽,本質上採用的是睡眠喚醒機制,處於喚醒狀態時傳送和接收空中包,如果MD欄位設定為1,則表示傳送者後續還有更多的空中包要傳送,以此通知接收者不要進入睡眠狀態,要持續保持資料傳輸;如果該欄位設定為0,則表示傳送者沒有更多的資料要傳送了,可以進入睡眠狀態了。
CRC
CRC是關於PDU部分資料完整性校驗