# 引言 ESP32-C3 作为高性价比的 RISC-V 芯片,广泛用于智能家居、传感器节点等场景。其内置 2.4GHz WiFi 和 BLE 5.0,但两者共用同一射频前端,无法同时收发。当 BLE 处于广播模式时,会周期性占用信道,导致 WiFi 数据包冲突或延迟,进而影响吞吐量。本文通过实验量化广播间隔(adv_interval)对 WiFi TCP 下行吞吐量的影响,并提供调优建议。 # 共存机制与干扰原理 ESP32-C3 的 WiFi 和 BLE 通过一个硬件仲裁器(Coexistence Arbiter)协调射频使用。默认策略下,BLE 广播优先级高于 WiFi 数据帧,因为广播丢失会导致连接失败,而 WiFi 重传机制可容忍一定延迟。因此,每次 BLE 广播事件(约 1-2ms)会强制暂停 WiFi 传输,造成吞吐量下降。 广播间隔(adv_interval)决定了广播事件的频率,范围从 20ms 到 10.24s(BLE 规范)。间隔越短,广播事件越频繁,WiFi 被抢占的次数越多,吞吐量损失越大。此外,广播信道(37/38/39)与 WiFi 信道重叠时,干扰更严重。 # 实验设计 ## 硬件与软件环境 - 开发板:ESP32-C3-DevKitM-1 - 固件:ESP-IDF v5.1(默认共存策略) - 测试工具:iperf 3.0 用于 WiFi TCP 下行吞吐量测试 - BLE 配置:仅广播,广播数据长度 31 字节,无连接 ## 测试方法 1. 将 ESP32-C3 连接至路由器(2.4GHz,信道 6,带宽 20MHz)。 2. 在 PC 上运行 iperf 服务器,ESP32 作为客户端,持续接收 TCP 数据 60 秒。 3. 分别设置广播间隔为 20ms、50ms、100ms、200ms、500ms、1000ms,记录平均吞吐量。 4. 关闭 BLE 作为基线,重复测试。 # 实测结果与分析 | 广播间隔 (ms) | 平均吞吐量 (Mbps) | 相对基线下降 (%) | |---------------|-------------------|------------------| | 关闭 BLE | 42.5 | - | | 1000 | 41.8 | 1.6% | | 500 | 40.9 | 3.8% | | 200 | 38.2 | 10.1% | | 100 | 34.5 | 18.8% | | 50 | 28.7 | 32.5% | | 20 | 21.3 | 49.9% | ## 分析 - 间隔 ≥500ms 时,吞吐量下降 <4%,影响可忽略。 - 间隔 ≤100ms 时,吞吐量损失超过 18%,尤其在 20ms 时接近减半。 - 干扰主要来自广播事件本身,而非广播数据长度(长度影响较小)。 - 共存仲裁器在每次广播前会等待当前 WiFi 帧完成,但若广播事件频繁,会持续打断 TCP 流,导致窗口收缩和重传。 # 调优策略 ## 1. 根据应用需求选择广播间隔 - 若 BLE 仅用于设备发现或状态上报(如温湿度传感器),建议间隔 ≥500ms,兼顾功耗和 WiFi 性能。 - 若需要快速连接(如配网),可临时缩短间隔,连接建立后恢复长间隔。 ## 2. 使用动态广播间隔 ESP-IDF 支持 `esp_ble_gap_set_adv_interval` 动态调整。可在 WiFi 高负载时增大间隔,空闲时减小。例如: ```c // 设置广播间隔为 500ms(单位:0.625ms) uint16_t interval = 800; // 500ms / 0.625 = 800 esp_ble_gap_set_adv_interval(interval, interval); ``` ## 3. 调整共存优先级 通过 `esp_coex_priority_set` 可降低 BLE 优先级,但需谨慎,可能导致广播丢失。建议仅在广播数据不关键时使用。 ## 4. 优化 WiFi 参数 - 启用 AMPDU 聚合,减少帧间间隔,提高抗干扰能力。 - 调整 WiFi 调制方式(如强制 802.11g)可降低对时序的敏感度。 # 完整代码示例 以下代码演示如何初始化 BLE 广播并动态调整间隔: ```c #include "esp_bt.h" #include "esp_gap_ble_api.h" static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { // 处理事件,此处省略 } void ble_init() { esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); esp_bt_controller_init(); esp_bt_controller_enable(ESP_BT_MODE_BLE); esp_bluedroid_init(); esp_bluedroid_enable(); esp_ble_gap_register_callback(gap_event_handler); esp_ble_adv_params_t adv_params = { .adv_int_min = 800, // 500ms .adv_int_max = 800, .adv_type = ADV_TYPE_IND, .own_addr_type = BLE_ADDR_TYPE_PUBLIC, .channel_map = ADV_CHNL_ALL, .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, }; esp_ble_gap_start_advertising(&adv_params); } // 在 WiFi 高负载时调用 void set_adv_interval(uint16_t interval_ms) { uint16_t units = interval_ms * 1000 / 625; esp_ble_gap_set_adv_interval(units, units); } ``` # 注意事项 - 广播间隔单位是 0.625ms,设置时需换算,且必须满足 min ≤ max。 - 实测中,广播信道 37/38/39 与 WiFi 信道重叠时干扰更明显,可尝试固定广播信道避开 WiFi 信道。 - 若使用 BLE 连接(非广播),共存机制不同,本文结论不适用。 - 功耗与吞吐量需权衡:间隔越短,功耗越高(广播电流约 10mA,间隔 20ms 时平均电流约 5mA)。 # 总结 ESP32-C3 的 BLE 广播间隔对 WiFi 吞吐量有显著影响,间隔小于 100ms 时损失严重。开发者应根据实际场景选择合适间隔,并利用动态调整机制优化性能。通过合理调优,可在保持 BLE 功能的同时,确保 WiFi 传输效率。