Bluetooth L2CAP

如果让我说BT目前最精彩的段落,那我肯定会想到L2CAP。

逻辑链路控制和适配层协议,称为 L2CAP。L2CAP 向具有协议复用能力以及分段和重组操作的上层协议提供面向连接和无连接的数据服务。

L2CAP 允许更高级别的协议和应用程序发送和接收长达 64 KB 的上层数据包(L2CAP 服务数据单元,Service Data Units,SDU)。

L2CAP 还允许按通道进行流量控制和重传。 L2CAP 层提供逻辑通道,称为 L2CAP 通道,它们在一个或多个逻辑链路上复用。

1. Introduction

本篇文章基于基于BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part A。

图 1.1为L2CAP其架构组件。

通道管理器(Channel Manager)提供控制平面功能并负责所有内部信令、L2CAP 点对点信令以及与更高层和更低层的信令。

重传和流控制(Retransmission and Flow Control)模块使用数据包重传提供每个通道的流控制和错误恢复。

资源管理器(Resource Manager)负责向通道管理器、重传和流控制块以及那些不需要重传和流控制服务的应用数据流提供帧中继服务。它负责通过下层接口提供的设施协调与多个 L2CAP 通道相关的数据包的发送和接收。

1.1 features

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

L2CAP 支持在单个控制器和多个控制器上进行多路复用。 L2CAP 通道一次应在一个控制器上运行。

通道建立期间,协议复用能力用于将连接路由到正确的上层协议

对于数据传输,需要逻辑信道复用来区分多个上层实体。可能有多个上层实体使用相同的协议。

(2)Segmentation and reassembly 分段和重组

使用资源管理器提供的帧中继服务,传输帧的长度由运行在 L2CAP 上的各个应用程序控制。如果 L2CAP 可以控制 PDU 长度,则可以更好地服务于许多多路复用应用程序。

(3)Flow control per L2CAP channel 每个 L2CAP 通道的流量控制

控制器为通过空中传输的数据提供错误和流量控制,并且为通过 HCI 传输的数据提供 HCI 流量控制。当多个数据流使用单独的 L2CAP 通道在同一个控制器上运行时,每个通道都需要单独的流量控制。提供了一种基于窗口的流量控制方案。

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

当 L2CAP 通道从一个控制器移动到另一个控制器时,数据可能会丢失。此外,某些应用程序需要的残余错误率远小于某些控制器所能提供的。 L2CAP 提供 L2CAP PDU 的错误检查和重传。

L2CAP 中的错误检查可防止由于控制器错误地接受包含错误但通过基于控制器的完整性检查的数据包而导致的错误。

L2CAP 错误检查和重传还可以防止由于控制器刷新导致的数据包丢失。

错误控制与流量控制一起工作,因为流量控制机制将限制重传以及首次传输。

(5)Support for Streaming 支持流媒体

诸如音频之类的流应用程序会设置一个具有商定数据速率的 L2CAP 通道,并且不希望流控制机制(包括控制器中的机制)来改变数据流。

(6)Fragmentation and Recombination 分割和重组

一些控制器可能具有有限的传输能力,并且可能需要不同于由 L2CAP 分段创建的片段大小。因此,L2CAP 之下的层可以进一步对 L2CAP PDU 进行分段和重组,以创建适合每一层能力的分段。

(7)Quality of Service 服务质量

L2CAP 连接建立过程允许在两个蓝牙设备之间交换有关预期服务质量 (QoS) 的信息。每个 L2CAP 实施都会监控协议使用的资源,并确保遵守 QoS 合同。

(8)不支持的功能

L2CAP 不传输为 SCO 或 eSCO 逻辑传输设计的同步数据。

L2CAP 不支持可靠的广播信道。

2. General Operation

2.1 Channel Identifiers

L2CAP 基于“通道”的概念。 L2CAP 通道的每个端点被称为一个通道标识符(CID)。

