文章轉載自:http://www.sunyouqun.com/2017/04/page/2/
邏輯鏈路控制與適配協議通常簡稱為L2CAP(Logical Link Control and Adaptation Protocol),它向上連接應用層,向下連接控制器層,發揮主機與控制器之間的適配器的作用,使上層應用操作無需關心控制器的數據處理細節。
經典藍牙的L2CAP層比較復雜,它實現了協議復用、數據分段與重組、封裝調度等操作,使得主機能夠支持LE和BR/EDR不同的控制器,實現音頻數據流傳輸等高級功能。
BLE的L2CAP層是經典藍牙L2CAP層的簡化版本,它在基礎模式下,不執行分段和重組,不涉及流程控制和重傳機制,僅使用固定信道進行通信,在LE令牌流程控制模式下,實現了流程控制,執行數據分段和重組,使用動態信道進行通信。
1. 功能
完整的L2CAP層的功能模塊分解圖如下所示:

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信息,取最小值作為有效值進行工作。
下圖為經典藍牙的分段和分解過程示意圖:

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協議頭,后面的信息載荷包字段含應用層發送的數據。
協議頭中的長度信息,表示信息載荷的有效長度,它的取值范圍為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格式如下:

相比於基礎模式,該模式增加了一個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令牌流程控制模式下的分段與重組與上文介紹的經典藍牙分段重組操作類似,如下圖所示(參考):

建立連接時交換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。
信令包的格式如下:

編碼(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/
(完)
