四 蓝牙低功耗(BLE)协议栈 之 L2CAP层

一 介绍

L2CAP(逻辑链路控制和适配协议层)是一个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割、数据重组、通道多路复用、通道流量控制和错误检测,使得较大的报文可以在底层无线电中传输。L2CAP层提供逻辑通道,即L2CAP通道,这些通道在一条或多条逻辑链路上复用。在经典蓝牙无线电中,L2CAP层提供的功能比这更多,也更为复杂。

在这里插入图片描述
通道管理器(Channel Manager)提供一个功能控制的控制面板,并负责所有内部信令、L2CAP点对点信令以及高层和低层的信令。
重传和流控制块(RetransmissionFlow & Control)使用包重传提供每个通道的流控制和错误恢复。
Resource Manager 负责为Channel Manager、Retransmission and Flow Control block 和那些不需要Retransmission and Flow Control 服务的应用数据流提供帧中继服务.
L2CAP负责协调底层接口提供的服务上与多个L2CAP通道相关的数据包的传输和接收。

L2CAP的功能:

  • 协议/通道复用(Protocol/channel multiplexing)

  • 片段和重组(Segmentation and reassembly)
    通过资源管理器提供的帧中继服务,传输帧的长度由运行在 L2CAP 上的各个应用程序控制。 如果 L2CAP 能够控制 PDU 长度,则可以更好地服务于许多多路复用应用程序。 这提供了以下好处:

    • 分段将允许应用程序数据单元的交错以满足延迟要求。
    • 当 L2CAP 控制数据包大小时,内存和缓冲区管理更容易。
    • 可以更有效地通过重传进行纠错。
    • 当 L2CAP PDU 损坏或丢失时被破坏的数据量可以小于应用程序的数据单元。
    • 应用程序与将应用程序数据包映射到较低层数据包所需的分段分离。
  • 每个 L2CAP 通道的流量控制(Flow control per L2CAP channel)

  • 错误控制和重传(Error control and retransmissions)

  • 支持流媒体(Support for Streaming)

  • 分割与重组(Fragmentation and Recombination)
    一些控制器的传输能力可能有限,并且可能需要与 L2CAP 分段创建的片段大小不同的片段大小。因此,L2CAP 下的层可能会进一步对 L2CAP PDU 进行片段化和重组,以创建适合每一层能力的片段。在传输 L2CAP PDU 期间,两个对等设备中可能会发生许多不同级别的分段和重组。

    HCI 驱动程序或控制器可以对 L2CAP PDU 进行分段,以遵守主机控制器接口传输方案的数据包大小限制。这导致 HCI 数据包有效载荷携带 L2CAP PDU 的开始和继续片段。 类似地,控制器可以将 L2CAP PDU 分段以将它们映射到控制器数据包中。 这可能导致控制器数据包负载携带 L2CAP PDU 的开始和继续片段。

    协议栈的每一层可能会传递不同大小的L2CAP PDU分片,并且每一层创建的分片大小在每个对等设备中可能不同。 然而,PDU 在堆栈内被分段,接收 L2CAP 实体仍然重新组合这些分段以获得原始 L2CAP PDU。

  • 服务质量

术语

  • CID, Channel Identifiers, L2CAP通道ID
  • SDU或L2CAP SDU, 来自上层的数据,不包含任何L2CAP层协议字段。
  • Segment or SDU segment,SDU 的一部分,由分割过程产生。 一个 SDU 可以分成一个或多个段
  • PDU or L2CAP PDU, (协议数据单元)Protocol Data Unit,协议数据单元:包含 L2CAP 协议信息字段、控制信息和/或上层信息数据的数据包。PDU 总是由基本 L2CAP 报头开始。 PDU 的类型有:B 帧、I 帧、S 帧、C 帧、G 帧和 LE 帧。
  • B-frame,B帧(Basic information frame)是用于 L2CAP 数据包的基本 L2CAP 模式中的 PDU。 它包含一个完整的 SDU 作为其有效载荷,由基本 L2CAP 标头封装。
  • I-frame,I帧(Information frame),I 帧是在增强重传模式、流模式、重传模式和流控制模式中使用的 PDU。 它包含一个 SDU 段和附加协议信息,由基本 L2CAP 头封装
  • S-frame, S帧(Supervisory frame), S 帧是在增强重传模式、重传模式和流控制模式中使用的 PDU。 它仅包含协议信息,由基本 L2CAP 头封装,不包含 SDU 数据。
  • C-frame, C帧(Control frame), C 帧是包含在两端 L2CAP 实体之间交换L2CAP 信令消息的 PDU。 C 帧专门用于 L2CAP 信令信道。
  • G-frame, G帧(Group frame), G 帧是专用于无连接 L2CAP 通道的 PDU。 它由基本 L2CAP 报头封装,包含 PSM,后跟完整的 SDU。 G 帧可用于通过 Active Broadcast 向活动从设备广播数据或将单播数据发送到单个远程设备
  • K-frame, K 帧是在基于 LE 的流量控制模式中使用的 PDU。 它包含一个 SDU 段和附加协议信息,由基本 L2CAP 报头封装。
  • Fragment, 片段是PDU 的一部分,由分片操作产生。 片段仅用于与底层之间的数据传递。 它们不用于点对点传输。 片段可以是关于 L2CAP PDU 的开始或继续片段。 一个片段不包含PDU以外的任何协议信息; 起始片段和延续片段的区别是由底层协议规定来传输的。
  • Fragmentation,将L2CAP pdu拆分成更小的部分的过程,称为fragments,适合于传送到较低的传输层。尽管在L2CAP层中进行了描述,但碎片实际上可能发生在HCI主机驱动程序中,和/或控制器中,以适应L2CAP PDU传输到HCI数据包或控制器数据包的大小。pdu分片可以应用于所有L2CAP模式。
  • Recombination, 与fragmentation相对应的反向过程,从碎片中重新建立一个L2CAP PDU。在接收路径中,全部或部分重组操作可能发生在控制器和/或主机上,重组的位置不一定对应于发送端发生分片的位置。
  • MTU, 最大传输单元(Maximum Transmission Unit), 上层能够接受的有效载荷数据的最大大小(以字节单位),即 MTU 对应于最大 SDU 大小。
  • MPS, L2CAP可接受最大的payload大小(Maximum PDU payload Size),对应于MTU,在没有分段的情况下,或在基本 L2CAP 模式下,最大传输单元与最大 PDU 有效载荷大小相同,两个配置参数应设置为相同的值。
  • MTU(sig), L2CAP信令MTU大小
