背景
我的一个工程中,有使用扫描附近wifi这个feature,借鉴了ESP32官方的示例程序,在原esp-idf v5.0.1 上可以运行,esp-idf v5.2.1 中却扫描不到。
核心流程:就是在STA模式或STA+AP模式下,启动wifi(不连接)后,可以使用esp_wifi_scan_start()函数进行扫描,扫描后,使用 esp_wifi_scan_get_ap_num 和 esp_wifi_scan_get_ap_records 进行获取扫描的结果。
问题解决方法
一顿“控制变量法”不断实验,以及深入阅读官方文档后,有了解决方案。
实验中发现
实验中发现,先 esp_wifi_scan_get_ap_num 后,再 esp_wifi_scan_get_ap_records 可以解决。
文档中发现
文档中发现:
esp_wifi_scan_get_ap_records的一个个参数竟然是inout类型的,并且有Attention说调用后 will free all memory occupied by scanned AP list. 也就是再读取后会清除缓存?
所以再esp_wifi_scan_get_ap_num就读出的是0? 这是个人猜测。
最终解决办法
所以,最后的解决办法是,干脆只用esp_wifi_scan_get_ap_records 函数,不用 esp_wifi_scan_get_ap_num ,这样就OK了。
放一个代码片段:
#define DEFAULT_SCAN_LIST_SIZE 16
my_ap_wifi_info my_aps_info[DEFAULT_SCAN_LIST_SIZE];
uint16_t my_aps_num = 0;
typedef struct
{
uint8_t ssid[33];
int8_t rssi;
uint8_t rssi_level;
uint8_t rssi_percent;
uint8_t channel;
bool needpsw;
} my_ap_wifi_info;
//不能在AP模式下扫描,需要启动wifi,但不能连接。
void wifi_scan(void){
wifi_country_t country_config = {
.cc = "01",
.schan = 1,
.nchan = 11,
.policy = WIFI_COUNTRY_POLICY_AUTO,
};
esp_wifi_set_country(&country_config);
uint16_t ap_num = DEFAULT_SCAN_LIST_SIZE;
wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
uint16_t ap_count = 0