文章转载自:http://www.sunyouqun.com/2017/04/page/2/

逻辑链路控制与适配协议通常简称为L2CAP(Logical Link Control and Adaptation Protocol),它向上连接应用层,向下连接控制器层,发挥主机与控制器之间的适配器的作用,使上层应用操作无需关心控制器的数据处理细节。

经典蓝牙的L2CAP层比较复杂,它实现了协议复用、数据分段与重组、封装调度等操作,使得主机能够支持LE和BR/EDR不同的控制器,实现音频数据流传输等高级功能。

BLE的L2CAP层是经典蓝牙L2CAP层的简化版本,它在基础模式下,不执行分段和重组,不涉及流程控制和重传机制,仅使用固定信道进行通信,在LE令牌流程控制模式下,实现了流程控制,执行数据分段和重组,使用动态信道进行通信。

1. 功能

完整的L2CAP层的功能模块分解图如下所示:

L2CAP层包括两个功能模块:资源管理器和信道管理器。

L2CAP层向下连接控制器的HCI接口,向上对应用层暴露数据收发接口。

应用层发送给L2CAP层的数据称为SDU(Service Data Unit),SDU可能是属性协议层的读写数据,也可能是链接配置命令,也可能是配对绑定数据。

SDU在资源管理器中添加L2CAP协议头信息,封装成L2CAP数据包,简称PDU(Protocol Data Unit)。PDU的Payload字段就包含了SDU或SDU的一部分。

通常HCI接口无法发送较长数据包,需要对PDU进行分解(Fragmentation),变成数据碎片(Fragment)再依次发送到控制器。PDU总是包含完整的L2CAP协议头,而数据碎片则不是完整的L2CAP数据包。

如果资源管理器中采用了流程控制或重传机制,则可以实现传输很长的数据包,理论上长度最大可以达到65535个字节。一个很长的SDU,需要先进行分段(Segmentation),分成一个个短小的数据片段,然后再分别添加协议头封装成对应的PDU。

L2CAP协议给出两个数据包长度参数以指导分段和分解操作:MTU和MPS。

MTU(Maximum Transmission Unit)表示L2CAP层的最大可传输单元,该参数限制了应用层与L2CAP层之间传输数据的最大长度,即最大的SDU长度。经典蓝牙默认MTU值为672字节,BLE默认MTU值为23字节,意味着BLE的应用层发送给L2CAP层的数据包长度最大为23字节,超过该长度的数据包将会触发错误处理机制。

MPS(Maximum PDU payload Size)表示L2CAP层PDU的Payload最大长度,该参数限制了单个PDU的长度。分段操作时,每个段的最大长度等于MPS。

显然,L2CAP层中MPS值小于等于MTU值。两个设备建立连接时,会交换MTU和MPS信息,取最小值作为有效值进行工作。

下图为经典蓝牙的分段和分解过程示意图:

SDU进入L2CAP层,先进行分段操作,对各PDU再执行分解操作变成数据片段传入HCI层。注意到,分解操作实际上是在HCI层执行。

信道管理器负责将不同协议的数据分派到合适的信道中。

2. 信道ID

信道ID(Channel ID)简称CID,用一个2字节数表示L2CAP层的一个逻辑信道。

逻辑信道与真实信道不同,真实信道是指无线通信的频道,不同信道的频率不同,逻辑信道是指某个协议所占用的通道,不同协议使用不同的信道,它与射频频率无关,所以称为逻辑信道。不同的逻辑信道在控制器中可能使用相同的物理信道。

在不产生混淆的情况下,这里将L2CAP层的逻辑信道简称为信道。

L2CAP层拥有两种信道,固定信道和动态信道。两端设备一旦建立连接,固定信道即可使用而无需额外配置,建立动态信道则需要首先执行配置过程。BLE仅在收发数据时候与对端设备连接,适合使用固定信道。

0x0001-0x003F部分是固定信道,0x0040之后信道是动态信道。

BLE所使用的信道如下:

CID 描述 信道类型
0x0004 属性协议信道 固定信道
0x0005 LE信令信道 固定信道
0x0006 安全管理协议信道 固定信道
0x0020-0x003E 官方编号(Assigned Number)信道 固定信道
0x0040-0x007F 基于令牌连接机制的通信信道 动态信道

0x0004属性协议信道用于收发属性协议层的数据,也就是BLE应用层通信所传输的数据。

0x0005信令(Signaling Command)信道用于处理应用层发送的命令。

0x0006安全管理协议信道用于处理加密、配对和绑定等相关数据。

0x0020-0x003E官方编码信道没有明确指明如何使用。官方编码是指包括UUID、BD_ADDR、Comany_ID等一些列已经授权过的数字串。

