【BLE系列-第四篇】从零剖析L2CAP:信道、Credit流控、指令详解

目录

引言

一、L2CAP主要功能

二、L2CAP帧格式及信道概念

[2.1 逻辑链路是什么?](#2.1 逻辑链路是什么?)

[2.2 逻辑信道的作用](#2.2 逻辑信道的作用)

[2.3 L2CAP帧格式介绍](#2.3 L2CAP帧格式介绍)

三、L2CAP信令信道

[3.1 信令信道帧格式说明](#3.1 信令信道帧格式说明)

[3.2 信令信道指令介绍](#3.2 信令信道指令介绍)

[3.2.1 信令信道指令一览表](#3.2.1 信令信道指令一览表)

[3.2.2 Credit流控规则](#3.2.2 Credit流控规则)


引言

在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)都是固定用途、小数据量通信。应用自定义或大数据传输,必须使用流控进行通信通关。


想了解更多嵌入式技术知识,请点击阅读我的其他文章

烟花的文章链接集合-CSDN博客

如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!