You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 esp-idf环境下WiFi Mesh连接时执行WiFi扫描仅扫到单个AP问题求助

代码存在的核心问题

  • 扫描范围限制:Mesh运行时默认固定在单工作信道,你未配置全信道扫描参数,设备仅会扫描当前Mesh所在信道的AP,自然只能返回1个同信道的AP结果。
  • Mesh状态操作逻辑错误:你重复调用3次esp_mesh_set_self_organized,参数互相冲突,会导致Mesh状态异常,且没有暂停Mesh的射频占用,Mesh持续收发数据会干扰扫描过程。
  • 扫描结果遍历逻辑错误:你固定遍历10次结果,若实际扫描到的AP数量不足10,会触发越界访问,还会打印无效的空SSID。

修正方案

修正后的完整代码

uint16_t number = 10;
wifi_ap_record_t ap_info[10];
uint16_t ap_count = 0;
memset(ap_info, 0, sizeof(ap_info));

// 配置全信道扫描参数,2.4G频段覆盖1-14信道,支持5G可自行扩展扫描范围
wifi_scan_config_t scan_config = {
    .ssid = 0,
    .bssid = 0,
    .channel = 0,
    .show_hidden = true,
    .scan_type = WIFI_SCAN_TYPE_ACTIVE,
    .scan_time.active.min = 100,
    .scan_time.active.max = 300
};

// 暂停Mesh射频占用,无需关闭自组网功能,扫描期间Mesh数据会自动缓存
ESP_ERROR_CHECK(esp_mesh_pause());

// 停止已有扫描任务后启动新的阻塞扫描
esp_wifi_scan_stop();
ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, true));

// 先获取实际扫描到的AP总数,再按实际数量读取结果
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
if (ap_count > 0) {
    number = (ap_count > 10) ? 10 : ap_count;
    ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
    for (int i = 0; i < number; i++) {
        ESP_LOGI(TAG, "SSID : %s, Channel : %d", ap_info[i].ssid, ap_info[i].primary);
    }
}

// 扫描完成后恢复Mesh运行
ESP_ERROR_CHECK(esp_mesh_resume());

// 若需要切换到指定AP,先调用esp_mesh_disconnect()断开Mesh,再调用常规WiFi STA接口连接目标AP即可

关键修改说明

  • 补充了主动扫描的时间参数,确保每个信道都有足够的时间收到AP的 beacon 帧。
  • 用esp_mesh_pause/esp_mesh_resume替代原来混乱的自组网开关逻辑,既保证扫描时不被Mesh收发干扰,也不会破坏Mesh的组网状态。
  • 按实际扫描到的AP数量遍历结果,避免越界访问。

内容的提问来源于stack exchange,提问作者D_A_8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:54:04