目录
引言
在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)都是固定用途、小数据量通信。应用自定义或大数据传输,必须使用流控进行通信通关。
想了解更多嵌入式技术知识,请点击阅读我的其他文章
如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!