蓝牙协议规范--L2CAP
L2CAP 分析
記住一點,軟件和硬件分開理解,數據經由物理通道交互,上層通道由各層協議打通。
L2CAP 全稱為邏輯鏈路控制與適配協議(Logical Link Control and Adaptation Protocol),位于基帶層之上,將基帶層的數據分組交換為便于高層應用的數據分組格式,并提供協議復用和服務質量交換等功能。
L2CAP 是基于下列假設為依據而設計的:
● 使用鏈路管理器協議在兩單元間建立 ACL 鏈路。基帶提供數據分組的有序傳輸, 但也可能有個別分組損壞或重復。任兩臺設備之間只會有一條 ACL 鏈路。
信道建立在鏈路的基礎上,信道可以有多個,鏈路只有一條。
● 基帶通常提供全雙工信道。但這并不是說所有 L2CAP 通信都是雙向的。多點傳送和單向通信(例如,視頻)并不要求雙工信道。
● 通過使用基帶層提供的機制,L2CAP 提供了一條可靠的信道。當收到請求和重發數據時,基帶通常要執行數據完整性校驗,直到數據成功確認或發生超時。由于可能會丟失確認報文,所以甚至在數據成功發送后也會發生超時。基帶協議使用長度為 1 位的序列號,該序列號用于刪除重復發送的分組。由于所有廣播的 L2CAP 數據分組的首段都以同一序列位為起始位, 如果需要提供可靠傳輸,就應禁止使用基帶廣播分組。
L2CAP 主要對數據進行封裝,支持協議復用,統一高層協議數據格式。
L2CAP 特點
● 協議復用:能夠區分高層協議,在信道建立時,協議復用功能用來發送請求來連接正確的上層協議;在數據傳輸時,邏輯信道復用必須能夠把用同一個協議的不用幾個高層實體的區分出來(一對多情況)。
● 分段與重組:高層協議需傳輸的數據長度不定,L2CAP 層控制了 PDU 的長度,不僅易于管理而且通過對數據標記分組,允許數據單元的交錯,可以滿足延時要求,發生錯誤時的重傳也可以更加方便準確。
● 差錯控制和重傳:
L2CAP 以信道概念為基礎,每個信道的端點有信道標識符(channel identifier, CID)來表示。從 0x0001 到 0x003F 的標識符保留用于特定的 L2CAP 功能。空標識符(0x0000)則定義為一個非法標識符, 并且不得用于目標端。可以根據實際應用目的和情況, 以合適方式自由管理其余的 CID。但在本地設備與多個遠端設備存在多個并發 L2CAP 信道的情況下,同一 CID 不得重新用作本地 L2CAP 信道端。 下表對 CID 命名空間的定義和劃分進行的總結。
| 0x0000 | 無效標識 |
| 0x0001 | 正在發信號的信道 |
| 0x0002 | 無連接的接受信道 |
| 0x0003-0x003f | 保留(特定功能) |
| 0x0040-0xffff | 動態分配 |
L2CAP 信道有三種類型:面向連接(Connection-Oriented,CO)信道,用于兩個連接設備之間的雙方通信;無連接(Connection-Less,CL)信道,用來向一組設備進行廣播式的數據傳輸,為單項信道;信令(Signaling)信道,用于創建CO 信道,并可以通過協商過程改變 CO 信道的特性.
BT/BLE 在 L2CAP 層的區別?? Note
下圖說明了 CID 在 L2CAP 實體間通信的使用方式,以及 L2CAP 信道的三種類型工作方式。信令信道是一個保留信道的實例,該信道用于創建和建立面向連接的數據信道,并可對這些信道的特性變化進行協商。
L2CAP 操作模式
根據每個 L2CAP 信道的上層協議,L2CAP 有三種不同的操作模式
(1)基本 L2CAP 模式(這點和版本 1.1 的藍牙協議里是一樣的)
(2)流控制模式
(3)重傳模式
在流控制模式和重傳模式中,雙方傳輸的數據分組都是被編了號的。數據分組中的序列號碼是用來控制緩沖, TxWindow 大小是用來限制需要的緩沖區空間和/或提供一種流控制的方法。另外對于窗口大小(window size)來說,流控制規范的 Token Bucket size 參數可以用來描述緩沖區的大小; 一些特殊的信道不使用流量和差錯控制。
在流控制模式下,丟失的數據分組可以被檢測出來,并能通知對方丟失,但不進行重傳。
在重傳模式下,使用一個定時器,把需要重新傳輸的數據分組傳送,來確保所有的數據分組都傳輸給對方。
數據分組格式
1、面向連接信道
各字段描述如下:
長度: 2個字節,主要指基本 L2CAP 報文頭除長度以外的信息凈荷的大小,即圖中空白部分,其長度可達65535字節。
凈荷信息: 靜荷信息包含來自上層協議(發出的分組)的凈荷或者發送到上層協議(接收的分組)的凈荷。 MTU 的值在信道配置時確定。所支持的用于信令分組的 MTU 的最小值為 48 字節。
信道ID: 2個字節,用于標識分組的目標信道終端。
2、無連接數據信道
各字段描述如下:
長度: 2個字節,是信息凈荷/有效載荷與 PSM 字段長度的和。
凈荷信息/有效載荷: 靜荷信息包含來自上層協議(發出的分組)的凈荷或者發送到上層協議(接收的分組)的凈荷。 MTU 的值在信道配置時確定。所支持的用于信令分組的 MTU 的最小值為 48 字節。
信道ID: 2個字節,CL 信道 ID 固定為0x0002
協議/服務復用(PSM): 一般為 SDP、RFCOMM、TCS 等中介協議復用。小
于 0x1000 的值,0x0001 對應 SDP,0x0003 對應 RFCOMM、0x0005 對應 TCS。主要用于標識何種上層協議。
3、信令信道
上圖所示為信令信道的分組格式,其一般用在連接、斷開、請求、拒絕等命令,所有信令通道 CID 均為 0x0001。
信令指令分組長度: 2個字節,除L2CAP分組頭部分之外的數據長度,即各指令長度之和 (note:各指令長度不定,具體使用,具體分析)
信令指令格式長度: 2個字節,為數據長度(大小不定,最大為65535字節)
標識符: 1個字節,用于請求與應答間的匹配。
信令命令代碼: 如下圖所示為各代碼代表含義
舉例說明: 下面是一個 L2CAP 包
這條指令完整的為:06 00 01 00 0a 01 02 00 02 00
注: 藍牙分組編碼為小端模式。
L2CAP 層接收到數據后的處理流程:
具體分析需要結合源碼一起。
詳細見藍牙核心技術概述.pdf 第42頁 以及 藍牙協議及其源碼分析 第274頁
總結
以上是生活随笔為你收集整理的蓝牙协议规范--L2CAP的全部內容,希望文章能夠幫你解決所遇到的問題。