BLE协议栈 – L2CAP

四 蓝牙低功耗(BLE)协议栈 之 L2CAP层 一 介绍 L2CAP(逻辑链路控制和适配协议层)是一个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割、数据重组、通道多路复用、通道流量控制和错误检测,使得较大的报文可以在底层无线电中传输。L2CAP层提供逻辑通道,即L2CAP通道,这些通道在一条或多条逻辑链路上复用。在经典蓝牙无线电中,L2CAP层提供的功能比这更多,也更为复杂。 通道管理器(Channel Manager)提供一个功能控制的控制面板,并负责所有内部信令、L2CAP点对点信令以及高层和低层的信令。 重传和流控制块(Retr 阅读详情

L2CAP(Logical Link Control and Adaptation Protocol)中文名为逻辑链路控制和适配协议,它位于BLE协议的主机(Host)部分,承担着协议复用(Protocol Multiplex)的任务。蓝牙协议官方手册的章节首页提到L2CAP还承担上层(ATT,SM)发来的数据的分割/重组(Segmentation/Reassembly)任务。这里需要澄清一点,这个功能仅适用于经典蓝牙协议,在BLE协议范围内,L2CAP层仅仅使用了最精简的一部分,即协议复用(此处小编还有待考证)。BLE的主机部分在L2CAP之上还有ATT(Attribute Protocol)层和SM(Security Manager)层,它们的协议实现和数据格式完全不同,却都可以通过L2CAP层传至协议栈的控制器部分,这就是所谓的协议复用。在阅读L2CAP的资料的时候,谨记L2CAP的复杂功能可能是为经典蓝牙准备,对于BLE而言,L2CAP几乎没什么内容。

信道

L2CAP的基本概念是信道(Signaling Channel)。信道是个抽象概念,表示两个设备某个协议层之间的通道。每个信道分配一个2字节的信道ID——CID(Channel ID),每个信道功用不同,比如CID=0x0004的信道表示属性协议(Attribute Protocol)专用信道。对于BLE协议,L2CAP共有三个信道ID:

  • 0x0004 – 属性协议
  • 0x0005 – 低功耗信令信道
  • 0x0006 – 安全管理协议

其他信道则用于经典蓝牙。协议复用可以理解为,不同的协议走不同的信道,互不干扰。

数据格式与MTU

主机上层的协议通过L2CAP层时,数据包会被封装成L2CAP数据包格式:

该数据格式主要包括:长度、CID和Payload。
BLE协议中,L2CAP支持的最大数据包长度为27,减去长度(2Bytes)和CID(2Bytes),Payload的最大长度为23!
这个23字节有个名字,叫最大传输单元(Maximum Transmission Unit),简称MTU。BLE协议默认的MTU为23字节。
MTU包括三个部分:OP Code(1Byte),Handler(2Byte),Payload,当MTU=23时,实际用户数据长度仅为20字节。在BLE协议规范中,L2CAP抛弃了数据分割和重组的工作,主要原因是在ATT层中,数据长度会被MTU所限制,进而传送到L2CAP的数据一定适用于L2CAP的Payload长度,也就无需额外的分割和重组。所以MTU是一个很关键的参数,两个BLE设备进行数据通信,当个数据包的有效长度不超过(MTU-3)。

在早期的智能手机中,蓝牙的MTU大小设定为固定的23,导致BLE从机设备与之通信,都会将包长度限制在20个字节以内。现在,新版的iOS的默认MTU已经增加到158,Android的MTU也可以进行设定。联想前面链路层里介绍的Payload是27个字节,这里将MTU与之关联起来,如下图所示:

我比较感兴趣的是,GAP层的广播数据,最大可有31个字节,这显然超出了L2CAP的Payload限制,根据一些文档的介绍,原因“好像”是广播数据包的传输,不经过L2CAP层,直接到达链路层,形成广播PDU。相应的参考链接

更新连接参数

L2CAP层有一个著名的功能,即更新BLE的连接参数。
BLE的连接参数包括:

  • 最小连接间隔(Min Connection Interval)
  • 最大连接间隔(Max Connection Interval)
  • 从设备延迟响应(Latency)
  • 监控超时(Supervisor Timeout)

这个问题在链路层有过介绍,这里简要重复一下。连接间隔是BLE连接中相邻的两个连接事件(Connection Event)之间的时间间隔。在一个连接事件中,主机发出一个Request,从机回复一个Response。主从之间的数据就是在这些Request和Response之中被传递。如果从设备端数据较长,那么在同一个连接事件中,会有多个Response。相邻的Response之间有一个固定的时间缝隙,称为IFS(Internal Frame Space),它为固定的150us,我们经常能在一些图文说明中见到T_(IFS)就是它。这个参数很重要,可以帮助我们推导出BLE的传输速率的极值。主机可以自由的更改连接参数,如果从机希望更改,则需要向主机发出更新请求,等待主机响应。通常主机都会接受,但是如果从机给出的参数过于苛刻,则主机可能拒绝。从使用角度讲,为了避免拒绝的发生,从机请求的连接参数应该是合理可行的,所以连接间隔设计成了大小值的形式,而非确定值。不过一般情况下,最终的连接间隔就等于最大连接间隔与最小连接间隔的平局值。Android系统的默认连接间隔为7.5ms,而iOS为18.75ms。因此,在不更新连接间隔的情况下,应该能发现iOS的通信速率会相对慢一点。

通信速率

Link Layer中的数据包格式如上图的数据格式与MTU所示。BLE的通信速率为固定的1Mbps,即传输1bit的时间为1μs。那么传输这样一个链路层数据包,取Payload为最大的27字节,所需要的时间为(1 + 4 + 2 + 27 + 4 + 3) * 8 = 328us。
连接事件模型如下:

主机发一个Data,从机响应一下(ACK),响应数据包中,PDU可以为空。那么可以算出当Payload为空时,整个Link Layer数据包传输所需要时间为(1 + 4 + 2 + 0 + 0 + 3) * 8us = 80us。

考虑中间的IFS间隔,那么一对Data-ACK所需要的时间为:328us + 150us + 80us + 150us = 708us。即主从之间完成一次通信握手所需要的最小时间为708us。在理想情况下,通信过程以这个速率进行下去,1秒的传输速率为:1s / 708us * 8bit * 27 Byte = 305bps。305bps(38KB/s) 是BLE通信速率的极限。现实中的BLE通信,肯定达不到这个速率,那瓶颈在哪里呢?

BLE通信是以连接事件为单位的,假如连接间隔为10ms,一次连接事件中共可以进行10ms / 708us = 14次握手。可是,这个14是理论值,实际上达不到,因为BLE通信过程中因为数据传输异常导致的重传是必然发生的,对于iPhone,网上有些资料讲iPhone和Anroid系统中一个连接间隔中仅能实现4次握手。考虑到iPhone的默认连接间隔是18.75ms,Android是7.5ms,那么对iPhone而言,1秒内可以传输的数据总量为1s / 18.75ms * 4 * 27 = 5.76kB/s,Android为:14.4kB/s。

这里计算中用到的27是指链路层的PDU的数据长度,根据前面的数据封包规则,27个字节中,用户数据仅有20个字节,所以上述的数据速率还要乘以一个系数 20/27,那么iPhone的BLE传输速率约为4kB/s,Android约为10.6kB/s。
据我们实际测试,手机与BLE设备进行通信,4kB/s是一个比较现实的测量数据,这个页面提到他们能够达到10kB/s的速率。
所以,与手机进行BLE通信,不要指望太高的通信速率。不过,BLEv4.2协议对此有了改善,通过提高PDU的容量,显著提高最终的通信速率,参考。
当然,BLE设备与设备之间进行通信,则没有那么多限制,至少在单个连接事件中的握手次数限制不会那么苛刻。

MTU与MPS

在PSoC Creator中可以看到这两个选项:

  • MTU:Maximum Transmission Unit
  • MPS:Maximum PDU Payload Size
    在官方手册中对MPS的介绍中有一段注释:如果不涉及拆包和重组,或者在基础的L2CAP模式下,MTU与MPS应该相等。而对于BLE 4.0/4.1,L2CAP就只有基础模式,因此对于不涉及BLE 4.2的应用,只要将二者设置为一致即可。还有兴趣的话,可以参考这个页面。

MTU与ATT_MTU

L2CAP中的MTU就叫MTU,在ATT层中,也有一个MTU,叫ATT_MTU。因为BLE协议中,L2CAP失去了分包重组的功能,因此数据包的大小需要在ATT层限定好,也就需要一个ATT_MTU,这时,只要L2CAP的Payload能够容纳ATT_MTU即可保证通信顺畅。显然,如果ATT_MTU比MTU大,可能引起冲突,因为上层数据包可能超过了L2CAP的Payload容纳极限。在不混淆的情况下,二者可以统称为MTU,并且在非特殊情况下,二者应该设为相同大小。

(完)

 

[本文转自红旭论坛,看完之后获益良多,故联系大佬Wireless-tech转之。]

蓝牙协议栈之L2CAP使用 本文记录对蓝牙协议栈逻辑链路及自适应协议层的学习还有后面如何在TI的蓝牙芯片上去实现L2CAP CoC的数据透传,为什么用L2CAP CoC进行数据透传呢?因为它每次透传的数据量远远能比GATT大,如果堆够用的话可以传输64KB,而GATT数据透传限于ATT-MTU,最多每次能传输的也就247个字节。使用L2CAP总结如下:主机和从机都可以请求建立L2CAP COC通道。一旦L2CAP连接建立成功之后,协议栈会发送到应用层,具体的事件是,这个是双方都会触发的事件。 阅读详情

相关推荐

深入浅出低功耗蓝牙(BLE)协议栈

BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么?协议栈框架一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。在深入BLE协议栈各个组成部分之前,我们先看一下BLE协议栈整体架构。 如上图所述,要实现一个BLE应用,首先需要一个支持...

iini01的博客 4262

BLE 协议之 L2CAP

一条是无连接的广播通道,天高任鸟飞另一条是基于连接的数据通道,是一个点对点()的逻辑通道。广播通道暂且不提,这个数据通道(后面简称逻辑通道,只有一条,而要利用它传输数据的上层应用却不止一个(例如上图中的 ATT 和 SMP),怎么复用?所能传输的有效 payload 长度最大只有 251bytes,怎是否意味着上层应用每次只能传输少于这个长度的数据?(显然不能!仅提供了简单的应答和流控机制,如果传输的数据出错怎么办?协议信道复用(

Projectsauron 的博客 2069

深入解析蓝牙L2CAP层:信道复用与数据流控机制

本文深入解析蓝牙协议栈中的L2CAP层,重点阐述其作为逻辑链路控制与适配层的核心功能。L2CAP通过信道复用机制,在单条物理连接上为不同应用创建虚拟数据通道,并管理数据流控,确保蓝牙设备间数据传输的高效与有序。文章详细剖析了CID信道标识、多种信道模式(包括BLE专属的基于信用的流控模式)以及帧结构,帮助开发者深入理解蓝牙通信的底层原理与优化实践。

weixin_29184371的博客 313

蓝牙BLE协议之——L2CAP层

​ 蓝牙低功耗(BLE)的L2CAP层是协议栈核心逻辑链路控制层,位于ATT/GATT等上层协议与HCI/LL控制层之间,文章基于蓝牙6.0协议栈核心规范文档,由SIG规定 ​

to_the_world的博客 1722

【Bluetooth蓝牙开发】七、BLE协议之L2CAP

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 3281

BLE协议栈(LL/PHY/ATT/HCI/L2CAP/SM/GATT/GAP)详解集合

本文为BLE协议栈精选文章集合

迈微AI研习社 · 号主 2172

BLE协议栈 – 介绍

在BLE技术领域里有三个方向:BLE APP,BLE固件和BLE协议栈。其中BLE协议栈是基础,BLE芯片内部提供的固件程序充当驱动,手机上的APP作为控制端。做APP开发无需要太多的专业背景,而做固件开发则需要深入理解协议栈。 BLE协议栈的官方文档可以自由下载阅读,该文档排版优良,颇具可读性。可是该文档仅有英文版,整个文档多达2000多页,这无疑增加了非英语读者的阅读困难。网上能够找到一...

琦。 1029

TI CC2540/CC2541蓝牙低功耗协议栈完整开发包

蓝牙低功耗(BLE)协议栈采用分层架构设计,自下而上包括物理层(PHY)、链路层(LL)、主机控制接口(HCI)、L2CAP、ATT、GATT和SM等核心组件。各层职责分明:PHY负责无线信号调制解调,LL管理广播、扫描与连接状态机,HCI提供主机与控制器通信接口,而ATT/GATT则定义了服务发现与数据交互语义。协议栈通过事件驱动机制在OSAL调度下运行,支持主从角色动态切换。例如,连接建立过程由LL层发起,经HCI透传事件至GAP层处理,最终通过GATT服务暴露设备数据。

weixin_42453228的博客 1094

BLE协议栈 – HCI

HCI(Host Controller Interface)层中文称为主机与控制器接口,它连接主机(Host)和控制器(Controller),将主机的操作转化成HCI指令传给控制器,BLE协议规定了HCI的指令集。 单芯片与双芯片 在BLE协议栈的层模型中,位于下部的物理层、链路层、DTM属于控制器,位于上部的L2Cap、ATT、GATT、GAP、SM层则属于主机,在主机之上用户自己的程序称...

琦。 3549

多臂老虎机——入门强化学习

多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

qq_56683019的博客 2459

FPGA时钟架构解密:从SRCC/MRCC到全局时钟树的实战指南

本文深入解析Xilinx 7系列FPGA时钟架构,从SRCC/MRCC引脚特性到全局时钟树设计,详细介绍了BUFG、BUFMR等关键组件的应用场景和优化策略。通过对比SRCC与MRCC的驱动范围及适用场景,提供低抖动时钟布线技巧和时钟域交叉(CDC)设计方法,帮助工程师构建高性能FPGA时钟系统。

weixin_29191081的博客 1484

蓝牙----蓝牙协议栈L2CAP

蓝牙协议栈L2CAP--逻辑链路控制与适配层协议

qq_43306777的博客 1785

Vue3实战:从零构建ElementPlus后台管理系统全流程

本文详细介绍了从零开始使用Vue3和ElementPlus构建后台管理系统的全流程。内容涵盖环境准备、项目初始化、Vite配置、SCSS样式体系搭建、ElementPlus组件库引入与配置,以及封装可复用的SvgIcon组件进行图标管理,旨在帮助开发者快速搭建现代化、可维护的中后台应用。

weixin_29011239的博客 160

系统性简述BLE蓝牙

这里写自定义目录标题蓝牙简介蓝牙分类蓝牙技术蓝牙协议框架BLE协议栈框架ATT协议ATT协议分层新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 蓝牙简介 蓝牙因为历史问题,分类太多太杂,这里主要讲BLE蓝牙(毕竟现在BLE

盜版摩羯 6350

Nsight Compute内存图表实战:如何快速定位CUDA内核的内存瓶颈(附配置截图)

本文详细介绍了如何使用Nsight Compute的Memory Chart功能快速定位和诊断CUDA内核中的内存性能瓶颈。通过解析内存图表中的逻辑与物理单元节点、连线颜色含义,并结合实战案例(如低L1缓存命中率、共享内存Bank冲突、全局内存访问未合并),指导开发者从可视化数据回溯至源代码,进行精准有效的内存访问优化,从而提升GPU程序性能。

zeta9的博客 479

基于线性约束最小方差准则(LCMV)的自适应波束形成算法的matlab仿真

波束形成(BeamForming)通过对多路麦克风(常为多路全向麦)信号进行合并,抑制非目标方向信号,增强目标方向信号;进而能够实现对特定方向的聚焦拾音,能够有效提高接收信号的信噪比,也有起到降噪的作用。基本原理是波的干涉:通过调整不同阵列单元信号之间的参数,使得某些角度的信号增强,而另一些角度的信号相互抵消,例如下图中来自±45°的输入信号未被增强,而在0度方向的输入信号同相位叠加后被增强。为了将窄带波束形成扩展至宽带,可以使用频域LCMV波束形成器。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 763

BLE学习

协议栈解析 对开发者来说,很简单,他只需要调用send(0x53) GATT层定义数据的类型和分组,方便起见,我们用0x0013表示电量这种数据类型,这样GATT层把数据打包成130053(小端模式!) ATT层用来选择具体的通信命令,比如读/写/notify/indicate等,这里选择notify命令0x1B,这样数据包变成了:1B130053 L2CAP用来指定conn...

weixin_30951743的博客 367

Neo4j LLM知识图谱构建器使用教程

是一个开源应用程序,旨在将非结构化数据(如PDF、文档、文本、YouTube视频、网页等)转换为存储在Neo4j中的知识图谱。该项目利用大型语言模型(如OpenAI、Gemini等)从文本中提取节点、关系及其属性,并通过Langchain框架创建结构化的知识图谱。

u013250861的博客 541

认识BLE 5协议栈 —— 通用访问规范层

认识BLE 5协议栈 —— 通用访问规范层 2017-04-20byisyq 通用访问规范GAP(Generic Access Profile)是BLE设备内部功能对外的接口层,它规定了三个方面:GAP角色、模式和规程、安全问题。 GAP层将设备分为四种角色,分别是外围设备,中央设备,播报设备和观察设备。这些设备围绕着广播和连接的差异性而区分,外围设备和播报设备对外发出广播数据,中央设备和观察设备扫描外部广播数据,播报设备和观察设备通常不建立连接,而外围设备和中央设备可以建立连接。 围绕着广播和..

tao_tao_tao的博客 764

倍福EL6002实现RS232自由口通信,以称重模块RS232数据接收为例

RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。弄完了,再将CTS设置为1,让A发数据。

weixin_41883890的博客 1725

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【全志T113-S3_100ask】——什么是BLE?

蓝牙是一种短距离的通讯技术,可以实现固定设备和移动设备之间进行数据交换。传统蓝牙:蓝牙3.0之前;低功耗蓝牙:蓝牙4.0规下。

weixin_53532647的博客 667

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

详解BLE 空中包格式—兼BLE Link layer协议解析

BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题。 虽然BLE空中包(packet)涉及BLE协议栈link layer,L2CAP,SMP和ATT等各层次,但link layer跟空中包格式关系最紧密,掌握了BLE packet的格式,就很容易理解BLE link lay...

iini01的博客 3319

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

BLE低功耗蓝牙协议栈结构

Controller实现射频相关的模拟和数字部分,完成最基本的数据发送和接收,Controller对外接口是天线,对内接口是主机控制器接口HCI(Hostcontrollerinterface);控制器包含物理层PHY(physicallayer),链路层LL(linkerlayer),直接测试模式DTM(DirectTestmode)以及主机控制器接口HCI。...

北冥有渔的博客 969

详解BLE空口包格式—兼BLE Link layer协议解析

详解BLE空口包格式—兼BLE Link layer协议解析 BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题。 虽然BLE空口包(packet,又称air interface packet)涉及BLE协议栈link layer,L2CAP,SMP和ATT等各层次,但link layer跟空口包格式关系最紧密,掌握了BLE packet的格式,就很容易理解BLE link .

二进制模----细微行动改变影响世界 1475

BLE 5协议栈-通用访问规范层(GAP)

文章转载自:http://www.sunyouqun.com/2017/04/ 通用访问规范GAP(Generic Access Profile)是BLE设备内部功能对外的接口层,它规定了三个方面:GAP角色、模式和规程、安全问题。 GAP层将设备分为四种角色,分别是外围设备,中央设备,播报设备和观察设备。这些设备围绕着广播和连接的差异性而区分,外围设备和播报设备对外发出广播数据,中央设备和观...

weixin_30756499的博客 391
上一篇: BLE协议栈 – HCI
下一篇: BLE协议栈 – SM
iizQ
博客等级 码龄11年 40粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值