接上篇文章,增加了在NVS中保存wifi ssid和password的代码:
运行结果如图:
1.nvs初始化:
2.记录设备重启次数:
3.保存wifi ssid和password
4.关闭NVS:
完整代码如下:
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h> //michael add for NVS test
#include “sdkconfig.h”
#include “freertos/FreeRTOS.h”
#include “freertos/task.h”
#include “esp_system.h”
#include “esp_spi_flash.h”
#include “nvs_flash.h” //michael add for NVS test
#include “esp_log.h”//michael add for NVS test
void app_main(void)
{
vTaskDelay(1000/portTICK_PERIOD_MS);//阻止flash esp32后下面程序被立即执行
/* 初始化nvs*/
char * michael_nvs_namespace = "michael2";//namespace类似windows的文件夹
nvs_flash_init();//类似windows插入U盘
nvs_handle_t michael_handle;
nvs_open(michael_nvs_namespace,NVS_READWRITE,&michael_handle);//取得namespace句柄,类似windows打开文件夹
/* 下面这段是在nvs中记录设备重启次数*/
uint32_t counter_val = 0;//value类似windows的文件内容
char * counter_key = "counter";//key类似windows的文件名
nvs_get_u32(michael_handle,counter_key,&counter_val);
ESP_LOGI("nvs","KEY:VALUE %s:%d",counter_key,counter_val);
counter_val = counter_val + 1;
nvs_set_u32(michael_handle,counter_key,counter_val);
nvs_commit(michael_handle);//立刻执行nvs_set动作
/* 下面这段是在nvs中记录wifi ssid和password*/
uint32_t max_ap = 2;
typedef struct {
char ssid[50];
char password[50];
} ap_t;
ap_t aps_set[max_ap];
memset(aps_set,0,sizeof(aps_set));
for (int i=0;i<max_ap;i++) {
strcpy(aps_set[i].ssid, "michaelap");
strcpy(aps_set[i].password, "123456");
}
nvs_set_blob(michael_handle,"aps",aps_set,sizeof(aps_set));//写入ssid和password
nvs_commit(michael_handle);//立刻执行nvs_set动作
ap_t aps_get[max_ap];
size_t length = sizeof(aps_get);
nvs_get_blob(michael_handle,"aps",aps_get,&length);//读出ssid和password,用于后面打印
for (int i=0;i<max_ap;i++) {
ESP_LOGI("wifi","SSID:PASSORD %s:%s", aps_get[i].ssid, aps_get[i].password);
}
/* 关闭nvs*/
nvs_close(michael_handle);//释放namespace句柄,类似windows关闭文件夹
nvs_flash_deinit();//类似windows拔出U盘
/* 下面这段是Hello world例程*/
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}