由于在此章节中开始使用包含头文件和.C文件的方式,只记录核心函数源码。其他运行相关的头文件可以参考已发布的章节和运行环境配置等。
一般都会采用外置的M24C02等EEPROM芯片,不过实际用起来也还不错,目前还是单功能模块的demo阶段,后续会实战一个项目巩固一下,方便后续集成功能开发快速验证使用。
ds_nvs.h文件
#ifndef _DS_NVS_H_
#define _DS_NVS_H_
typedef enum{
NVS_WIFI_INFO_ERROR =0,
NVS_WIFI_INFO_NULL,
NVS_WIFI_INFO_SAVE,
}NVS_WIFI_INFO_E;
void ds_nvs_init(void);
void ds_nvs_save_wifi_info(void);
NVS_WIFI_INFO_E ds_nvs_read_wifi_info(void);
#endif
ds_nvs.c文件
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"
#include "esp_log.h"
#include "ds_nvs.h"
#include "ds_system_data.h"
static const char *TAG = "ds_nvs";
NVS_WIFI_INFO_E wifi_config_flag = NVS_WIFI_INFO_NULL;
void ds_nvs_save_wifi_info(){
esp_err_t err;
nvs_handle_t nvs_handle;
err = nvs_open("wificonfig", NVS_READWRITE, &nvs_handle);
if (err != ESP_OK) {
ESP_LOGI(TAG,"Error (%s) opening NVS handle!\n", esp_err_to_name(err));
return ;
}
wifi_config_flag = NVS_WIFI_INFO_SAVE;
ESP_ERROR_CHECK(nvs_set_u8(nvs_handle, "wifi_flag", wifi_config_flag));
ESP_ERROR_CHECK(nvs_set_str(nvs_handle, "ssid", get_system_data().setting_ssid));
ESP_ERROR_CHECK(nvs_set_str(nvs_handle, "psw", get_system_data().setting_psw));
ESP_ERROR_CHECK(nvs_commit(nvs_handle));
nvs_close(nvs_handle);
}
NVS_WIFI_INFO_E ds_nvs_read_wifi_info(){
esp_err_t err;
nvs_handle_t nvs_handle;
err = nvs_open("wificonfig", NVS_READWRITE, &nvs_handle);
if (err != ESP_OK) {
ESP_LOGI(TAG,"Error (%s) opening NVS handle!\n", esp_err_to_name(err));
return NVS_WIFI_INFO_ERROR;
}
uint8_t wifi_config = 0;
ESP_ERROR_CHECK(nvs_get_u8(nvs_handle, "wifi_flag", &wifi_config));
wifi_config_flag = wifi_config;
if(wifi_config_flag == NVS_WIFI_INFO_SAVE){
ESP_LOGI(TAG,"has wifi config info");
char ssid[32];
char psw[64];
size_t ssid_len = sizeof(ssid);
size_t psw_len = sizeof(psw);
ESP_ERROR_CHECK(nvs_get_str(nvs_handle, "ssid", ssid, &ssid_len));
ESP_ERROR_CHECK(nvs_get_str(nvs_handle, "psw", psw, &psw_len));
set_system_data_wifi_info(ssid,ssid_len,psw,psw_len);
print_system_data_wifi_info();
}else{
ESP_LOGI(TAG,"wifi config info null");
}
nvs_close(nvs_handle);
return wifi_config_flag;
}
void ds_nvs_init(){
// Initialize NVS
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
// NVS partition was truncated and needs to be erased
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK( err );
}
main.c文件
#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include <sys/param.h>
#include <stdio.h>
#include <string.h>
#include <sys/unistd.h>
#include <sys/stat.h>
#include "esp_system.h"
#include "esp_log.h"
#include "esp_spiffs.h"
#include "esp_err.h"
#include "ds_nvs.h"
#include "ds_system_data.h"
void app_main(void)
{
char *ssid = "qianyi";
char *psw = "123456qianyi";
set_system_data_wifi_info(ssid, strlen(ssid), psw, strlen(psw));
ds_nvs_init();
ds_nvs_save_wifi_info();
ds_nvs_read_wifi_info();
while(1){
printf("system run ...\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
运行示例:
PS:因为用了真正的wifi密码,所以打了马赛克,防止可恶的同事看到蹭我热点。