每个 ACL-U、ASB-U 和 LE-U 逻辑链路都存在不同的 CID 名称空间。 AMP-U 逻辑链路与其关联的 ACL-U 逻辑链路共享 CID 名称空间。

 0x0040-0xFFFF为动态分配的范围。

2.2 OPERATION BETWEEN DEVICES

图 2.2 说明了 CID 在不同设备中相应对等 L2CAP 实体之间的通信中的使用。

面向连接的数据通道表示两个设备之间的连接,其中 CID 与逻辑链路相结合,标识通道的每个端点。(Tips:这里面向连接的数据通道并不是用于传输同步数据,仅用于建立两个设备的连接)

当用于广播传输时,无连接通道将数据流限制在单一方向。无连接通道可用于使用主动广播将数据传输到所有活动从站。当用于单播传输时,无连接通道可用于主从之间的任一方向。(Tips:关于单播、广播、组播这三个概念,可以参考Unicast, Broadcast, and Multicast)

当两个设备之间建立 ACL-U 逻辑链路时,L2CAP 信令通道 (0x0001) 和所有支持的固定通道立即可用。另一个 CID (0x0002) 保留用于所有传入和传出的无连接数据流量,无论是广播还是单播。一旦在两个设备之间建立了 ACL-U 逻辑链路并且传输设备确定远程设备支持无连接流量,无连接数据流量可能会立即流动。

当在两个设备之间建立 LE-U 逻辑链路时,L2CAP LE 信令通道 (0x0005) 和所有支持的固定通道立即可用。

2.3 OPERATION BETWEEN LAYERS

L2CAP 实现在上层协议和下层协议之间传输数据。 L2CAP 实现还应该准备好接受来自较低层的某些类型的事件并将事件生成到较高层。这些事件如何在层之间传递是特定于实现的。

2.4 MODES OF OPERATION

  • 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

2.5 MAPPING CHANNELS TO LOGICAL LINKS

L2CAP 将通道映射到控制器逻辑链路,后者又在控制器物理链路上运行。本地控制器和远程控制器之间的所有逻辑链路都运行在单个物理链路上。

3. DATA PACKET FORMAT

3.1 CONNECTION-ORIENTED CHANNELS IN BASIC L2CAP MODE

本文主要介绍面向连接的通道上使用的 L2CAP PDU 的格式,其他的请自行参考Core Spec。

图 3.1 说明了在面向连接的通道上使用的 L2CAP PDU 的格式。在基本 L2CAP 模式中,面向连接的信道上的 L2CAP PDU 也称为“B 帧”。

Length:表示信息负载的大小,不包括 L2CAP 头的长度。信息有效载荷的长度最多可达 65535 (2^16-1)。 Length 字段用于重组,并在接收端对重组的 L2CAP 数据包进行简单的完整性检查。 

Channel ID:通道 ID (CID) 标识数据包的目标通道端点。

Information payload:这包含从上层协议接收到的有效载荷(传出数据包),或传递给上层协议的有效载荷(传入数据包)。 

3.2 CONNECTIONLESS DATA CHANNEL IN BASIC L2CAP MODE

 图 3.2 说明了无连接数据通道中的 L2CAP PDU 格式。在这里,L2CAP PDU 也被称为“G-frame”。

如前面2.2节所述,CID (0x0002) 保留用于所有传入和传出的无连接数据流量,无论是广播还是单播。

PSM协议/服务多路复用器的描述见下面的第4章。

3.3 CONNECTION-ORIENTED CHANNEL IN RETRANSMISSION/FLOW CONTROL/STREAMING MODES

为了支持流控制、重传和流传输,除了基本 L2CAP 报头之外,还定义了具有协议元素的 L2CAP PDU 类型。

信息帧(I 帧)用于 L2CAP 实体之间的信息传输。监督帧(S 帧)用于确认 I 帧并请求重传 I 帧。

3.4 CONNECTION-ORIENTED CHANNELS IN LE CREDIT BASED FLOW CONTROL MODE AND ENHANCED CREDIT BASED FLOW CONTROL MODE

