性能优化
发射功率
esp_ble_tx_power_set
和 esp_ble_tx_power_set_enhanced
均可以用于设置发射功率,推荐使用 esp_ble_tx_power_set_enhanced
函数,因为该函数支持的功率范围更细分。不同的芯片所支持的功率范围不同,具体可以对应的 esp_bt.h
文件中定义的宏。
功耗优化
如何最优化功耗:
- 使用低功耗模式
使用
Auto Sleep
模式,使得 RF 和 CPU 在空闲时进入低功耗模式
- 使用外接晶振
使用外部 32.768 kHz 晶振可以提供更稳定的时钟源
有助于提高低功耗模式下的定时精度
减少内部 RC 振荡器的功耗
- 选择合适的连接参数
连接间隔(Connection Interval):根据应用需求选择合适的时间间隔,较长的间隔可以降低功耗
从机延迟(Slave Latency):允许从设备跳过一定数量的连接事件,进一步降低功耗
监督超时(Supervision Timeout):设置合理的超时时间,避免不必要的重连
使用较大的 MTU 大小,减少数据传输次数
- 其他优化建议
合理设计数据包大小,避免分包传输
在可能的情况下使用通知(Notification)而不是指示(Indication)
使用 ESP32 的电源管理功能,如动态频率调节
适当降低发射功率
典型功耗数据:
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
实际传输速率影响因素:
- 协议层封装开销
数据从 ATT 层到 LL 层需要层层封装
每层都会添加协议头(Header)
LE 1M UNCODED PHY 的 Preamble 为 1 字节
LE 2M UNCODED PHY 的 Preamble 为 2 字节
- 数据长度扩展(DLE)
BLE 4.0/4.1:最大 ATT Payload 为 20 字节
BLE 4.2/5.0:支持 DLE,最大 ATT Payload 可达 244 字节
建议将 DLE 配置为最大值以提高单包数据利用率
- 帧间空间(T_IFS)
同一数据信道上,两个空中包之间的距离为 150 us
这是固定的时间消耗
- 连接事件和连接间隔
每个连接事件中双方需要完成一次收发包
即使没有数据,也需要发送空包
一个连接事件中可以包含多个数据包的交互
数据包数量和连接间隔大小相关
优化建议:
- 应用层发包方式
使用
write command
而不是write request
使用
Notify
而不是Indication
- 连接间隔优化
调整数据包大小,提高连接事件中的数据包填充率
适当调整连接间隔,使一个连接事件中能发送更多数据包
- 使用 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
函数设置默认物理层
参考示例