1. 程式人生 > >認識BLE 5協議棧 —— 邏輯鏈路控制與適配協議層(L2CAP,Logical Link Control and Adaptation Protocol)

認識BLE 5協議棧 —— 邏輯鏈路控制與適配協議層(L2CAP,Logical Link Control and Adaptation Protocol)

轉自 http://www.sunyouqun.com/2017/04/understand-ble-5-stack-l2cap-layer/


邏輯鏈路控制與適配協議通常簡稱為L2CAP(Logical Link Control and Adaptation Protocol),它向上連線應用層,向下連線控制器層,發揮主機與控制器之間的介面卡的作用,使上層應用操作無需關心控制器的資料處理細節。

經典藍芽的L2CAP層比較複雜,它實現了協議複用、資料分段與重組、封裝排程等操作,使得主機能夠支援LE和BR/EDR不同的控制器,實現音訊資料流傳輸等高階功能。

BLE的L2CAP層是經典藍芽L2CAP層的簡化版本,它在基礎模式下,不執行分段和重組,不涉及流程控制和重傳機制,僅使用固定通道進行通訊,在LE令牌流程控制模式下,實現了流程控制,執行資料分段和重組,使用動態通道進行通訊。

1. 功能

完整的L2CAP層的功能模組分解圖如下所示:

L2CAP_Feature_Block

L2CAP層包括兩個功能模組:資源管理器和通道管理器。

L2CAP層向下連線控制器的HCI介面,向上對應用層暴露資料收發介面。

應用層傳送給L2CAP層的資料稱為SDU(Service Data Unit),SDU可能是屬性協議層的讀寫資料,也可能是連結配置命令,也可能是配對繫結資料。

SDU在資源管理器中新增L2CAP協議頭資訊,封裝成L2CAP資料包,簡稱PDU(Protocol Data Unit)。PDU的Payload欄位就包含了SDU或SDU的一部分。

通常HCI介面無法傳送較長資料包,需要對PDU進行分解(Fragmentation),變成資料碎片(Fragment)再依次傳送到控制器。PDU總是包含完整的L2CAP協議頭,而資料碎片則不是完整的L2CAP資料包。

如果資源管理器中採用了流程控制或重傳機制,則可以實現傳輸很長的資料包,理論上長度最大可以達到65535個位元組。一個很長的SDU,需要先進行分段(Segmentation),分成一個個短小的資料片段,然後再分別新增協議頭封裝成對應的PDU。

L2CAP協議給出兩個資料包長度引數以指導分段和分解操作:MTU和MPS。

MTU(Maximum Transmission Unit)表示L2CAP層的最大可傳輸單元,該引數限制了應用層與L2CAP層之間傳輸資料的最大長度,即最大的SDU長度。經典藍芽預設MTU值為672位元組,BLE預設MTU值為23位元組,意味著BLE的應用層傳送給L2CAP層的資料包長度最大為23位元組,超過該長度的資料包將會觸發錯誤處理機制。

MPS(Maximum PDU payload Size)表示L2CAP層PDU的Payload最大長度,該引數限制了單個PDU的長度。分段操作時,每個段的最大長度等於MPS。

顯然,L2CAP層中MPS值小於等於MTU值。兩個裝置建立連線時,會交換MTU和MPS資訊,取最小值作為有效值進行工作。

下圖為經典藍芽的分段和分解過程示意圖:

L2CAP_Segmentation_and_Fragmentation_Procedure

SDU進入L2CAP層,先進行分段操作,對各PDU再執行分解操作變成資料片段傳入HCI層。注意到,分解操作實際上是在HCI層執行。

通道管理器負責將不同協議的資料分派到合適的通道中。

2. 通道ID

通道ID(Channel ID)簡稱CID,用一個2位元組數表示L2CAP層的一個邏輯通道。

邏輯通道與真實通道不同,真實通道是指無線通訊的頻道,不同通道的頻率不同,邏輯通道是指某個協議所佔用的通道,不同協議使用不同的通道,它與射頻頻率無關,所以稱為邏輯通道。不同的邏輯通道在控制器中可能使用相同的物理通道。

在不產生混淆的情況下,這裡將L2CAP層的邏輯通道簡稱為通道。

L2CAP層擁有兩種通道,固定通道和動態通道。兩端裝置一旦建立連線,固定通道即可使用而無需額外配置,建立動態通道則需要首先執行配置過程。BLE僅在收發資料時候與對端裝置連線,適合使用固定通道。

0x0001-0x003F部分是固定通道,0x0040之後通道是動態通道。

BLE所使用的通道如下:

CID 描述 通道型別
0x0004 屬性協議通道 固定通道
0x0005 LE信令通道 固定通道
0x0006 安全管理協議通道 固定通道
0x0020-0x003E 官方編號(Assigned Number)通道 固定通道
0x0040-0x007F 基於令牌連線機制的通訊通道 動態通道

0x0004屬性協議通道用於收發屬性協議層的資料,也就是BLE應用層通訊所傳輸的資料。

0x0005信令(Signaling Command)通道用於處理應用層傳送的命令。

0x0006安全管理協議通道用於處理加密、配對和繫結等相關資料。

0x0020-0x003E官方編碼通道沒有明確指明如何使用。官方編碼是指包括UUID、BD_ADDR、Comany_ID等一些列已經授權過的數字串。

