逻辑链路控制与适配协议通常简称为L2CAP(Logical Link Control and Adaptation Protocol),它向上连接host,向下连接controller,起到host与controller之间适配的作用,使上层应用操作无需关心控制器的数据处理细节。
经典蓝牙的L2CAP层比较复杂,它实现了协议复用、数据分段与重组、封装调度等操作,使得主机能够支持LE和BR/EDR不同的控制器,实现音频数据流传输等高级功能。
BLE的L2CAP层是经典蓝牙L2CAP层的简化版本,它在基础模式下,不执行分段和重组,不涉及流程控制和重传机制,仅使用固定信道进行通信,在LE令牌流程控制模式下,实现了流程控制,执行数据分段和重组,使用动态信道进行通信。
在开篇的时候主要介绍一些和LLCAP层有关的基础专业术语
名称 |
描述 |
SDU |
Service Data Unit:应用层发送给LLCAP层的数据,包括属性的读写数据,安全数据,信令等等,不包含LLCAP生成的任何协议数据;
|
Segment
|
分段:将来自上层的SDU数据分割成不同的小数据段 |
Reassembly
|
重组:与分段对应的相反过程 |
PDU
|
协议数据单元:这里指代LLCAP传给下层的数据单元 |
Fragment
|
分解:这个一般作用在HCI层,HCI层有自己的传输限制,PDU大小超过传输限制时PUD被分解成不同的小包 |
Recombination
|
合并:与分解对应的相反过程 |
MTU |
上层能够发送传給LLCAP层单元数据最大有效数据长度,以字节为单位,即SDU对应的最大长度为MTU |
MPS |
L2CAP能够发送给下层单元数据最大有效数据长度,以字节为单位,即PDU对应的最大长度为MPS |
应用层发送给L2CAP层的数据称为SDU(Service Data Unit),包括属性的读写数据,安全数据,信令等等,不包含LLCAP生成的任何协议数据;
LLCAP将接收到的SDU报文添加协议头信心封装成LL2CAP数据包,这就是PUD;
一定不要将分解(fragment)与分段(segment)混淆,分段是将SDU拆分成很多个PUD其中PUD含有LLCAP的协议头信息,分解是因为HCI层的限制将PUD拆分成很多个小包只有第一个小包包含LLCAP的协议头信息;
MTU表示上层传输给LLCAP的最大数据长度,这个长度是为了限制上层与LLCAP之间的传输长度,即最大SDU长度,BLE默认的MTU为23字节(可以修改);
MPS表示LLCAP传输给下层的最大数据长度,这个长度是为了限制LLCAO与下层的传输长度,一个很长的SDU来到LLCAP层要现根据MPS的大小拆分成很多个数据包;很显然MTU一定是大于等于MPS的
SDU在资源管理器中添加L2CAP协议头信息,封装成L2CAP数据包,简称PDU(Protocol Data Unit)。PDU的Payload字段就包含了SDU或SDU的一部分。
显然,L2CAP层中MPS值小于等于MTU值。两个设备建立连接时,会交换MTU和MPS信息,取最小值作为有效值进行工作。
L2CAP在整个蓝牙协议的数据流传输如图所示;
LL2CAP接收upper layer的数据主要包括
属性消息(attribute):属性协议信道用于收发属性协议层的数据,也就是BLE应用层通信所传输的数据。
信令(Signaling Command):信道用于处理应用层发送的命令。
安全管理消息(security):安全管理协议信道用于处理加密、配对和绑定等相关数据。
LE 令牌包(LE CREDIT) :可用于分段传输的报文;
上图是BLE整个空口包的组成 其中LLCAP的PDU包含PUD Header以及PDU Payload两部分
Length为PDU Payload的长度两个字节,
信道ID(Channel ID)简称CID,用一个2字节数表示L2CAP层的一个逻辑信道。
在这里信道不是我们常常会说的通信信道,在BLE的使用以及开发过程中,我们所谓的信道其实是不同频率的物理频道,就是PYH的通信信道,但这里所说的信道不是这个意思,这里的信道只得是被哪个协议占用得通道,不同得协议使用不同得信道方便程序解析,这里千万不要混淆
不同频段得信道我们叫做物理信道,这里得信道我们称之为逻辑信道,物理信道对应着物理连接得概念,逻辑信道对应着逻辑连接得概念;
L2CAP层拥有两种信道,固定信道和动态信道。两端设备一旦建立连接,固定信道即可使用而无需额外配置,建立动态信道则需要首先执行配置过程。BLE仅在收发数据时候与对端设备连接,适合使用固定信道。
0x0001-0x003F部分是固定信道,0x0040之后信道是动态信道。BLE得固定信道0x0004、0x0005、0x0006;
CID | 描述 | 信道类型 |
---|---|---|
0x0004 | 属性协议信道 | 固定信道 |
0x0005 | LE信令信道 | 固定信道 |
0x0006 | 安全管理协议信道 | 固定信道 |
0x0040-0x007F | 基于令牌连接机制的通信信道 | 动态信道 |
0x0004属性协议信道用于收发属性协议层的数据,也就是BLE应用层通信所传输的数据。
0x0005信令(Signaling Command)信道用于处理应用层发送的命令。
0x0006安全管理协议信道用于处理加密、配对和绑定等相关数据。
0x0040-0x007F令牌连接的通信信道是动态信道,它专用于LE令牌流程控制工作模式。
注意到,广播数据不适用于任何一个L2CAP信道,事实上广播数据将从应用层直通过COMMAND直接发送到HCI接口、广播并不经过LLCAP层;
对于BLE得LLCAP层而言分为两种模式:基础模式、令牌流程控制模式;
L2CAP层基础模式分为面向连接和面向无连接两类子模式,其中面向无连接仅应用于经典蓝牙的一对多通信场景。
面向连接的基础模式的数据帧称为B-Frame(Basic Frame),其PDU格式如下
基础模式下MTU=MPS,从上层来的SDU报文不会经历分段重组过程,这种模式下得报文得CID只能是固定通道得CID;
综上所述、ATT报文、信令包、安全包一定不会被分段(但是可以在HCI层被分解);
基于LE 令牌流程控制模式的连接,也称为面向连接通道(connection Oriented Channel, COC),是一种允许LE的L2CAP特性
在特定链路上为数据交换创建专用通道的服务。
为什么要存在令牌包流程控制模式?
一开始的蓝牙应用都是基于GATT协议来实现的,蓝牙的定位就是智能家居、智能穿戴的一些应用场景ATT属性协议适合端数据传输的协议、温度、心率之类的数据几十字节,显然已经就足够了,
但是我们有OTA固件升级需求时使用GATT协议完成大量数据的传输显然效率有点低、就算使用ATT write command 其中报文作为传输流程,报文中不仅包含LL2CAP header的内容还冗余了ATT协议的参数信息,显然浪费带宽
所以令牌包流程控制模式应运而生,他不依赖任何特定协议,在两个设备之间创建单独的通道用来传输报文
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信令以申请一个新的令牌值,新的令牌值包含在该信令参数中;
信令包也属于L2CAP数据包,信令内容含于数据包的信息载荷中,不同的信令将驱动L2CAP执行特定的任务。传输信令包使用信令信道,所以协议头的CID等于0x0005。
信令包数据格式如下:
Code表示是哪一个命令/响应;
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 | 申请新的流程控制令牌 |
有3类数据:
a. 命令:Command
b. 命令拒绝:Command Reject
c. 响应:Respons
Identifier用来匹配一发一收的数据:设备A发送command时会设置Identifier,设备B响应时也要设置Identifier为同一个值。
分解的这个动作一般在hci层去做,这里说明一下概念为了让读者不混淆分段和分解的概念,分解过程中不会把每个小包加上LL2CAP Header信息,下图时分解流程具体细节江在HCI章节讲解;