主要参考资料:
B站Up主 孤独的二进制《ESP32 存储篇 NVS 非易失性存储库》
ESP-IDF开发指南>API参考>非易失性存储: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/storage/nvs_flash.html
怎么理解NVS(非易失性存储库)?其实可以把它与我们的电脑磁盘做类比。
进一步拆解NVS,我们在分区表中可以看到NVS只有24K的空间,每个NVS有很多的4096B的Page,每个Page又是由32B的Entry组成。
这个Entry就是一个最小单位,即使你只存int8一个字节,也要消耗一个Entry。
一个Entry里会包括15B的key和value,以及CRC验证,因此NVS适合存储int类,而不是string或者Blob二进制。
nvs_flash_init();
//打开时需要输入一个命名空间 、状态和一个句柄
char* namespace ="namespace";
nvs_handle_t handle;
nvs_open(namespace, NVS_READWRITE, handle);
//定义一个结构体存储账号密码
typedef struct{
char ssid[50];
char password[50];
}ap_t;
ap_t aps_set;
//将准备好的账号密码复制进来
strcpy(aps_set.ssid,"wifi_ssid");
strcpy(aps_set.ssid,"wifi_password");
//往NVS存储数据,这个API需要输入handle、key、value和大小
nvs_set_blob(handel, "ap", aps_set, sizeof(aps_set));
//定义一个结构体存储账号密码
typedef struct{
char ssid[50];
char password[50];
}ap_t;
ap_t aps_set;
//从NVS获取数据,这个API需要输入handle、key、value和大小的指针
size_t length = sizeof(aps_set);
nvs_get_blob(handel, "ap", aps_set, &length );
//关闭时需要输入一个句柄
nvs_close(handle);
nvs_flash_deinit();
迭代器简单说就是可以罗列出所有键值对
这是它的一些API
这是使用的一个案例
// Example of listing all the key-value pairs of any type under specified partition and namespace
nvs_iterator_t it = NULL;
esp_err_t res = nvs_entry_find(<nvs_partition_name>, <namespace>, NVS_TYPE_ANY, &it);
while(res == ESP_OK) {
nvs_entry_info_t info;
nvs_entry_info(it, &info); // Can omit error check if parameters are guaranteed to be non-NULL
printf("key '%s', type '%d' \n", info.key, info.type);
res = nvs_entry_next(&it);
}
nvs_release_iterator(it);
可以查看有多少Entry和空余Entry,案例如下
// Example of nvs_get_stats() to get the number of used entries and free entries:
nvs_stats_t nvs_stats;
nvs_get_stats(NULL, &nvs_stats);
printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n",
nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries);