必须初始化 nvs
,否则 esp_wifi_init
就会报错
#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_wifi.h"
#include "esp_wifi_types_generic.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include <stdio.h>
#define MAXIMUM_AP 20
static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data) {
// WIFI事件, STA开始工作
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
ESP_LOGI("WIFI_EVENT", "STA start");
esp_wifi_connect();
} else if (event_base == WIFI_EVENT &&
event_id == WIFI_EVENT_STA_DISCONNECTED) {
// STA模式 连接不成功, 重试
ESP_LOGI("WIFI_EVENT", "STA reconnect");
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
ESP_LOGI("IP_EVENT", "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
}
}
static char *auth_mode_type(wifi_auth_mode_t auth_mode) {
char *types[] = {"OPEN", "WEP", "WPA PSK", "WPA2 PSK", "WPA WPA2 PSK", "MAX"};
return types[auth_mode];
}
void wifiInit() {
// 如果你需要记录ssid和passwd, 就需要使用nvs
ESP_ERROR_CHECK(nvs_flash_init());
// 初始化 TCP/IP 协议栈
ESP_ERROR_CHECK(esp_netif_init());
// 受事件驱动, 你一也不知道什么时候连上/断开wifi, 或接收到数据吧
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 注册事件回调, 你可以去 esp_wifi_types_generic.h 查看有哪些事件
ESP_ERROR_CHECK(esp_event_handler_instance_register(
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));
// 通过默认配置设置wifi, 并设置 STA 模式
wifi_init_config_t wifi_config = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&wifi_config));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
// 通过下面函数设置STA的配置,wifi_config_t 是一个联合体,根据模式设置工作配置
// 也是配置连接哪个wifi和设置AP的函数
// esp_wifi_set_config(WIFI_IF_STA, wifi_config_t);
ESP_ERROR_CHECK(esp_wifi_start());
}
void app_main() {
wifiInit();
wifi_scan_config_t scan_config = {
.ssid = 0, .bssid = 0, .channel = 0, .show_hidden = true};
ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, true));
wifi_ap_record_t wifi_records[MAXIMUM_AP];
uint16_t max_records = MAXIMUM_AP;
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&max_records, wifi_records));
printf("Number of Access Points Found: %d\\n", max_records);
printf("\\n");
printf(" SSID | Channel | RSSI | Authentication "
"Mode \\n");
printf("***************************************************************\\n");
for (int i = 0; i < max_records; i++)
printf("%32s | %7d | %4d | %12s\\n", (char *)wifi_records[i].ssid,
wifi_records[i].primary, wifi_records[i].rssi,
auth_mode_type(wifi_records[i].authmode));
printf("***************************************************************\\n");
}