逻辑链路控制和适配协议层L2CAP
- L2CAP层
- 功能
- 数据包格式
- 面向连接PDU
- 重传输/流量控制/流媒体模式下的面向连接的信道
- 无连接PDU
- 信令通道
- L2CAP_COMMAND_REJECT_RSP
- L2CAP_CONNECTION_REQ
- L2CAP_CONFIGURATION_REQ
- L2CAP_CONFIGURATION_RSP
- L2CAP_DISCONNECTION_REQ
- L2CAP_DISCONNECTION_RSP
- L2CAP_ECHO_REQ
- L2CAP_ECHO_RSP
- L2CAP_INFORMATION_REQ
- L2CAP_INFORMATION_RSP
- L2CAP_CONNECTION_PARAMETER_UPDATE_REQ
- L2CAP_CONNECTION_PARAMETER_UPDATE_RSP
- L2CAP_LE_CREDIT_BASED_CONNECTION_REQ
- L2CAP_LE_CREDIT_BASED_CONNECTION_RSP
- L2CAP_FLOW_CONTROL_CREDIT_IND
- L2CAP_CREDIT_BASED_CONNECTION_REQ
- L2CAP_CREDIT_BASED_CONNECTION_RSP
- L2CAP_CREDIT_BASED_RECONFIGURE_REQ
- L2CAP_CREDIT_BASED_RECONFIGURE_RSP
- CONFIGURATION PARAMETER OPTIONS
- 状态机
蓝牙文章链接直达: 👇
1.profile层(待更新)
2.属性协议层(ATT)(待更新)
4.通用访问协议层(GAP)(待更新)
5.通用属性协议层(GATT)(待更新)
11.蓝牙应用
L2CAP层
-
今天我们来唠唠逻辑链路控制和适配协议层(Logical Link Control and Adaptation Protocol)。
-
L2CAP位于HCI层之上,ATT、SMP等协议之下,主要负责控制和适配协议层负责数据的分割、数据重组、通道多路复用、通道流量控制和错误检测。 SDU最大可达64Kb。
下图是L2CAP的组件结构:
具体来看,通道管理器(Channel Manager)负责L2CAP的整体控制,它通过不同命令执行信令、状态机(与链路层状态机不同)、重传数据包控制;而资源管理器则负责向信道管理器、重传和流控制块以及那些不需要重传和流控制服务的应用程序数据流提供帧中继服务。它负责在底层接口上提供的设施上,协调与多个L2CAP信道相关的数据包的传输和接收。
功能
信道复用
信道复用的目的是为了能够区分不同的上层协议实体,它通过数据包中的PSM字段来判断,如0x0001 对应 SDP协议,0x0003 对应 RFCOMM协议,当然,这些协议不属于低功耗蓝牙的范畴,这里不具体展开描述,感兴趣的同学可以私信我,给你分享这方面的资料。
CID字段来判断,如0x0001表示BT蓝牙信道,0x0005表示BLE信令信道,协议多路复用的功能允许了多个不同上层协议使用同一个L2CAP层,换句话说,L2CAP的存在使得多个协议可以同时运行。
数据分割重组
L2CAP层数据分割重组的功能有很多好处,优势如下:
- 分割将允许应用数据以单元形式发送,以满足延迟要求。
- 当L2CAP控制数据包大小时,内存和缓冲区管理更容易。
- 通过重传进行纠错可以提高纠错的效率。
- 当一个L2CAP PDU被损坏或丢失时,被破坏的数据量可以小于应用程序的数据单元。
- 该应用程序与将应用程序数据包映射到较低层数据包所需的分段操作解耦。
数据流控
错误控制和重传输
L2CAP错误检查和重传还可以防止由于控制器冲洗而导致的数据包丢失。
流媒体支持
碎片化和重组
操作模式
模式 | 用法 |
---|---|
经典 L2CAP | 经典蓝牙和部分低功耗蓝牙信道 |
流控 | 经典蓝牙 |
重传 | 经典蓝牙 |
增强重传 | 经典蓝牙 |
流 | 经典蓝牙 |
基于LE流控 | 低功耗蓝牙信道 |
增强流控 | 经典蓝牙和低功耗蓝牙信道 |
模式需通过链路层信到配置,具体见vol3 partA,7.1。 | |
基础模式为默认工作模式,L2CAP层是不执行流程控制,如对数据不执行分段和重组操作。其余五种模式均使用了流程控制或重传机制,需要执行分段和重组操作。在L2CAP层配置阶段,会设置参数是否使用流程控制和重传机制,如果不使用则使用基础模式,否则按参数配置情况使用其他模式。 |
数据包格式
面向连接PDU
数据包中的Length字段仅表示payload长度,不包含L2CAP header长度。
CID对应不同的逻辑链路,如0x0005是低功耗蓝牙的信令链路,0x0006是安全管理协议SMP的链路,与低功耗相关的链路如下所示:
CID信道标识符 | 描述 |
---|---|
0x0000 | 保留 |
0x0001 | 经典蓝牙信令通道 |
0x0002 | 无连接信道 |
0x0003 | AMP管理协议 |
0x0004 | ATT协议 |
0x0005 | BLE信令通道 |
0x0006 | 安全管理协议SMP |
0x0007-0x0003E | 保留 |
0x003F | AMP测试协议 |
0x0040-0x007F | 面向连接,动态分配 |
Information payload最大可达 65535 字节 |
重传输/流量控制/流媒体模式下的面向连接的信道
信息帧(I-帧)用于L2CAP实体之间的信息传输。监控帧(S帧)用于确认I帧并请求I帧的重传
此PDU可用于传输音频和视频数据、文件、控制命令等,具体作用可参考蓝牙5.4核心协议VOL3 partA section3.3。
无连接PDU
无连接PDUCID信道号为0x0002,PSM(Protocol/Service Multiplexer)由于PSM是奇数且最重要字节的最小重要位为零,以下范围不包含有效PSM:0x0100-0x01FF、0x0300-0x03FF、0x0500-0x05FF、0x0700-0x07FF、0x0900-0x09FF、0x0B00-0x0BFF、0x0D00- 0x0DFF。所有的偶数值也不能作为psm有效。
信令通道PDU
信令通道
最小信令信道MTU
其中低功耗蓝牙常用的即为LE-U通道,23字节,即ATT层MTU,这里插播一句,23字节还要减去1字节的opcode和2字节的handle,所以蓝牙4.2版本,ATT层只能传输20字节的有效数据。但是蓝牙5.0版本更新允许协商MTU,最大可达512字节。
Code,identifer标识符,用于标识不同的信令通道,0x00无效的标识符,不能使用。以下是code字段:
下面我们对这些PUD进行详细的分析:
L2CAP_COMMAND_REJECT_RSP
在响应未知操作码时L2CAP层会返回拒绝的RSP,并返回响应拒绝的原因,如下所示:
Reason
Reason Data
L2CAP_CONNECTION_REQ
此处的PSM字段即协议辨识字段,用于指明是何种上层应用协议,PSM具体内容包含在assigned number协议中,已在上述列举,大家往上翻看即可。source CId表示请求设备的CID。
L2CAP_CONNECTION_RSP
Destination CID即响应方CID。
Result表示请求是否成功,结果代码如下:
Status则表示连接的状态,定义如下:
L2CAP_CONFIGURATION_REQ
flag字段:
其中C称为延续字段(Continuation flag),表示后续还有数据包,当小于L2CAP的值时,该值设为0。
Configuration Options包在下一节中进行描述。
L2CAP_CONFIGURATION_RSP
这里的Config字段与Configuration Options含义相同,详情看以下内容。
result字段含义如下:
L2CAP_DISCONNECTION_REQ
这里的字段与上述描述过字段含义相同,不再重复描述。
L2CAP_DISCONNECTION_RSP
L2CAP_ECHO_REQ
echo可选字段,蓝牙协议给厂商测试自定义内容的PDU。
L2CAP_ECHO_RSP
echo可选字段,蓝牙协议给厂商测试自定义内容的PDU。
L2CAP_INFORMATION_REQ
InfoType
value | description |
---|---|
0x0001 | Connectionless MTU |
0x0002 | Extended features supported |
0x0003 | Fixed channels supported over BR/EDR |
L2CAP_INFORMATION_RSP
InfoType字段与请求包中的InfoType字段含义相同。
result
info
在info字段中存在EXTENDED FEATURE MASK字段,定义如下:
FIXED CHANNELS SUPPORTED OVER BR/EDR字段含义如下:
L2CAP_CONNECTION_PARAMETER_UPDATE_REQ
IntervalB Min最小连接间隔,IntervalB Max最大连接间隔,Lantency从机延时,Timeout超时时间,这些字段含义与链路层中的连接请求包含义相同。
L2CAP_CONNECTION_PARAMETER_UPDATE_RSP
result返回值,0代表接受参数值,1代表拒绝接收请求值。
L2CAP_LE_CREDIT_BASED_CONNECTION_REQ
此数据包用于BLE可信的流量控制模式,SPSM值被分为两个范围。第一个范围内的值由蓝牙SIG分配,并指示协议。第二个范围内的值是动态分配的,并与GATT服务器中定义的服务一起使用。可以使用动态分配的值支持多个上层协议。SPSM的具体分配值与PSM相同,可参考上述PSM分配值。与PSM唯一不同的是SPSM长度固定不可变。
MPS,Maximum PDU Payload Size ,最大有效Payload长度。0-65533。
initial credit初始可信值,指示对等设备可发送的最大K帧(K帧即可信BLE流控PDU)的数量。0-65535。Credit代表发送一个LE frame的权限。
SPSM范围值定义如下:
L2CAP_LE_CREDIT_BASED_CONNECTION_RSP
MPS,Initial Credits与REQ数据包相同。
以下是result字段含义:
L2CAP_FLOW_CONTROL_CREDIT_IND
Credits字段与上述含义相同。
L2CAP_CREDIT_BASED_CONNECTION_REQ
SPSM、MPS、initial Credits字段与之前描述含义相同。
L2CAP_CREDIT_BASED_CONNECTION_RSP
result字段含义如下:
L2CAP_CREDIT_BASED_RECONFIGURE_REQ
L2CAP_CREDIT_BASED_RECONFIGURE_RSP
result字段含义如下:
CONFIGURATION PARAMETER OPTIONS
可选配置的格式如下:
option type code | option type | option length |
---|---|---|
0x01 | MTU | 2 |
0x02 | FLUSH TIMEOUT | 2 |
0x03 | QUALITY OF SERVICE | 22 |
0x04 | RETRANSMISSION AND FLOW CONTROL | 9 |
0x05 | FRAME CHECK SEQUENCE | 1 |
0x06 | EXTENDED FLOW SPECIFICATION | 16 |
0x07 | EXTENDED WINDOW SIZE | 2 |
状态机
• CLOSED
• WAIT_CONNECT
• WAIT_CONNECT_RSP
• CONFIG
• OPEN
• WAIT_DISCONNECT