乐鑫技术交流
直播中

李玲

8年用户 1320经验值
私信 关注
[问答]

如何将智能配置ssid和密码存储在WiFi NVS结构中?

我能够使用 ESPTOUCH 应用程序成功设置 smartconfig 示例。 我想修改此示例以自动连接到上次工作的WiFi网络。 有人可以就最佳方法提供指导吗?

我可以使用类似于 NVS RW 示例的东西轻松保存 ssid 和密码。 但是,我在文档中注意到 esp_wifi_init() 方法有一个 WiFi NVS 结构的选项。https://esp-idf.readthedocs.io/en/v2.0/api/wifi/esp_wifi.html有没有一种自动方法可以使用它在启动时检索以前有效的凭据?

回帖(1)

王莉

2024-7-11 16:19:48
要将智能配置的SSID和密码存储在WiFi NVS结构中,并在启动时自动连接到上次工作的WiFi网络,您可以按照以下步骤操作:

1. 首先,确保您已经安装了ESP-IDF开发框架,并将其配置正确。

2. 在您的项目中,包含以下头文件:
```c
#include "esp_wifi.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_event_loop.h"
```

3. 初始化NVS存储:
```c
static void initialize_nvs()
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
}
```

4. 创建一个函数来保存SSID和密码到NVS存储:
```c
static void save_wifi_credentials(const char *ssid, const char *password)
{
    nvs_handle_t handle;
    esp_err_t err = nvs_open("wifi_config", NVS_READWRITE, &handle);
    if (err != ESP_OK) {
        return;
    }

    err = nvs_set_str(handle, "ssid", ssid);
    if (err != ESP_OK) {
        goto exit;
    }

    err = nvs_set_str(handle, "password", password);
    if (err != ESP_OK) {
        goto exit;
    }

    err = nvs_commit(handle);
    if (err != ESP_OK) {
        goto exit;
    }

exit:
    nvs_close(handle);
}
```

5. 创建一个函数来从NVS存储中检索SSID和密码:
```c
static bool retrieve_wifi_credentials(char *ssid, char *password)
{
    nvs_handle_t handle;
    esp_err_t err = nvs_open("wifi_config", NVS_READONLY, &handle);
    if (err != ESP_OK) {
        return false;
    }

    size_t length = sizeof(ssid);
    err = nvs_get_str(handle, "ssid", ssid, &length);
    if (err != ESP_OK) {
        goto exit;
    }

    length = sizeof(password);
    err = nvs_get_str(handle, "password", password, &length);
    if (err != ESP_OK) {
        goto exit;
    }

exit:
    nvs_close(handle);
    return err == ESP_OK;
}
```

6. 修改您的主函数以使用这些函数:
```c
void app_main()
{
    initialize_nvs();

    char ssid[32] = {0};
    char password[64] = {0};

    if (retrieve_wifi_credentials(ssid, password)) {
        esp_wifi_init(&wifi_init_config);
        esp_wifi_set_storage(WIFI_STORAGE_FLASH);
        esp_wifi_set_mode(WIFI_MODE_STA);
        esp_wifi_start();

        wifi_config_t wifi_config = {
            .sta = {
                .ssid = ssid,
                .password = password,
            },
        };
        esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
    } else {
        // 如果没有找到有效的凭据,使用ESPTOUCH或其他方法进行配置
    }
}
```

这样,您的设备将在启动时自动尝试连接到上次工作的WiFi网络。如果找不到有效的凭据,您可以使用ESPTOUCH或其他方法进行配置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分