CC2640R2&BLE5.0开发
关于我们
入门开始
- 入门
- CC2640R2F 开发平台
-
视频教程
外设驱动
开发BLE应用
- 协议栈
- 无线固件下载(OAD)
- 应用举例
工具集
其他
- 仿真调试
- 移植向导
- Android BLE开发
CC2640R2&BLE5.0开发
关于我们
入门开始
视频教程
外设驱动
开发BLE应用
工具集
其他
这是本文档旧的修订版!
L2CAP 运行在 HCI 之上的 Host ,实现 Host 更高层(GAP、GATT、APP)和低层协议栈之间传输数据。
该层负责在 Host 和协议栈之间把交换的数据进行分割( segmentation )和重组( reassembly )以提供协议的多路处理能力。L2CAP 允许更高级别的协议和应用程序发送和接收高达 64KB(实际受限于蓝牙设备实际内存)的上层数据包(L2CAP 服务数据单元,SDU)。
图1. L2CAP 层数据传输示意图
注意:可能还是不太明白这里的 L2CAP,简单理解就是对上层协议数据多路处理,同时提供数据缓存以及重新拆包组包的能力。
术语 | 描述 |
---|---|
L2CAP 通道 | 在对等设备中的两个端点之间的逻辑连,其特征在于它们的信道标识符(CID) |
SDU 或 L2CAP SDU | 服务数据单元:L2CAP 与上层交换的数据包,并使用本文档中规定的过程通过 L2CAP 通道透明传输 |
PDU 或 L2CAP PDU | 协议数据单元:包含 L2CAP 协议信息字段,控制信息和/或上层信息数据的数据包 |
最大传输单位(MTU) | 上层实体可以接受的有效载荷数据的最大大小(以八位字节为单位)(即,MTU 对应于最大 SDU 大小)。 |
最大 PDU 有效载荷大小(MPS) | L2CAP 层实体可以接受的八位字节中的有效负载数据的最大大小(即,MPS 对应于最大 PDU 有效载荷大小)。 |
蓝牙低功耗协议栈支持在链路层将 L2CAP PDU 分割( segmentation )和重组( reassembly )。这种分段允许 L2CAP 和构建在 L2CAP 之上的更高级协议(如属性协议 ATT )使用更大的有效负载,从而减少与较大数据传输不断拆分开销。当使用分片时,较大的数据包直接被分割成多个链路层数据包,并由对等设备的链路层重新组合。
图2. L2CAP 分割重组数据包
L2CAP PDU 的大小决定了属性协议最大传输单元( Attribute Protocol Maximum Transmission Unit ( ATT_MTU
))。默认情况下,LE 设备 L2CAP PDU 的大小为 27 字节,意味着在单个连接事件数据包可以传输的 LE 数据包的最大字节。在这种情况下,L2CAP 协议头为 4 字节,ATT_MTU 默认大小为 23 。
注意:图 2 所示的
L2CAP ATT_MTU_SIZE
支持最大长度 251 的配置,但受限于 BLE4.0/4.1 设备硬件 LL PDU 大小 27 字节。其实 L2CAP 在 Host 层进行分割和重组,Controller 依然按照最大长度 27 进行收发。升级的 CC2640R2F BLE4.2/5.0 LE Data Length Extension 直接使能 LL PDU 的 251 字节,实现了硬件上提高数据吞吐量。
GATT Client 可以通过使用 GATT_ExchangeMTU()
在连接期间请求更大的 ATT_MTU
。在此过程中,客户端请求服务器其最大支持的接收 MTU 大小,服务器回复其最大支持的接收 MTU 大小进行,只有客户端可以启动此过程。当成功交换该值后,ATT_MTU
是客户端 MTU 和服务器 MTU 值的最小值。如果客户端表示可以支持 200 字节的 MTU,并且服务器响应最大大小为 150 字节,该 ATT_MTU 连接的大小为 150 。
采取以下步骤配置协议栈以支持较大的 MTU 值:
MAX_PDU_SIZE
预处理器符号设置为所需的值,以达到 L2CAP PDU 所需的最大大小。最大 ATT_MTU
大小总是比 MAX_PDU_SIZE
小 4 字节。GATT_ExchangeMTU()
(仅限 GATT 客户端)。传递给此函数的 MTU 参数必须小于或等于步骤 1 GATT Servier 中的定义 ATT_MTU
。ATT_MTU_UPDATED_EVENT
以验证 MTU 是否已成功更新,此更新要求调用已注册的 GATT 消息任务。尽管可以将协议栈配置为支持 MAX_PDU_SIZE
最大 255 个字节,但每个低功耗蓝牙最初连接时都使用默认的 27 字节( ATT_MTU = 23 字节),直到交换 MTU 过程中出现更大的 MTU。必须在每个蓝牙低功耗连接上执行交换 MTU 过程,且须由客户端发起。
注意:如果启用安全连接 BLE 4.2 功能,连接时默认的 MTU 大小为 69 。详情查看 ble_user_config.h。
增加 ATT_MTU
大小可以在单个 ATT 数据包中发送更多数据。单个数据包中发送的最长属性为( ATT_MTU
- 1 )个字节。如果是通知,则有额外的长度限制。如果一个属性值的长度为 100 个字节,则得到整个属性需要读取请求来获取第一个( ATT_MTU
- 1 )字节,然后是多个读取 blob 请求以获得后续( ATT_MTU - 1 )字节。如果传输整个 100 字节的有效载荷数据,默认 ATT_MTU 值为 23 字节,需要五个请求或响应过程,每个字节返回 22 个字节。如果执行了交换 MTU 过程,并且将 ATT_MTU 配置为 101 字节(或更大),则可以在单个读取请求或响应过程中读取整个 100 个字节。
注意:由于内存和处理的限制,并不是所有的蓝牙低功耗系统都支持更大的 MTU 尺寸。在定义系统的行为时,需要了解预期对等设备的功能。如果对等设备的能力未知,请设计系统使用默认的 27 字 L2CAP PDU/23 字节 ATT_MTU 大小。例如,发送长度大于 20 字节( ATT_MTU - 3 )字节的通知会导致在不支持较大 MTU 大小的设备上截断数据。
L2CAP 基于信道,信道的每个端点由信道标识符( CID )标识。有关 L2CAP 信道标识符的更多详细信息,请参阅蓝牙核心规范版本 5.0 的“信道标识符”部分([第 3 卷,第 A 部分,第 2.1 节))。
信道可分为固定和动态信道。例如,通过 GATT 协议交换的数据使用信道 0x0004 。动态分配的 CID 以标识逻辑链路和本地端点。本地端点必须在 0x0040 到 0xFFFF 之间,该端点用于以下部分中描述的面向连接的 L2CAP 通道。
蓝牙低功耗协议栈 SDK 提供 API 来创建 L2CAP CoC 通道,用于支持此功能的两个蓝牙低功耗设备之间双向传输数据,该功能默认在协议栈中启用。下图 3 显示了一个简单的连接,使用 L2CAP 面向连接的通道基于 LE 信用流量控制模式让数据在主机和从机之间交换。
图3. 主从机双向交换数据
文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。