0x0040-0x007F令牌连接的通信信道是动态信道,它专用于LE令牌流程控制工作模式。

注意到,广播数据不适用于任何一个L2CAP信道,事实上广播数据将从应用层直接发送到HCI接口。

3. 工作模式

L2CAP层有多种工作模式:

工作模式 适用范围
基础L2CAP模式 Classic, LE
流程控制模式 Classic
重传模式 Classic
增强型重传模式 Classic
数据流模式 Classic
LE令牌流程控制模式 LE

基础模式为默认工作模式,L2CAP层不执行流程控制,对数据不执行分段和重组操作,其他五种模式均使用了流程控制或重传机制,需要执行分段和重组操作。在L2CAP层配置阶段,会设置参数是否使用流程控制和重传机制,如果不使用则使用基础模式,否则按参数配置情况使用其他模式。

不同的工作模式,其数据帧格式略有不同。

3.1 基础模式

L2CAP层基础模式分为面向连接和面向无连接两类子模式,其中面向无连接仅应用于经典蓝牙的一对多通信场景。

面向连接的基础模式的数据帧称为B-Frame(Basic Frame),其PDU格式如下:

其中前四个字节表示基础L2CAP协议头,后面的信息载荷包字段含应用层发送的数据。

协议头中的长度信息,表示信息载荷的有效长度,它的取值范围为0-65535字节,即信息载荷理论最大长度为65535个字节。

而实际上信息载荷的长度受限于MTU值,当MTU=23,载荷最大长度为23字节,此时PDU总长度为23 + 4 = 27字节。

L2CAP工作在基础模式时,仅使用固定信道进行通信,不对SDU进行分段和重组,应用层传输的数据长度被MTU严格限制,此时MPS等于MTU。

3.2 LE令牌流程控制模式

LE令牌流程控制模式实现了流程控制,以一个令牌参数作为流程控制依据。

LE令牌流程控制模式下的数据帧称为LE-Frame(LE Information Frame),其PDU格式如下:

相比于基础模式,该模式增加了一个2字节的L2CAP SDU Length字段。该字段记录了SDU的总长度,在分段过程中,第一个LE-Frame将包含该字段,在后续LE-Frame中不包含该字段。

LE-Frame的载荷长度不能超过MPS值,且MPS值小于等于MTU值。

L2CAP工作在LE令牌流程控制模式时,将使用动态信道,主机使用LE Credit Based Connection Request信令作为连接请求,该信令中包含了一个令牌初值,从机返回LE Credit Based Connection Response信令。

建立连接以后,两端设备每发送一个LE-Frame,令牌值都将被减1。这意味着令牌初值代表该连接能够发送的LE-Frame总数,比如令牌Credit=100,意味着两端设备最多只能发送100个数据帧,超过后将断开连接。

为了发送更多数据帧,设备需要发送LE Flow Control Credit信令以申请一个新的令牌值,新的令牌值包含在该信令参数中。

令牌值的有效范围是0-65535。

LE令牌流程控制模式下的分段与重组与上文介绍的经典蓝牙分段重组操作类似,如下图所示(参考):

建立连接时交换MTU和MPS值,获得有效值MTU=300和MPS=50,此时应用层最大数据包长度必须小于300,假如主机发送210字节数据包,将在L2CAP层被分成5个PDU,第一个PDU中包含L2CAP SDU Length,Payload长度为48,第二至第四个PDU中不包含L2CAP SDU Length,Payload长度为50,第五个PDU中不包含L2CAP SDU Length,Payload长度为12。

4. 信令

信令(Signaling Command)指L2CAP层执行的信号命令。

信令包也属于L2CAP数据包,信令内容含于数据包的信息载荷中,不同的信令将驱动L2CAP执行特定的任务。传输信令包使用信令信道,所以协议头的CID等于0x0005。

信令包的格式如下:

编码(Code)字段用于区分不同的信令。

识别码(Identifier)字段用于两端设备收发数据时识别对应的请求与响应,一个请求对应的响应数据应该具有相同的识别啊,不同的请求对应不同的识别码。

BLE设备共支持8个信令,如下:

Code 信令 描述
0x01 Command reject 拒绝一个无效的L2CAP命令,参数中包含了拒绝的原因
0x06 Disconnection request 断开连接请求
0x07 Disconnection response 断开连接响应
0x12 Connection Parameter Update request 更新连接参数请求
0x13 Connection Parameter Update response 更新连接参数响应
0x14 LE Credit Based Connection request LE令牌连接请求,参数中包含了MTU, MPS和PSM(Protocol Service Multiplexer) 参数,其中PSM用于分配动态信道。
0x15 LE Credit Based Connection response LE令牌连接响应
0x16 LE Flow Control Credit 申请新的流程控制令牌

5. 参考

