BLE一次能传多少数据
BLE到底一包能够收发多少数据。这是我们很多开发者都会关心的,正如我们知道BLE5.0物理层设计2Mpbs的码元率,实际我们的数据传输速率远远到不了这个级别,主要原因就是我们没有办法直接单次发送1M或者1K数据,必须按照我们知道的ATT_MTU
作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。本章节,我们实用性触发研究如何究竟蓝牙一包能够发送多少数据。
以下是GAPP Client 进行特征值写请求的完整抓包,AttValue
表示写入的值,该值的最大长度到底是多少呢,本文将详细研究并且验证。
本文的正确打开姿势,我们希望你已经仔细阅读并理解协议栈的L2CAP,和BLE4.2/5.0全新支持的 LE 数据扩展功能:
术语
术语 | 解释 |
---|---|
PDU | Potocal Data Unit 协议数据单元,对于协议栈数据单元我们应该理解为蓝牙协议分层的消息实体的完整封装,例如LL PDU表示我们 逻辑链路层的协议消息的完整封装 |
MTU | Maximum Transmission Unit 最大传输单元,和本文研究的BLE数据包的最大长度意思接近 |
LL | Logic Link 逻辑链路层 |
PHY | physical layer 物理层 蓝牙协议的最底层 |
分析
在 BLE PHY 包格式由以下组成,排除 前导码、访问地址、CRC地址 对于BLE4.0/BLE4.1 上层协议(LL)最大可以包含39字节长度的PDU(协议数据单元)。
但是更新后的BLE4.2/BLE5.0 直接升级硬件,将这一长度扩展到257。但是默认了兼容BLE4.0/4.1还是采用了上面的39设计。
注意:PHY 的数据包最大长度直接由硬件决定,也是限制我们BLE 数据包大小的根本原因。换句话说,PHY的硬件寄存器/存储器/FIFO 等直接决定了我们蓝牙数据包最大长度。
对于蓝牙协议分层设计来看,逻辑链路层是最底层,已经正常连接的两个设备之间通信PDU主要由LL Data PDU
组成。这里的LL Playload
作为我们上层协议的负载。
逻辑链路层再往上就是L2CAP——逻辑逻辑链路控制适配协议,如下的Basic L2CAP Header+Information Payload组成我们这里的基本帧(B-frame)。
L2CAP协议再上就是我们操作特征值的ATT层,这一层数据长度被 最大传输单元