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一样,达到最优值。