1. 介紹
L2CAP,Logical Link Control and Adaptation Protocol,即邏輯鏈路控制和適配協議,是藍牙系統中的核心協議
相應的規范位於Core Version 4.1的Vol 3:Part A
其在藍牙架構如下圖所示
2. 實現
L2CAP負責適配基帶中的上層協議,它同LM並行工作,向上層協議提供面向連接和無連接的數據服務,並提供多路復用,分段和重組操作,允許高層次的協議和應用能夠以64KB的長度發送和接收數據包(L2CAP Serveice Data Units, SDU)
L2CAP提供了邏輯信道,名為L2CAP Channels,即在一個或多個邏輯鏈路上進行多路復用
L2CAP提供了如下功能
- 協議/信道多路復用 - 分段和重組 - 服務質量
L2CAP可分為兩個部分
- Channel Manager
- Resource Manager
L2CAP只支持ACL,而不支持SCO/eSCO(用預留寬帶進行實時語音傳輸)
L2CAP不支持可靠的廣播信道
3. 通用操作
3.1 L2CAP Channel
L2CAP基於信道的概念,信道的每一個端點被稱為信道標識符(CID)
不同設備間CID可復用,但本地設備CID不可復用
以下是CID ACL-U和AMP-U鏈路的name space(LE-U未列出)
CID | Description | Logical Link Supported |
0x0000 | Null identifier | |
0x0001 | L2CAP Signalling Channel | ACL-U |
0x0002 | Connectionless Channel | ACL-U |
0x0003 | AMP Manager Protocol | ACL-U |
0x0004~0x003E | Reserved | ACL-U |
0x003F | AMP Test Manager | ACL-U |
0x0040~0xFFFF | Dynamically allocated | ACL-U, AMP-U |
3.2 設備間操作
上圖說明了CID在不同設備對等L2CAP實體間通信中的使用方式
面向連接的數據信道提供了兩設備間的連接,綁定邏輯鏈路的CID則用於標識信道的每一端
對於無連接的數據信道,當用於廣播傳輸時限制了傳輸的方向;當用於單播傳輸時則沒有限制
部分信道都保留用做特殊目的,具體如下圖
如0x0001表示Signalling Channel,用於創建和建立面向連接的數據信道,並可對這些信道的特性變化進行協商(ACL-U)
3.3 層間操作
3.4 操作模式
L2CAP Channels可運行在以下模式之一
- 基本L2CAP模式(Basic L2CAP Mode) /* 也是默認模式 */ - 流量控制模式(Flow Control Mode) - 重傳模式(Retransmission Mode) - 加強版重傳模式(Enhanced Retransmission Mode) - 流模式(Streaming Mode) - LE Credit Based Flow Control Mode
4. 數據包格式
本章節介紹數據包格式,Data Packet Format
L2CAP有以下幾種連接類型:
- Connection-oriented Channels in Basic L2CAP mode - Connectionless Data Channel in Basic L2CAP mode - Connection-oriented Channel in Retransmission/Flow Control/Streaming Mode - Connection-oriented Channels in LE Credit Based Flow Control Mode
對於不同的連接類型,數據包格式是不同的;且Information payload是基於Little Endian byte order
4.1 B-Frame
B-Frame格式如下圖所示
B-Frame各字段含義如下
Length: 2 bytes, Information payload的字節數(0~65535) Channel ID: 2 bytes, 對端目的信道 Information payload: 0~65535 bytes
4.2 G-Frame
G-Frame格式如下圖所示
G-Frame各字段含義如下
Length: 2 bytes, Information payload和PSM的字節數(0~65535) Channel ID: 2 bytes, 對於無連接傳輸使用固定值0x0002 PSM: >= 2 bytes, Protocol/Servece Multiplexer
關於PSM,其取值范圍如下所示,具體指參考Channel Identifiers
4.3 S-Frame/I-Frame
I-Frame用於在L2CAP實體間進行信息傳輸;S-Frame則用於確認I-Frame和I-Frame的重傳請求
S-Frame和I-Frame格式如下圖所示
S-Frame和I-Frame各字段含義如下
Length: 2 bytes, 除Basic L2CAP外的總字節數 Channel ID: 2 bytes, 對端目的信道 L2CAP SDU Length: 2 bytes, 只出現在Start I-Frame(SAR=0x01)中, 表示總的SDU長度 FCS: 2 bytes, Frame Check Sequence
Control Field有三種模式
- Standard Control Field: 用於Retransmission mode and Flow Control mode - Enhanced Control Field: 用於Enhanced Retransmission mode and Streaming mode - Extended Control Field: 用於Enhanced Retransmission mode and Streaming mode
Standard Control Field格式如下
Enhanced Control Field格式如下
Extended Control Field格式如下
Control Field各字段含義如下
SAR: (2 bits), Segmentation and Reassembly, 指明該L2CAP是否是分段過 TxSeq: (6/14 bits), Send Sequence Number, 對發送的I-Frame計數, 用於分段和重組 ReqSeq: (6/14 bits), Receive Sequence Number, 接收方用於應答I-Frame和請求重傳 R: (1 bits), Retransmission Disable Bit, 用來實現Flow Control S: (2 bits), Supervisory function, 表示S-Frame的type P: (1 bits), Poll, 置1表示從接收方征求相應 F: (1 bits), Final, 相應P置1的S-Frame
SAR取值及含義如下
S取值及定義定義如下
4.4 LE-Frame
LE-Frame格式如下圖所示
LE-Frame字段含義與其他Frame類似
5. 信號包格式
本章節介紹信號包格式,Signaling Packet Format
這里介紹的是在對端設備上兩個L2CAP實體間傳遞的信號命令(Signaling Commands)
這些信號命令通過Signaling Channel來傳輸
對於ACL-U邏輯鏈路應該使用CID 0x0001, 而對於LE-U則應該使用CID 0x0005
通用的信號包格式如下
Field類似B-Frame,不詳述;值得一說的是payload長度
另需要注意:
一個C-Frame通過0x0001信道可以傳遞多個命令;而一個C-Frame通過0x0005信道則只能傳遞一個命令
上圖顯示了信號命令的通用格式,各字段含義如下
Code: 1 byte, 指定Command的類別 Identifier: 1 byte, 用於標識一個Request和Response匹配對 Length: 2 byte, data字段的長度 Data: 0~N byte, Code字段來決定其格式
下圖顯示了規范所定義的Code類型,至於data的格式請參考規范Vol 3-Part A-4
6. 參數配置選項
本章節介紹參數配置選項,Configuration Parameter Options,慚愧,原文晦澀難懂,哥不甚理解
各字段含義如下所示
Type: 1 byte, 定義需要被配置的參數, 若不能識別則由最高位決定其行為
0表示必須識別該選項, 若無法識別則拒絕配置請求; 1表示可以跳過該選項 Length: 1 byte, 選項數據的字節數, 若選項數據為空則為0 Option Data: 由Type決定其內容(不詳述,見規范Vol 3-Part A-5)
Type字段具體含義
1) Maximum Transmission Unit(MTU), Type=0x01 2) Flush Timeout Option, Type=0x02 3) Quality of Service(Qos) Option, Type=0x03 4) Retransmission and Flow Control Option, Type=0x04 5) Frame Check Sequence(FCS) Option, Type=0x05 6) Extended Flow Specification Option, Type=0x06 7) Extended Window Size Option, Type=0x07
7. 狀態機
這里指的是面向連接信道(Connection-oriented Channel)狀態機(State Machine),適用於雙向CID
介紹了狀態(state),引起狀態變化的事件(event)及事件相對應的動作(action)
7.1 狀態機
如下圖所示,發起請求的一方是客戶機,服務器接收請求,應用層的客戶既可以發起也可以接收請求
命令規則為:
- 兩層之間的界面上(垂直方向)用下層的縮寫名作前綴, 為上層提供服務, 如L2CA
- 兩個同層實體之間的接口(水平方向)則使用協議縮寫作為前綴, 如L2CAP
- 來自上層的事件稱作請求Request(Req), 相應的答復稱為確認Confirm(Cfm)
- 來自低層的事件稱為指示Indication(Ind), 相應的答復稱為相應Response(Rsp)
7.2 事件
在L2CAP層中,只有超時事件是由本層產生,事件分為5類:
- 來自下層的指示(Indication)和確認(Confirm) - 來自上層的請求(Request)和相應(Response) - 來自對等層的數據 - 來自對等層的請求和相應 - 超時事件
7.3 動作
動作可分為5類:
- 對上層的確認(Confirm)和指示(Indication) - 對下層的請求(Request)和相應(Response) - 發給對等層實體的數據傳輸 - 發給對等層的請求和相應 - 計時器設置
7.4 信道操作狀態
信道操作狀態
1) CLOSED 2) WAIT_CONNECT 3) WAIT_CONNECT_RSP 4) CONFIG 5) OPEN 6) WAIT_DISCONNECT 7) WAIT_CREATE 8) WAIT_CREATE_RSP 9) WAIT_MOVE 10) WAIT_MOVE_RSP 11) WAIT_MOVE_CONFIRM_RSP 12) WAIT_CONFIRM_RSP
參考:
<邏輯鏈路控制和適配協議規范>