逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)

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

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

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

1、基础术语讲解

    在开篇的时候主要介绍一些和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信息,取最小值作为有效值进行工作。

2、接收发送的数据类型

     L2CAP在整个蓝牙协议的数据流传输如图所示;

                                                               逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第1张图片

  LL2CAP接收upper layer的数据主要包括

  属性消息(attribute):属性协议信道用于收发属性协议层的数据,也就是BLE应用层通信所传输的数据。

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

  安全管理消息(security):安全管理协议信道用于处理加密、配对和绑定等相关数据。

  LE 令牌包(LE CREDIT) :可用于分段传输的报文;

3、信道

                                                                 逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第2张图片

    上图是BLE整个空口包的组成 其中LLCAP的PDU包含PUD Header以及PDU Payload两部分

                                                                      逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第3张图片  

    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层;

4、模式 

   对于BLE得LLCAP层而言分为两种模式:基础模式、令牌流程控制模式;

4.1基础模式

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

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

                  逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第4张图片

    基础模式下MTU=MPS,从上层来的SDU报文不会经历分段重组过程,这种模式下得报文得CID只能是固定通道得CID;

    综上所述、ATT报文、信令包、安全包一定不会被分段(但是可以在HCI层被分解);

4.2LE令牌流程控制模式

    基于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格式如下:

 

    逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第5张图片

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

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

             逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第6张图片

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

   下图为建立令牌流程控制的流程

 

                                               逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第7张图片

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

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

5、信令

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

信令包数据格式如下:

                                       逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第8张图片

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为同一个值。

6、分解(fragment)

    分解的这个动作一般在hci层去做,这里说明一下概念为了让读者不混淆分段和分解的概念,分解过程中不会把每个小包加上LL2CAP Header信息,下图时分解流程具体细节江在HCI章节讲解;

                    逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)_第9张图片                   

 

 

 

 

     

你可能感兴趣的:(BLE)