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
相关产品推荐
相关产品推荐

