注:文章基于蓝牙6.0 协议栈核心规范文档,由 SIG规定,原文档可 点此进入查看
目录
一、L2CAP介绍
蓝牙低功耗(BLE)的L2CAP层是协议栈核心逻辑链路控制层,位于ATT/GATT等上层协议与HCI/LL控制层之间,具有以下核心功能:
- 协议复用:通过CID(通道标识符)区分不同服务,BLE固定通道CID 0x0004用于ATT协议,CID 0x0005用于LE信号通道
- 分段重组(SAR) :将最大64KB的SDU分割为适合空口传输的PDU,重组时通过PDU长度字段校验完整性
- 信用流控制:LE特有机制,通过初始信用值和动态调整实现无阻塞传输
- 错误恢复:仅增强模式支持重传,基础模式依赖LL层ARQ机制
(与传统蓝牙(BR/EDR)差异:BLE无重传/流控制模式,仅支持LE信用控制模式和增强信用模式)
二、L2CAP位置
三、空口包结构
-
未编码PHY空口包
-
编码PHY空口包
-
编码未编码Phy说明
-
L2CAP Header
-
根据Header可以分为几种帧:
B-frames, C-frames, K-frames、I-frames, S-frames,G-frames
-
在BLE中仅支持B-frames, C-frames, K-frames
帧类型 标识符 结构特征 应用场景 B帧 SAR=0b00 无分段,直接封装完整SDU ATT短数据(默认MTU=23) K帧 SAR=0b10 携带SDU长度字段+信用控制 LE信用模式大数据传输 C帧 CID=0x0005 信号命令(连接参数更新等) 设备管理类操作 -
B帧(Basic Frame)
-
最小L2CAP协议信息
-
场景:ATT属性读写、SMP配对等小数据交互
-
-
K帧(Credit-Based Frame)
-
k帧是用于LE基于信用的流量控制模式和增强基于信用的流量控制模式的PDU。
-
场景:长数据传输(如OTA固件升级、语音流)
-
-
C帧(Control Frame)
-
c帧是包含对等L2CAP实体之间交换的L2CAP信令消息的PDU。c帧专门用于L2CAP信号通道。
-
场景:动态通道管理、QoS协商
-
各种命令如下,
-
如发起连接参数更新是由L2CAP_CONNECTION_PARAMETER_UPDATE_REQ (code 0x12)命令发起
-
MTU交换由L2CAP_LE_CREDIT_BASED_CONNECTION_REQ (code 0x14)命令发起
-
-
-
-
-
分段和重组
- 分段是将pdu分解成更小的部分,以便从L2CAP传递到较低的层。重组(Recombination)是将从底层发送上来的分片重新组合成PDU的过程。分片和重组可以应用于任何L2CAP pdu。
- 分段实现
- 通过K帧分包,第一帧包含SDU长度和PDU长度,后面延续包只包含PDU长度,LL层累加Payload长度匹配首帧的SDU_Length判断结束,流程如下:
- 重组实现与分段反过来,判断LLID,LLID=0b10为首帧,LLID=0b01为延续帧,判断数据与SDU长度相同为结束
- 注意:必须收齐所有分片并通过校验后,才将完整SDU提交上层
- 通过K帧分包,第一帧包含SDU长度和PDU长度,后面延续包只包含PDU长度,LL层累加Payload长度匹配首帧的SDU_Length判断结束,流程如下: