空中包格式
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部分數據完整性校驗