性能优化

[English]

发射功率

esp_ble_tx_power_setesp_ble_tx_power_set_enhanced 均可以用于设置发射功率,推荐使用 esp_ble_tx_power_set_enhanced 函数,因为该函数支持的功率范围更细分。不同的芯片所支持的功率范围不同,具体可以对应的 esp_bt.h 文件中定义的宏。

功耗优化

如何最优化功耗:

  1. 使用低功耗模式
    • 使用 Auto Sleep 模式,使得 RF 和 CPU 在空闲时进入低功耗模式

  2. 使用外接晶振
    • 使用外部 32.768 kHz 晶振可以提供更稳定的时钟源

    • 有助于提高低功耗模式下的定时精度

    • 减少内部 RC 振荡器的功耗

  3. 选择合适的连接参数
    • 连接间隔(Connection Interval):根据应用需求选择合适的时间间隔,较长的间隔可以降低功耗

    • 从机延迟(Slave Latency):允许从设备跳过一定数量的连接事件,进一步降低功耗

    • 监督超时(Supervision Timeout):设置合理的超时时间,避免不必要的重连

    • 使用较大的 MTU 大小,减少数据传输次数

  4. 其他优化建议
    • 合理设计数据包大小,避免分包传输

    • 在可能的情况下使用通知(Notification)而不是指示(Indication)

    • 使用 ESP32 的电源管理功能,如动态频率调节

  5. 适当降低发射功率

典型功耗数据:

BLE Power Consumption Data

Chip

Max Current

Modem Sleep

Light Sleep (Main XTAL)

Light Sleep (32KHz XTAL)

ESP32

231 mA

14.1 mA

X

1.9 mA

ESP32C3

262 mA

12 mA

2.3 mA

140 uA

ESP32S3

240 mA

17.9 mA

3.3 mA

230 uA

ESP32C6

240 mA

22 mA

3.3 mA

34 uA

ESP32H2

82 mA

16.0 mA

4.0 mA

24 uA

ESP32C2

130 mA

18.0 mA

2.5 mA

169 uA

参考示例:BLE 低功耗示例

传输速率优化

BLE 5.0 及以上版本支持多种物理层: - LE 1M UNCODED PHY:比特传输速率为 1M bit/s(BLE 4.2 使用的物理层) - LE 2M UNCODED PHY:比特传输速率为 2M bit/s - LE CODED PHY:用于长距离通讯,比特传输速率为 125 K bit/s 或 500 K bit/s

实际传输速率影响因素:

  1. 协议层封装开销
    • 数据从 ATT 层到 LL 层需要层层封装

    • 每层都会添加协议头(Header)

    • LE 1M UNCODED PHY 的 Preamble 为 1 字节

    • LE 2M UNCODED PHY 的 Preamble 为 2 字节

  2. 数据长度扩展(DLE)
    • BLE 4.0/4.1:最大 ATT Payload 为 20 字节

    • BLE 4.2/5.0:支持 DLE,最大 ATT Payload 可达 244 字节

    • 建议将 DLE 配置为最大值以提高单包数据利用率

  3. 帧间空间(T_IFS)
    • 同一数据信道上,两个空中包之间的距离为 150 us

    • 这是固定的时间消耗

  4. 连接事件和连接间隔
    • 每个连接事件中双方需要完成一次收发包

    • 即使没有数据,也需要发送空包

    • 一个连接事件中可以包含多个数据包的交互

    • 数据包数量和连接间隔大小相关

优化建议:

  1. 应用层发包方式
    • 使用 write command 而不是 write request

    • 使用 Notify 而不是 Indication

  2. 连接间隔优化
    • 调整数据包大小,提高连接事件中的数据包填充率

    • 适当调整连接间隔,使一个连接事件中能发送更多数据包

  3. 使用 2M PHY
    • NimBLE 使用 ble_gap_set_prefered_le_phy 函数设置特定连接的物理层,使用 ble_gap_set_prefered_default_le_phy 函数设置默认物理层

    • Bluedroid 使用 esp_ble_gap_set_preferred_phy 函数设置特定连接的物理层,使用 esp_ble_gap_set_preferred_default_phy 函数设置默认物理层

参考示例