必须初始化 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");
}