为了支持基于 LE 基于信用的流控制模式和增强的基于信用的流控制模式,除了基本 L2CAP 报头之外,还定义了具有协议元素的 L2CAP PDU 类型。在这两种模式下,面向连接的信道上的 L2CAP PDU 是一个 Credit-based frame(K-frame)。

4. SIGNALING PACKET FORMATS

4.1 L2CAP_CONNECTION_REQ (CODE 0x02)

本文仅展示发送 L2CAP_CONNECTION_REQ 数据包的格式,其他的请自行参考Core Spec。

发送 L2CAP_CONNECTION_REQ 数据包以在两个设备之间创建 L2CAP 通道。 L2CAP 通道应在配置开始之前建立。图 4.4 定义了数据包的格式。

 Protocol/Service Multiplexer - PSM:PSM 字段的长度至少为两个八位字节。

所有 PSM 值的最高有效八位字节的最低有效位等于 0,所有其他八位字节的最低有效位等于 1。这意味着所有 PSM 都是奇数,并且可以通过搜索第一个偶八位字节轻松找到 PSM 的结尾。

PSM 值分为两个范围。第一个范围内的有效值由蓝牙 SIG 分配并指示协议。第二个值范围是动态分配的,并与服务发现协议 (SDP) 一起使用。

参考Assigned Numbers | Bluetooth® Technology Website中Logical Link Control中内容。

 Source CID-SCID:源 CID 长度为两个八位字节,表示发送请求的设备上的通道端点。一旦配置了通道,流向请求发送者的数据包将被发送到该 CID。因此,Source CID 表示发送请求和接收响应的设备上的通道端点。SCID 的值应来自表 2.1 中定义的动态分配范围,并且不应已分配给发送请求的设备上的不同通道。

4.2 Others

5. CONFIGURATION PARAMETER OPTIONS

Option是一种扩展配置参数的机制。选项应作为包含选项类型、选项长度和一个或多个选项数据字段的信息元素传输。图 5.1 说明了一个选项的格式。

Option Type:选项类型字段定义正在配置的参数。如果该选项未被识别(例如,因为该选项是在比实现符合的版本更高的规范版本中定义的),则:

  • 如果类型的最高有效位为 0(即类型 0x00 到 0x7F),则接收方应拒绝整个配置请求;
  • 如果类型的最高有效位是 1(即类型 0x80 到 0xFF),接收方应忽略该选项并继续处理下一个选项(如果有)。

Option Length :Option Length字段定义选项数据中的八位字节数。因此,没有选项数据的选项类型的长度为 0。

Option data:该字段的内容取决于Option Type。

针对不同的Type,有以下几种分类:

5.1 MAXIMUM TRANSMISSION UNIT (MTU)

此选项指定此选项的发送方能够接受的通道的最大 SDU 大小。类型为 0x01,有效载荷长度为 2 个八位字节,携带两个八位字节的 MTU 大小值作为唯一的Information Payload(见图 5.2)。

与 B 帧长度字段不同,I 帧长度字段可能大于配置的 MTU,因为它包括控制八位字节长度、L2CAP SDU 长度(如果存在)和帧校验序列字段以及信息八位字节。

默认 MTU 是根据两个基带 DH5 数据包(2*341=682 个八位字节)减去基带 ACL 标头(2*2=4 个八位字节)和一个 6 个八位字节的 L2CAP 标头所承载的负载来选择的。 L2CAP 标头长度为 4 个八位字节,但由于历史原因,使用了 6 个字节的 L2CAP 标头长度。

5.2 FLUSH TIMEOUT OPTION

此选项用于通知收件人发送者将要使用的刷新超时。如果使用了扩展流规范选项,则不应使用该选项。类型为 0x02,有效载荷大小为 2 个八位字节(参见图 5.3)。

刷新超时选项是可以协商的。如果远程设备对该选项返回否定响应并且本地设备不能接受建议的值,则它应通过发送具有原始值的新请求来继续配置过程,或者断开通道。

