目錄
引言
一、L2CAP主要功能
二、L2CAP幀格式及信道概念
2.1 邏輯鏈路是什么?
2.2 邏輯信道的作用
2.3 L2CAP幀格式介紹
三、L2CAP信令信道
3.1 信令信道幀格式說明
3.2?信令信道指令介紹
3.2.1 信令信道指令一覽表
3.2.2 Credit流控規則
引言
在BLE協議棧中,邏輯鏈路控制和適配協議 (Logical Link Control and Adaptation Protocol, L2CAP)作為鏈路層(LL)與上層協議(ATT/GATT/SMP)之間的適配層,承擔著協議復用、數據分段和流控的核心職責。通過邏輯信道機制,L2CAP實現了多協議并行傳輸的能力,同時通過信令信道(CID 0x0005)動態管理連接參數與資源分配。本文將系統解析L2CAP幀格式、邏輯信道劃分規則,為BLE設備開發提供協議層實現參考。
一、L2CAP主要功能
BLE 的 L2CAP(Logical Link Control and Adaptation Protocol)在數據信道上主要承擔三個功能:
1)信道管理
- 負責邏輯信道的創建與關閉。
2)連接參數設置
- 用于更新連接參數。
3)多包傳輸控制
- 配合LL層分包機制實現對發送方的流控機制
注意:
LL層負責物理數據包(PDU)的分片與重組(基礎分包),而L2CAP在Credit-Based模式下則負責管理邏輯信道上的L2CAP SDU傳輸流控。
二、L2CAP幀格式及信道概念
2.1 邏輯鏈路是什么?
在介紹L2CAP幀格式之前我們先回顧下必要的背景知識。在前面的章節我們已知在藍牙協議中,BR / EDR / LE 表示不同的物理規范,BR/EDR用于經典藍牙,LE用于低功耗藍牙:
- BR(Basic Rate):經典藍牙基礎速率
- EDR(Enhanced Data Rate):經典藍牙高速率增強
- LE(Low Energy):低功耗藍牙
而 ACL-U、APB-U、LE-U 是對應物理層的邏輯鏈路(Logical Transport),用于承載上層協議的數據:
- ACL-U:BR/EDR 下的異步數據通道
- APB-U:EDR 下的增強異步數據通道
- LE-U:BLE 下的數據通道,主要承載L2CAP協議數據。L2CAP通過其邏輯信道(CID)向上層協議(如ATT/GATT、SMP)提供服務,或支持用戶自定義協議。
換句話說,ACL-U / APB-U / LE-U 是 物理鏈路到邏輯數據傳輸的橋梁。本系列文章只關注BLE,即我們只需要關注LE-U邏輯鏈路相關的內容,因為 BLE 的所有數據上行/下行都通過LE-U邏輯鏈路承載,它承載著多個邏輯信道(Logical Channels, 由CID標識)。
2.2 邏輯信道的作用
BLE的分包是由LL層實現的,但是LL層并沒有顯式說明當前傳輸的分包來源,即接收方無法確認此分包是來自于GATT還是SMP,在此基礎上為了實現虛擬邏輯信道以實現通道劃分,L2CAP定義了若干個邏輯信道,每個邏輯鏈路可包含若干個邏輯信道。
2.3 L2CAP幀格式介紹
在介紹L2CAP幀格式之前,我們先來回顧下在第三篇學過了LL層數據信道報文格式(點此回顧【BLE系列-第二篇】數據鏈路層(LL):基于1M PHY模式的報文詳解):
L2CAP作為LL層與上層的承接者,其負責的字段由以下幾個部分組成:
- L2CAP PDU len:標識Info段的長度,最大長度為65535(包長大于247則使用LL層進行多包傳輸)
- L2CAP Channel ID(CID):邏輯信道 ID,用于標識邏輯信道
- Info:L2CAP信息內容
其中 CID 用于標識邏輯信道,LE-U 邏輯鏈路包含了若干個協議規定(固定CID)以及用戶自定義的邏輯信道,如下圖(此圖來自官方協議文檔):
由圖可知,BLE可使用的邏輯信道包含以下部分:
CID | 說明 |
---|---|
0x0004 | GATT專用信道,L2CAP不做處理,只進行轉發 |
0x0005 | L2CAP信令信道 |
0x0006 | SMP專用信道,L2CAP不做處理,只進行轉發 |
0x0020~0x003E | 僅限藍牙SIG內部測試使用,不可用于公開產品或商用 |
0x0040~0x007E | 用戶自定義信道,使用L2CAP相關指令可以進行創建 |
其中CID 0x0004和CID 0x0005僅用于給上冊模塊提供透傳接口,因此不再贅述。下文我們重點講解下CID 0x0005 L2CAP信令信道。
三、L2CAP信令信道
3.1 信令信道幀格式說明
首先我們再來看一眼LL的幀格式:
對照上圖講解,信令信道其實就是在將 Info(至多247字節)?字段拆分成了以下兩個部分:
- Code:1字節字段,用來標識不同的指令
- Info:至多246字節字節,不同的Code對應的Info格式不一致,具體以協議規定為準。
注意:
L2CAP Channel ID在信令指令中固定為0x0005。
3.2?信令信道指令介紹
3.2.1 信令信道指令一覽表
由圖可知BLE能使用的Code指令只有:0x01、0x06、0x07、0x12至0x1A。
可以分為以下幾個類別:
1)錯誤與通用控制類
- ?0x01 Command Reject
2)信道建立與管理類
- 0x06 LE Credit Based Connection Request
- 0x07 LE Credit Based Connection Response
- 0x14 Disconnection Request
- 0x15 Disconnection Response
3)連接參數與更新類
- 0x12 Connection Parameter Update Request
- 0x13 Connection Parameter Update Response
4)流控與數據管理類
- 0x16 LE Flow Control Credit
5)其他功能性控制類
- 0x17 Credit Based Connection Request(BR/EDR 共用型,LE 可能保留)
- 0x18 Credit Based Connection Response
- 0x19 Local Busy Detected
- 0x1A Local Busy Cleared
由于Code的定義針對每個BLE協議版本都不完全一致,還請自行參考協議。以下根據Ver 6.0版本給出參考路徑及協議參考章節:
- 下載鏈接:?藍牙 Core_v6.0
- 參考章節:Vol 3: Host > Part A:?CreditsLOGICAL LINK CONTROL AND ADAPTATION PROTOCOL SPECIFICATION >?4 SIGNALING PACKET FORMATS
3.2.2 Credit流控規則
1)發送方每發1個L2CAP報文Credit值減1
2)接收方可以通過0x16指令刷新Credit值
3)Credit值為0時,發送方必須暫停傳輸,等待Credits重新刷新
注意:
LE Credit Based Flow Control 機制僅適用于通過LE Credit Based Connection建立的用戶自定義邏輯信道(CID 0x0040~0x007E)。固定信道(0x0004, 0x0005, 0x0006)不使用此流控機制。
因為靜態信道(CID x0004、0x0005、0x0006)都是固定用途、小數據量通信。應用自定義或大數據傳輸,必須使用流控進行通信通關。
想了解更多嵌入式技術知識,請點擊閱讀我的其他文章
煙花的文章鏈接集合-CSDN博客
如果你覺得內容對您有幫助,別忘了點贊、收藏和分享支持下哦!