Skip to content

ESP-IDF WiFi 配置信息的保存

ESP-IDF中,提供了一个专门的函数用来保存WiFi配置信息,这些配置信息包括SSID和密码。这些信息保存在ESP32-C3的Flash中,因此即使设备重启,这些配置信息也不会丢失。

这里的信息保存,是关于wifi的配置信息。所以需要使用 wifi模块,也就是必须要使用 PRIV_REQUIRES esp_wifi.

参考 ESP-IDF wifi模块

保存WiFi配置信息要点

  • 首先需要使用nvs_flash_init()函数初始化NVS。 因为NVS是ESP32-C3的一个非易失性存储区域,用于保存WiFi配置信息。

  • 要初始化wifi模块。

    c
      wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
      ESP_ERROR_CHECK(esp_wifi_init(&cfg));
  • 要指定保存的位置。(RAM或是FLASH)

    c
      //判断是否保存了wifi sta 的信息
      if (esp_wifi_set_storage(WIFI_STORAGE_FLASH) != ESP_OK) {
          ESP_LOGE(TAG, "Failed to set storage Wi-Fi");
          return ;
      } 
      // WIFI_STORAGE_FLASH 或是 WIFI_STORAGE_RAM
  • 指定保存的wifi信息的模式。(STA或是AP或是 APSTA )

    c
    // 设置 Wi-Fi 模式为 STA
      ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));

    这里 WIFI_MODE_STA 表示的是STA模式,也就是设备作为一个客户端连接到一个WiFi网络。还有 WIFI_MODE_APWIFI_MODE_APSTA 分别表示AP模式和APSTA模式。

  • 设置WiFi的SSID和密码。

    c
    wifi_config_t wifi_config = {
          .sta = {
              .scan_method = EXAMPLE_WIFI_SCAN_METHOD,
              .sort_method = EXAMPLE_WIFI_CONNECT_AP_SORT_METHOD,
              .threshold.rssi = CONFIG_EXAMPLE_WIFI_SCAN_RSSI_THRESHOLD,
              .threshold.authmode = EXAMPLE_WIFI_SCAN_AUTH_MODE_THRESHOLD,
          },
      };
      // 复制 ssid 到 wifi_config.sta.ssid
      int len = strlen(ssid);
      strncpy((char *)wifi_config.sta.ssid, ssid, len);
      wifi_config.sta.ssid[len] = '\0';
      // 复制 password 到 wifi_config.sta.password
      len = strlen(password);
      strncpy((char *)wifi_config.sta.password, password, len);
      wifi_config.sta.password[len] = '\0';
    
      return esp_wifi_set_config(WIFI_IF_STA, &wifi_config);

    核心函数是 esp_wifi_set_config(WIFI_IF_STA, &wifi_config);,其中 WIFI_IF_STA 表示的是保存STA接口的配置信息。

如何读取WiFi配置信息。

  • 同样读取时,也要确保 NVS 已经初始化。
  • 也要初始化wifi模块。
  • 也要指定保存的位置。(RAM或是FLASH)
  • 使用 esp_wifi_get_config(WIFI_IF_STA, &wifi_config); 读取配置信息。
c
  wifi_config_t wifi_config;
  esp_wifi_get_config(WIFI_IF_STA, &wifi_config);
  printf("SSID: %s\n", wifi_config.sta.ssid);
  printf("Password: %s\n", wifi_config.sta.password);

读取时,也要按对应的模式进行读取。

如何清除保存的wifi配置信息。

清除wifi信息,可以使用 esp_wifi_set_config 函数,将配置信息设置为{0},即可清除保存的wifi信息。

c
  wifi_config_t wifi_config = {0};
  esp_wifi_set_config(WIFI_IF_STA, &wifi_config);

这样可以直接清除保存的wifi信息。