信道标识符用法
0x0000保留:不能使用
0x0001经典蓝牙信令信道
0x0002无连接信道
0x0003AMP管理协议
0x0004ATT协议
0x0005BLE信令信道
0x0006安全管理协议
0x0007 ~ 0x003E保留
0x003FAMP测试协议
0x0040 ~ 0xFFFF面向连接信道

低功耗蓝牙一共使用了三条信道,0x0004、0x0005、0x0006

L2CAP的信道可以选择在以下几种模式中的一个运行

  • Basic L2CAP Mode
  • Flow Control Mode
  • Retransmission Mode
  • Enhanced Retransmission Mode
  • Streaming Mode
  • LE Credit Based Flow Control Mode
  • Enhanced Credit Based Flow Control Mode

二 数据包格式

通道代表远端设备中L2CAP实体之间的数据流。通道可以是面向连接的,也可以是无连接的。除了L2CAP无连接通道(CID 0x0002)和两个L2CAP信令通道(CID 0x0001和0x0005)之外的固定通道被认为是面向连接的。所有具有动态分配的cid的通道都是面向连接的。除信息有效载荷字段外,所有L2CAP层数据包字段应使用小端字节顺序。在L2CAP信息负载中封装的上层协议的端序是特定于协议的。
在这里插入图片描述

  • Length 长度字段表示Information payload的长度,不包括L2CAP header, 最大可以到65535字节,该字段用于重组,作为接收端对重组后的 L2CAP 数据包的简单完整性检查。
  • Channel ID,通道 ID (CID) 标识数据包的目标通道端点
  • Information payload,有效数据

三 信令包格式

信令包的格式:
在这里插入图片描述

  • Length: 长度位
  • Channel ID, 信道,经典蓝牙固定使用0x0001,BLE固定使用0x0005

在这里插入图片描述

信令包的名称有一个表示其类型的后缀:_REQ 表示请求,_RSP 表示响应,_IND 表示指示 。

信令包的Information payload格式:
在这里插入图片描述

  • Code,命令标识符,1个字节,用于标识命令的类型。 接收方信令信道上收到带有unknown或disallowed的代码字段的数据包时,将发送 L2CAP_COMMAND_REJECT_RSP 数据包作为响应。
  • Identifier,为请求方设置此标志,回应方回复请求帧的时候需要和请求帧的Identifier一致。
  • Length, data的长度
  • data, 命令数据

在这里插入图片描述

其中0x0005表示是低功耗蓝牙所支持的信令。

  • L2CAP_COMMAND_REJECT_RSP, 命令拒绝,用于拒绝设备收到的不支持的信息包。
    在这里插入图片描述
  • L2CAP_CONNECTION_PARAMETER_UPDATE_REQ, 连接参数更新
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

该命令只能由从设备发出,因为主设备随时都可以启动链路层的连接参数更新请求。主设备收到该REQ之后,使用L2CAP_CONNECTION_PARAMETER_UPDATE_RSP进行回复,可以接受也可以不接受。如果主设备不接受这个连接参数,从设备的选择有两个,一是保持现在的连接参数;二是断开连接。

三 分段和重组

片段化是将 PDU 分解成更小的片段,以便从 L2CAP 传送到下层。 重组是从下层传上来的片段在L2CAP中重组成PDU的过程。 分片和重组可以应用于任何 L2CAP PDU。

3.1 分段

L2CAP实现可以对任何L2CAP PDU进行分片,以便将其发送到较低层。如果L2CAP在没有HCI的情况下直接在Controller上运行,那么一个执行方发是将PDU分割成多个Controller数据包,以便通过空气进行传输。如果L2CAP运行在HCI之上,那么一个执行方法会向控制器发送HCI传输大小的片段。与一个L2CAP PDU相关联的所有L2CAP分片,在处理任何其他进行相同逻辑传输的L2CAP PDU之前,都应由控制器处理以进行传输。
BR/EDR链路控制器能够通过使用“开始”和“延续”指示在片段被转换成基带数据包时对PDU施加不同的片段。因此,L2CAP和BR/EDR Link Controller都使用相同的机制来控制分片的大小。
在这里插入图片描述
在这里插入图片描述

3.2 重组

控制器将尝试按顺序传递数据包,并且不会出错。片段的重组可能发生在控制器中,但最终由 L2CAP 负责重组 PDU 和 SDU 并检查 SDU 的长度字段。当控制器接收到数据包片段时,它会在每个片段到达时向 L2CAP 层发送信号,或者在将数据包传递到 L2CAP 层之前累积多个片段(在接收缓冲区填满或计时器到期之前)。 L2CAP 应使用 L2CAP PDU 报头中的长度字段,作为一致性检查,并应丢弃任何未能匹配长度字段的 L2CAP PDU。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值