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

个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!

【所有文章汇总】
文章目录
-
-
1、L2CAP介绍
-
2、L2CAP协议架构
-
- 2.1 逻辑信道划分
- 2.2 信道模式
- 2.3 设计思想
-
3、帧结构
-
- 3.1 面向连接信道
- 3.2 无连接数据信道包
-
4、参考文章

-
上篇文章,了解了
HCI传输层的数据包格式,那么在HCI传输层之上,就是Host层了,Host层与硬件关系旧比较少了,其中包含了更多的服务协议,L2CAP就在其中,那么什么是L2CAP协议呢?
1、L2CAP介绍
L2CAP:Logical Link Control and Adaptation Protocol :逻辑连接控制和适配协议,其允许更高层协议和应用,发送和接收数据包,也具备流量控制和重传功能 ,基于这些功能,使得高层协议应用开发人员可以不必了解基层协议而进行开发,其为两个通信的蓝牙设备提供一个端到端的通道。
L2CAP supports higher level protocol multiplexing, packet segmentation and reassembly, and the conveying of quality of service information.
L2CAP所具备的主要功能:
- 协议信道复用(protocol/channel multiplexing) :能够区分高层协议,在信道建立时,协议复用功能用来发送请求来连接正确的上层协议 ;在数据传输时,逻辑信道复用必须能够把用同一个协议的不同几个高层实体的区分出来(一对多情况)。
- 分段与重组(segmentation and reassembly SAR) :高层协议需传输的数据长度不定,L2CAP 层控制了 PDU 的长度,不仅易于管理而且通过对数据标记分组,允许数据单元的交错,可以满足延时要求,发生错误时的重传也可以更加方便准确。
- 每个信道流控(per-channel flow control) :对传输的数据进行流量控制
- 差错控制(error control)
2、L2CAP协议架构

2.1 逻辑信道划分
在了解逻辑信道划分前,先了解以下
CID:Channel Identifier
CID :逻辑链路通道的端点标识,其分配情况如下:
| CID | 说明 |
|---|---|
| 0x0000 | 无效标识 |
| 0x0001 | 发送信令的信道 |
| 0x0002 | 无连接的接收信道 |
| 0x0003-0x003f | 保留(特定功能) |
| 0x0040-0xffff | 动态分配 |
其中的0x0004-0x0005被分配给BLE(低功耗蓝牙) :

如果设备支持BLE功能,0x0005作为其信令通道,0x0004和0x0006也会被强制分配给BLE,分别作为ATT和SecurityManager信道。
CID主要用来区分上层协议,进而保证多协议信道的复用!
2.2 信道模式
逻辑信道有几种操作模式,最后一种是LE设备特有的:
Basic L2CAP Mode((equivalent to L2CAP specification in Bluetooth v1.1)默认模式,在未选择其他模式的情况下,用此模式。Flow Control Mode流控模式,此模式下不会进行重传,但是丢失的数据能够被检测到,并报告丢失。Retransmission Mode重传模式,此模式确保数据包都能成功的传输给对端设备。Enhanced Retransmission Mode增强重传模式,此模式和重传模式类似,加入了Poll-bit等提高恢复效率。Streaming Mode流模式,此模式是为了真实的实时传输,数据包被编号但是不需要ACK确认。设定一个超时定时器,一旦定时器超时就将超时数据冲掉。LE Credit Based Flow Control Mode基于LE信用的流控模式,被用于LE设备通讯。
2.3 设计思想
- 使用链路管理器协议在两单元间建立 ACL 链路。基带提供数据分组的有序传输, 但也可能有个别分组损坏或重复。任两台设备之间只会有一条 ACL 链路。
信道建立在链路的基础上,信道可以有多个,链路只有一条。
- 通过使用基带层提供的机制,L2CAP 提供了一条可靠的信道。当收到请求和重发数据时,基带通常要执行数据完整性校验,直到数据成功确认或发生超时。由于可能会丢失确认报文,所以甚至在数据成功发送后也会发生超时。基带协议使用长度为 1 位的序列号,该序列号用于删除重复发送的分组。由于所有广播的 L2CAP 数据分组的首段都以同一序列位为起始位, 如果需要提供可靠传输,就应禁止使用基带广播分组。
L2CAP 主要对数据进行封装 ,支持协议复用,统一高层协议数据格式。
3、帧结构
L2CAP要想实现信道复用与差错控制,必定也要在数据包前加一些前缀信息,数据格式如下:
3.1 面向连接信道

Length : 2个字节,主要指基本 L2CAP 报文头除长度以外的信息净荷的大小,即图中空白部分,其长度可达65535字节。
Channel ID : 2个字节,用于标识分组的目标信道终端。
Information payload : 静荷信息包含来自上层协议(发出的分组)的净荷或者发送到上层协议(接收的分组)的净荷。 MTU 的值在信道配置时确定。所支持的用于信令分组的 MTU 的最小值为 48 字节。
3.2 无连接数据信道包

协议/服务复用(PSM): 一般为 SDP、RFCOMM、TCS 等中介协议复用。小于 0x1000 的值,0x0001 对应 SDP,0x0003 对应 RFCOMM、0x0005 对应 TCS。主要用于标识何种上层协议。

另外,还有一些不同操作模式的帧格式,这里不作详细介绍。
对于L2CAP我们更多去了解其主要功能有哪些即可,再深究有点本末倒置
下面是抓包的数据,仅供参考 :

最后我们看一下,L2CAP的数据包在协议栈中的位置:

4、参考文章
[1]:
[2]:
[3]:


