BLE 5协议栈-逻辑链路控制与适配协议层(L2CAP)
文章转载自: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)的更多相关文章
- 蓝牙—逻辑链路控制和适配协议(L2CAP)
L2CAP(Logical Link Control and Adaption Protocol),链路控制和适配协议,位于基带层之上,将基带层的数据分组交换以便于高层应用的数据分组格式,并提供复用和 ...
- BLE 5协议栈-属性协议层(ATT)
文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 属性协议(Attribute Protocol)简称ATT. ATT层定义了属性实体的概念,包括UUID. ...
- 蓝牙BLE: ATT协议层中属性(Attribute)
ATT(Attribute Protocol)属性层是GATT和GAP的基础,它定义了BLE协议栈上层的数据结构和组织方式. 属性(Attribute)概念是ATT层的核心,ATT层定义了属性的内容, ...
- BLE 5协议栈-主机控制接口(HCI)
文章参考自:http://www.sunyouqun.com/2017/04/page/3/ .https://www.cnblogs.com/yuqilihualuo/p/9790164.html ...
- 2、LwIP协议栈规范翻译——协议层
2.协议层 TCP/IP套件中的协议是以层次的方式设计的,其中每个协议层解决了通信问题的单独部分.这种分层可以用作设计协议实现的指南,因为每个协议可以与另一个分开实现.然而,以严格分层的方式实现协议可 ...
- 大型网站的 HTTPS 实践(四)——协议层以外的实践
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt390 1 前言 网上介绍 https 的文章并不多,更鲜有分享在大型互联网站 ...
- USB 3.0规范中译本 第8章 协议层
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 协议层管理设备及其主机之间端到端的数据流.这一层建立在链路层提供对某些类型的包的保证传输(guarantee ...
- TCPIP网络协议层对应的RFC文档
原文地址:TCPIP网络协议层对应的RFC文档作者:西木 RFC - Request For Comments 请求注解 TCP/IP层 网络协议 RFC文档 Physical Layer Data ...
- [转] TCPIP 网络协议层对应的RFC文档
TCPIP网络协议层对应的RFC文档 RFC - Request For Comments 请求注解 TCP/IP层 网络协议 RFC文档 Physical Layer Data Link Layer ...
随机推荐
- dataset的find查找功能使用
var record = dataset.find(["status"],[curstatus]); //status指的是dataset中的某个字段,curstatus指的是指定 ...
- 拒绝LOW ---青鸟影院购票系统
1.首先我们需要了解这个软件的功能: 1).影院每天更新放映列表,系统支持实时查看,包括电影放映场次的时间: 2).影院提供三类影票:普通票,学生票和赠票: 3).允许用户查看某场次座位的售出情况: ...
- 【Linux】CentOS7安装mysql5.7
官网下载地址 https://dev.mysql.com/downloads/file/?id=471503 本文所用MySQL版本为5.7.19; 上传包 将mysql-5.7.19-1 ...
- MySQL InnoDB存储引擎大观
转的一篇文章作者:七把刀链接:https://www.jianshu.com/p/d4cc0ea9d097 MySQL InnoDB 引擎现在广为使用,它提供了事务,行锁,日志等一系列特性,本文分析下 ...
- liunx 中如何删除export设置的环境变量
1,网上有资料说,export命令添加的环境变量,利用export -p 删除: 例如:export KUBECONFIG="/etc/kubernetes/admin.conf" ...
- MariaDB基本知识点总结01--介绍+语句
一.概念 1.数据库介绍: 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据 ...
- python手撸桌面计算器
网上有一些许多关于计算器的源码,但我似乎不太care 一直寻思着自己手撸一个才有意思,于是这就开始了 实现功能: 1.基本的两个数 +-x÷ 运算以及取反,百分之,平方等 2.支持连续运算 3.暂不支 ...
- poj1155 TELE (树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...
- Less学习(1)
写在开头的话: 月余前被问起会不会Less,当时就有想学这个css框架的念头,而在昨天,在前端乱炖上看到一篇LessCss的开篇介绍,忽然就有了一股立马去学的冲动,回到家后找了几篇文章看了下,初感觉比 ...
- Springmvc使用注解实现执行定时任务(定时器)
1.在Spring配置文件中添加 <task:annotation-driven/> 2.在需要调用执行定时任务的类中使用注解 @Service @Lazy(false) //避免spri ...