BLE数据传输速率
1. 理论传输速率
BLE在物理层支持2M PHY、1M PHY和Coded PHY。
BLE数据传输已知信息:
采用GFSK调制方式,2M PHY每一个bit占用时间为0.5 μs,1M PHY占用1 μs。
数据包的时间间隔(T_IFS)为固定的150 μs。
传输时隙格式为:TX数据包 + 数据包间距 + RX空包 + 数据包间距
ATT层数据传输格式为:前导码(1M为1字节,2M为2字节)+ 存取地址(4字节)+ Header(2字节)+ Payload(251字节)+ CRC(3字节)
对于在GATT之上运行的应用程序,I2CAP和ATT都有自己的开销。通常,GATT的最大有效载荷为(251 - 7)= 244字节。
使用2M PHY,理论传输速率计算如下:
TX数据包总长度 = 2096 bits,占用时间为1048 μs。
RX空包总长度 = 88 bits,占用时间为44 μs。
一次传输总时间为:1048 + 44 +(150*2) = 1392 μs
可计算出LE 2M PHY模式下应用层的最大数据传输速率 = (244* 8) / 1392 µs ≈ 1402 kbps。
使用1M PHY,理论传输速率计算如下:
TX数据包总长度 = 2120 bits,占用时间为2088 μs。
RX空包总长度 = 80 bits,占用时间为80 μs。
一次传输总时间为:2120+80+(150*2) = 2500 μs
可计算出LE 1M PHY模式下应用层的最大数据传输速率 = (244* 8) / 2500 µs ≈ 780 kbps。
2. BLE数据传输速率影响因素
影响BLE传输速率的因素较多,包括PDU、CI、MTU、CE和PHY参数、RF性能、环境、Master和Slave之间的距离,以及通信模式等。
Slave和Master常用的通信模式有Indicate、Notify、Write Without Response、Write With Response。对于Indicate、Write With Response,都需要对端应答的模式,一个Interval只会发送一包数据。
BLE Connection相关配置参数主要影响通信实时性、吞吐率、功耗、抗干扰性、断链响应实时性等。其中,吞吐率主要与两个因素相关:通信周期CI和每个通信点可传输的数据量(MTU和PDU)。
并非CI越小,数据吞吐率就越高;或者CI越大,吞吐率越高。CI越小,整个时间段预留硬件准备时间的占比越大,实际通信数据时间越短,这样看来CI需要配置较大。但当CI越大,一旦出现数据错误,浪费CI中剩余时间越多,这样看来CI需要配置比较小,可快速继续下一次通信。
在高数据吞吐率场景,一般采用典型经验值,CI为30 ms~45 ms、PHY为2M、PDU为251、MTU为247。
如果需要对BLE数据传输速率进行测试,可以使用SDK中的
SDK_Folder\projects\ble\ble_peripheral\ble_app_throughput示例工程,配合GRToolbox工具进行测试。
3. FAQ
Q:在手机端想修改PDU参数,但没有找到API接口,怎么实现?
A:手机端发起参数更新,可获取的确定值为MTU。如果要在连接后,精确地修改连接参数,通常需使用手机发送命令到Slave芯片,由芯片发起参数更新,具体的实现可以参考SDK中的Throughput示例工程。
使用手机进行MTU设置时,会进行一次PDU Update,将手机端的PDU Max值进行更新。如需单独发送指令让设备端进行PDU设置,则需先将MTU进行更新,否则手机端一直默认最大PDU Length为27。而当设备端发起比27大的MTU值更新时,将操作失败。
Q:吞吐率测试时,为什么苹果手机吞吐率偏低?
A:iOS默认的连接间隔CI为30 ms。不同的手机操作系统,CI更新,可以接受的值不一样。iOS支持的最小CI为20 ms,但不能像Android 一样,CI可以更新到最小值7.5 ms。若iOS版本不同,则MTU也不一样,为185 Bytes左右。所以iOS BLE传输速率,不能像Android一样,达到最优值。