0x0040-0x007F令牌連線的通訊通道是動態通道,它專用於LE令牌流程控制工作模式。

注意到,廣播資料不適用於任何一個L2CAP通道,事實上廣播資料將從應用層直接傳送到HCI介面。

3. 工作模式

L2CAP層有多種工作模式:

工作模式 適用範圍
基礎L2CAP模式 Classic, LE
流程控制模式 Classic
重傳模式 Classic
增強型重傳模式 Classic
資料流模式 Classic
LE令牌流程控制模式 LE

基礎模式為預設工作模式,L2CAP層不執行流程控制,對資料不執行分段和重組操作,其他五種模式均使用了流程控制或重傳機制,需要執行分段和重組操作。在L2CAP層配置階段,會設定引數是否使用流程控制和重傳機制,如果不使用則使用基礎模式,否則按引數配置情況使用其他模式。

不同的工作模式,其資料幀格式略有不同。

3.1 基礎模式

L2CAP層基礎模式分為面向連線和麵向無連線兩類子模式,其中面向無連線僅應用於經典藍芽的一對多通訊場景。

面向連線的基礎模式的資料幀稱為B-Frame(Basic Frame),其PDU格式如下:

L2CAP_Data_Frame

其中前四個位元組表示基礎L2CAP協議頭,後面的資訊載荷包欄位含應用層傳送的資料。

協議頭中的長度資訊,表示資訊載荷的有效長度,它的取值範圍為0-65535位元組,即資訊載荷理論最大長度為65535個位元組。

而實際上資訊載荷的長度受限於MTU值,當MTU=23,載荷最大長度為23位元組,此時PDU總長度為23 + 4 = 27位元組。

L2CAP工作在基礎模式時,僅使用固定通道進行通訊,不對SDU進行分段和重組,應用層傳輸的資料長度被MTU嚴格限制,此時MPS等於MTU。

3.2 LE令牌流程控制模式

LE令牌流程控制模式實現了流程控制,以一個令牌引數作為流程控制依據。

LE令牌流程控制模式下的資料幀稱為LE-Frame(LE Information Frame),其PDU格式如下:

L2CAP_LE_Credit_Data_Frame

相比於基礎模式,該模式增加了一個2位元組的L2CAP SDU Length欄位。該欄位記錄了SDU的總長度,在分段過程中,第一個LE-Frame將包含該欄位,在後續LE-Frame中不包含該欄位。

LE-Frame的載荷長度不能超過MPS值,且MPS值小於等於MTU值。

L2CAP工作在LE令牌流程控制模式時,將使用動態通道,主機使用LE Credit Based Connection Request信令作為連線請求,該信令中包含了一個令牌初值,從機返回LE Credit Based Connection Response信令。

建立連線以後,兩端裝置每傳送一個LE-Frame,令牌值都將被減1。這意味著令牌初值代表該連線能夠傳送的LE-Frame總數,比如令牌Credit=100,意味著兩端裝置最多隻能傳送100個數據幀,超過後將斷開連線。

為了傳送更多資料幀,裝置需要傳送LE Flow Control Credit信令以申請一個新的令牌值,新的令牌值包含在該信令引數中。

令牌值的有效範圍是0-65535。

LE令牌流程控制模式下的分段與重組與上文介紹的經典藍芽分段重組操作類似,如下圖所示(參考):

L2CAP_Segmentation

建立連線時交換MTU和MPS值,獲得有效值MTU=300和MPS=50,此時應用層最大資料包長度必須小於300,假如主機發送210位元組資料包,將在L2CAP層被分成5個PDU,第一個PDU中包含L2CAP SDU Length,Payload長度為48,第二至第四個PDU中不包含L2CAP SDU Length,Payload長度為50,第五個PDU中不包含L2CAP SDU Length,Payload長度為12。

4. 信令

信令(Signaling Command)指L2CAP層執行的訊號命令。

信令包也屬於L2CAP資料包,信令內容含於資料包的資訊載荷中,不同的信令將驅動L2CAP執行特定的任務。傳輸信令包使用信令通道,所以協議頭的CID等於0x0005。

信令包的格式如下:

L2CAP_Signaling_Command_Format

編碼(Code)欄位用於區分不同的信令。

識別碼(Identifier)欄位用於兩端裝置收發資料時識別對應的請求與響應,一個請求對應的響應資料應該具有相同的識別啊,不同的請求對應不同的識別碼。

BLE裝置共支援8個信令,如下:

Code 信令 描述
0x01 Command reject 拒絕一個無效的L2CAP命令,引數中包含了拒絕的原因
0x06 Disconnection request 斷開連線請求
0x07 Disconnection response 斷開連線響應
0x12 Connection Parameter Update request 更新連線引數請求
0x13 Connection Parameter Update response 更新連線引數響應
0x14 LE Credit Based Connection request LE令牌連線請求,引數中包含了MTU, MPS和PSM(Protocol Service Multiplexer) 引數,其中PSM用於分配動態通道。
0x15 LE Credit Based Connection response LE令牌連線響應
0x16 LE Flow Control Credit 申請新的流程控制令牌

5. 參考

關於LE令牌流程控制模式,參考了以下文章:

http://blog.csdn.net/wendell_gong/article/details/54956499

https://community.nxp.com/thread/366041

https://devzone.nordicsemi.com/question/60552/l2cap-oriented-connection/