BLE鏈路層空中包格式

浮生問道發表於2021-04-29

空中包格式

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部分資料完整性校驗

相關文章