关于LE令牌流程控制模式,参考了以下文章:

http://blog.csdn.net/wendell_gong/article/details/54956499

https://community.nxp.com/thread/366041

https://devzone.nordicsemi.com/question/60552/l2cap-oriented-connection/

(完)

BLE 5协议栈-逻辑链路控制与适配协议层(L2CAP)的更多相关文章

  1. 蓝牙—逻辑链路控制和适配协议(L2CAP)

    L2CAP(Logical Link Control and Adaption Protocol),链路控制和适配协议,位于基带层之上,将基带层的数据分组交换以便于高层应用的数据分组格式,并提供复用和 ...

  2. BLE 5协议栈-属性协议层(ATT)

    文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 属性协议(Attribute Protocol)简称ATT. ATT层定义了属性实体的概念,包括UUID. ...

  3. 蓝牙BLE: ATT协议层中属性(Attribute)

    ATT(Attribute Protocol)属性层是GATT和GAP的基础,它定义了BLE协议栈上层的数据结构和组织方式. 属性(Attribute)概念是ATT层的核心,ATT层定义了属性的内容, ...

  4. BLE 5协议栈-主机控制接口(HCI)

    文章参考自:http://www.sunyouqun.com/2017/04/page/3/ .https://www.cnblogs.com/yuqilihualuo/p/9790164.html ...

  5. 2、LwIP协议栈规范翻译——协议层

    2.协议层 TCP/IP套件中的协议是以层次的方式设计的,其中每个协议层解决了通信问题的单独部分.这种分层可以用作设计协议实现的指南,因为每个协议可以与另一个分开实现.然而,以严格分层的方式实现协议可 ...

  6. 大型网站的 HTTPS 实践(四)——协议层以外的实践

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt390 1 前言 网上介绍 https 的文章并不多,更鲜有分享在大型互联网站 ...

  7. USB 3.0规范中译本 第8章 协议层

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 协议层管理设备及其主机之间端到端的数据流.这一层建立在链路层提供对某些类型的包的保证传输(guarantee ...

  8. TCPIP网络协议层对应的RFC文档

    原文地址:TCPIP网络协议层对应的RFC文档作者:西木 RFC - Request For Comments 请求注解 TCP/IP层 网络协议 RFC文档 Physical Layer Data ...

  9. [转] TCPIP 网络协议层对应的RFC文档

    TCPIP网络协议层对应的RFC文档 RFC - Request For Comments 请求注解 TCP/IP层 网络协议 RFC文档 Physical Layer Data Link Layer ...

随机推荐

  1. sysctl 命令

    sysctl命令 被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中.它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性 ...

  2. Java中验证编码格式的一种方法

    package forlittlecatty; import java.io.File; import java.io.FileInputStream; import java.io.IOExcept ...

  3. Dell 12V/18A电源适配器接口改造

    手头有几个航模用的充电器,原来一直用实验室电源,不方便移动,为了便携省地方,就想配个合适的电源.在网上找了下,航模专用的适配器价格太高,国产的杂牌适配器功率虚标严重并且可靠性是个问题,工业用的电源基本 ...

  4. JAVA是否适合非科班者自学入行?石油工程专业从培训到JAVA入门自学亲身经历

    如今的我已经过了三十而立的年纪,虽然在三十岁我没有立下任何事业,相反,还在茫茫苦海中挣扎. 但是我并不是没有收获.当然,曾经在我拥有大好青春年华的时候选择了迷茫,以至于当我有所明悟的时候,却已经错过了 ...

  5. django 之(一) --- DjangoRestFormwork

    接口概念 IOP:面向接口编程,不再关注具体的实现:只关注输入.输出. http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practice ...

  6. c++学习笔记之引用

    引用是 C++ 的新增内容,在实际开发中会经常使用:C++ 用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用,有时候甚至是不可或缺的. 同指针一样,引用能够减少数据的拷贝,提高数据的传递效 ...

  7. Symfony4框架中单元测试和接口测试中的一些小坑

    前提说明: symfony 版本 4.1.*,使用  composer create-project symfony/website-skeleton  进行安装. 目标:在一个单元测试用例中对当前工 ...

  8. X-UA-Compatibles

    今天在看京东网页代码的时候,发现了X-UA-Compatibles 这个元信息属性,不是很清楚,百度了一下,做下记录 X-UA-Compatible 属性是 IE 浏览器在 IE8 版本开始提供的一个 ...

  9. Spring 注解介绍

    @Component与@Bean的区别 @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean. @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注 ...

  10. SQL注入之DVWA平台测试mysql注入

    今天主要针对mysql常用注入语句进行测试. 测试环境与工具: 测试平台:DVWA,下载地址:http://down.51cto.com/data/875088,也可下载metaspolit-tabl ...