刷新超时适用于同一 ACL 逻辑传输上的所有通道,但可以通过 HCI ACL 数据包中的Packet_Boundary_Flag 将各个 L2CAP 数据包标记为不可自动刷新,逐个数据包覆盖。

5.3 QUALITY OF SERVICE (QOS) OPTION

 如果没有协商 QoS 配置参数,则链路应采用默认参数。 QoS 选项是类型 0x03。如果使用了扩展流规范选项,则不应使用该选项。 QoS 选项是可协商的。

L2CAP 实现只需要支持“尽力而为”服务,对任何其他服务类型的支持是可选的。 Best Effort 不需要任何保证。如果请求中没有放置 QoS 选项,则应假定尽力而为。如果需要任何 QoS 保证,则应发送 QoS 配置请求。

5.4 RETRANSMISSION AND FLOW CONTROL OPTION

此选项指定是否使用重传和流量控制。

5.5 FRAME CHECK SEQUENCE (FCS) OPTION

此选项用于指定将包含在发送的 S/I 帧中的帧校验序列 (FCS) 的类型。这是不可协商的。 FCS 选项应仅在模式正在或已配置为增强重传模式或流模式时使用。

5.6 EXTENDED FLOW SPECIFICATION OPTION

此选项指定用于在通道上请求所需服务质量 (QoS) 的流规范。这是不可协商的。在 AMP-U 逻辑链路上创建的所有信道都应支持扩展流规范。可选地,通过 ACL-U 逻辑链路创建的通道可以支持扩展流规范)。如果两个设备都在扩展功能掩码中显示对 BR/EDR 的扩展流规范的支持,那么在两个设备之间创建的所有通道都应使用扩展流规范。如果使用扩展流规范,则不应使用服务质量选项和刷新超时选项。

5.7 EXTENDED WINDOW SIZE OPTION

此选项用于协商最大扩展窗口大小。扩展窗口大小选项的类型为 0x07,不可协商。

仅当对等 L2CAP 实体已在扩展功能掩码中指示支持扩展窗口大小功能时,才应发送此选项。如果通道配置为使用基本 L2CAP 模式,则应忽略此选项。

Bluetooth低能耗(BLE)是一种用于低功耗无线通信的无线技术,用于在Android设备之间进行短距离数据传输。BLE L2CAP(逻辑链路控制和适配协议)是BLE协议栈中的一个重要组成部分。 BLE L2CAP层位于BLE协议栈的顶部,负责管理数据包的传输。它提供了两种不同的模式来支持连接导向和无连接导向的数据传输: 1. 基本模式(Basic mode):在基本模式下,BLE L2CAP提供类似于传统蓝牙的传输方式。它支持可靠的、面向连接的数据传输,并提供流控制和数据完整性检查。在此模式下,BLE L2CAP通过可靠的通道传输数据。 2. 适配器模式(Adapter mode):在适配器模式下,BLE L2CAP提供类似于传统蓝牙的无连接导向的数据传输方式。它提供了多个通道,每个通道可以以不同的方式传输数据,例如无连接、不可靠传输等。适配器模式使得传输更加灵活,适用于一些需要快速传输的场景。 BLE L2CAP还提供其他功能,如MTU(最大传输单元)管理,通过更大的MTU可以减少传输开销。此外,BLE L2CAP还负责分包和重组数据包,以保证数据的有效传输。 在Android开发中,开发人员可以使用Android的BLE API来使用BLE L2CAP层。这些API提供了相关的函数和方法来管理BLE连接、创建L2CAP通道和发送/接收数据。 总之,BLE L2CAP是Android BLE协议栈中的一个重要组成部分,负责BLE设备之间的低功耗数据传输。它提供了基本模式和适配器模式,以满足不同类型的传输需求。在Android开发中,开发人员可以使用BLE API来利用BLE L2CAP的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阅后即奋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值