目录

引言

一、L2CAP主要功能

二、L2CAP帧格式及信道概念

2.1 逻辑链路是什么?

2.2 逻辑信道的作用

2.3 L2CAP帧格式介绍

三、L2CAP信令信道

3.1 信令信道帧格式说明

3.2 信令信道指令介绍

3.2.1 信令信道指令一览表

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说明
      0x0004GATT专用信道,L2CAP不做处理,只进行转发
      0x0005L2CAP信令信道
      0x0006SMP专用信道,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博客

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

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
      如若转载,请注明出处:http://www.pswp.cn/diannao/95863.shtml
      繁体地址,请注明出处:http://hk.pswp.cn/diannao/95863.shtml
      英文地址,请注明出处:http://en.pswp.cn/diannao/95863.shtml

      如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      CSS保持元素宽高比,固定元素宽高比

      方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">这里是正文内容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 宽高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

      数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(上篇)

      &#xff08;一&#xff09;Numpy库的安装安装指定版本的Numpy库&#xff0c;打开命令提示符&#xff0c;输入下图内容&#xff0c;只需要将1.25.5的版本修改成个人需要的版本&#xff0c;然后按下回车键&#xff0c;numpy库就安装在python中&#xff1a;指定版本numpy库安装可…

      从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)

      一、准备工作 1. 环境说明 本地开发环境&#xff1a;Windows 服务器&#xff08;需执行部署脚本&#xff09;目标服务器&#xff1a;Linux 服务器&#xff08;需安装 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;压缩&#xff09;、OpenSSH&#x…

      智能汽车领域研发,复用云原始开发范式?

      汽车电子电气架构演进趋势&#xff1a;分散的功能ECU -> 域控制器 -> 中央计算服务器汽车电子方案与架构在发展与迭代时会使用虚拟化方法几种可行的软硬一体化方案&#xff1a;多ECU&#xff0c;硬件隔离&#xff0c;硬件分区&#xff0c;车规级多核硬件架构 Hypervisor…

      数据电台询价的询价要求

      技术规格及主要参数 1.电台基本要求&#xff1a; 1.1 电台中的信号处理基于FPGA设计&#xff0c;采用FPGAARM高速AD/DA设计架构&#xff1b; 1.2 具备频谱感知、自主选频、跳频、扩频等功能&#xff1b; 1.3 具备链路质量信息、自组网路由信息、电池电压监测信息、北斗定位信息…

      IoT/HCIP实验-5/基于WIFI的智慧农业实验(LwM2M/CoAP+PSK+ESP8266 连接到 IoTDA)

      文章目录概述WIFI8266 通信模组WIFI模组也用AT指令&#xff1f;ESP8266 内置协议栈?支持的无线网络模式MCU通过串口与模组交互Wifi模组做客户端PC-AT接入路由器向本地TCP服务发数据用代码接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平台侧开发工程配置和编译工程…

      定时器输出PWM波配置(呼吸灯)

      使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模块头文件&#xff1a;应声明 pwm_init/pwm_compare_set 等原型、并包含 HAL 头//&#xff08;示…

      [ai-agent]环境简介之沙盒e2b vs daytona

      所谓的环境的就是agent运行在哪里&#xff0c;或者是agent和那里进行交互。 最常见的环境就是本地开发环境&#xff0c;也就是个人主机&#xff0c;但是存在问题就是没有办法出网和横向扩展。 在沙盒之前也是有其他选择的&#xff1a; 云服务器&#xff0c; 虚拟机&#xff0c;…

      【前端面试题】前端面试知识点(第三十一题到第六十一题)

      三十一. CSS实现垂直水平居中 实现元素的垂直水平居中是前端开发中的常见需求,主要有以下几种思路: text-align + line-height实现单行文本水平垂直居中 适用于单行文本元素,通过text-align: center实现水平居中,line-height等于容器高度实现垂直居中 text-align + vertic…

      嵌入式练习项目——————抓包获取天气信息

      一、内容 尝试通过实时天气接口 - 数据接口 - NowAPI此网站获取天气信息&#xff0c;实现可以发送城市查询当前天气和未来天气 二、获取请求报文 可以根据测试示例看到获取内容&#xff0c;此时数据是cJSON格式&#xff0c;我们首先要通过合适的网址抓包获取到请求报文&#x…

      Python爬虫实战:研究NewsCrawl ,构建新浪和网易新闻数据采集系统

      1. 引言 1.1 研究背景与意义 在信息时代,新闻作为社会动态、公众观点的重要载体,其传播速度与影响力持续扩大。传统的人工筛选与采集方式已无法满足对海量新闻数据的高效处理需求,亟需自动化工具实现大规模、结构化的新闻数据采集。网络爬虫技术作为一种按照预设规则自动抓…

      PyTorch神经网络工具箱全解析:nn.Module vs nn.functional

      &#x1f50d; 为何需要神经网络工具箱&#xff1f; 在仅用 Autograd 和 Tensor 实现模型时&#xff0c;开发者需手动设置参数梯度&#xff08;requires_gradTrue&#xff09;、反向传播&#xff08;backward()&#xff09;及梯度提取&#xff0c;过程繁琐且易出错。nn 工具箱应…

      Java注解学习记录

      目录 一、为什么要学注解&#xff1f; 二、注解是什么&#xff1f; 三、为什么要使用注解&#xff1f; 四、注解的作用 五、注解的分类 5.1 元注解 Retention&#xff08;/ rɪˈtenʃ(ə)n /&#xff09; ★★★★★ Target ★★★★★ Inherited(/ ɪnˈherɪtɪd /…

      43.安卓逆向2-补环境-使用unidbg(使用Smali语法调用方法和使用方法地址调用方法)

      免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

      【Kubernetes知识点问答题】Pod 调度

      1. 如何将特定 Pod 调度到指定的节点&#xff1f;可以使用下列方法中的任何一种来选择 K8s 对特定 Pod 的调度&#xff1a;① 与节点标签匹配的 nodeSelector&#xff1a;在 Pod 的规范中使用 nodeSelector 字段来指定节点标签&#xff0c;以便将 Pod 调度到具有特定标签的节点…

      wordpress显示时间日期的几种常见的方式

      在WordPress中&#xff0c;显示时间日期有多种常见方式&#xff0c;包括使用默认设置、模板标签、插件等&#xff0c;以下是详细介绍&#xff1a; 使用默认设置 WordPress的默认设置允许你在文章列表中显示文章的发布时间。登录到WordPress后台&#xff0c;在“设置”中找到“…

      基于飞算JavaAI实现布隆过滤器防止缓存穿透:原理、实践与全流程解析

      引言&#xff1a;当缓存失效时&#xff0c;系统如何避免“雪崩式崩溃”&#xff1f; 在互联网高并发场景中&#xff08;如电商秒杀、社交平台热点新闻&#xff09;&#xff0c;缓存是提升系统性能的核心手段——将频繁访问的数据&#xff08;如商品详情、用户信息&#xff09;存…

      DeepResearch开源与闭源方案对比

      在这个AI不再只是聊天工具的时代&#xff0c;"深度研究"已经成为大语言模型&#xff08;LLM&#xff09;的一项新能力。先进的LLM不再只是给出快速的一次性回答&#xff0c;而是可以像研究助手一样工作——搜索网上信息&#xff0c;调用各种工具&#xff08;比如搜索…

      UniApp 页面传参方式详解

      在 UniApp 开发中&#xff0c;页面间参数传递是核心功能之一。以下是 8 种常用的传参方式&#xff0c;每种方式都有其适用场景和特点&#xff1a;一、URL 拼接传参&#xff08;最常用&#xff09; 适用场景&#xff1a;简单数据传递&#xff0c;如 ID、状态值等基础类型数据 实…

      音频分类标注工具

      pyqt 分类标注工具&#xff1a;import glob import sys import json import os from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem,QSplitter, QVBoxLayout, QWidget, QPushButton, QRadioButton,QButtonGroup, QLabel, QHBoxLayout, Q…