前言

项目需求:在ESP32板子重启之后,自动从Flash中寻找已经存储好的WiFi账号和秘密,连接到网络。

要想能够很好的理解如何将WiFi的账号和密码如何写入到Flash的什么地方,首先需要了解下ESP32中Flash的特点。


1 ESP32 Flash介绍

SP32 支持多个外部 QSPI flash 和静态随机存储器 (SRAM)。我用的是ESP32-WROOM-32D,集成了 4 MB 的 SPI flash,连接 ESP32 的管脚 GPIO6,GPIO7, GPIO8,GPIO9,GPIO10 和 GPIO11。

Flahs上包含不同类型的数据,如烧录的bin数据,校准数据、文件系统数据、参数存储数据等。因此,需要一张分区表对Flash空间进行管理。

通过理解烧写程序过程中的提示,可以更加深入理解Flash。

Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: c8:f0:9e:9e:1e:04
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00007fff...
Flash will be erased from 0x00010000 to 0x000a9fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 25392 bytes to 15887...
Writing at 0x00001000... (100 %)
Wrote 25392 bytes (15887 compressed) at 0x00001000 in 0.7 seconds (effective 309.1 kbit/s)...
Hash of data verified.
Compressed 629024 bytes to 403328...
Writing at 0x00010000... (4 %)
Writing at 0x0001bf4e... (8 %)
Writing at 0x00026622... (12 %)
Writing at 0x0002c22e... (16 %)
Writing at 0x00031d70... (20 %)
Writing at 0x000375ea... (24 %)
Writing at 0x0003cf1b... (28 %)
Writing at 0x00042655... (32 %)
Writing at 0x00047cc1... (36 %)
Writing at 0x0004d37e... (40 %)
Writing at 0x00052bdf... (44 %)
Writing at 0x0005870e... (48 %)
Writing at 0x0005d9fd... (52 %)
Writing at 0x00062d65... (56 %)
Writing at 0x00067fed... (60 %)
Writing at 0x0006d67e... (64 %)
Writing at 0x00072e09... (68 %)
Writing at 0x000789e5... (72 %)
Writing at 0x0007e28c... (76 %)
Writing at 0x0008446f... (80 %)
Writing at 0x0008a2b4... (84 %)
Writing at 0x00090afb... (88 %)
Writing at 0x0009ace9... (92 %)
Writing at 0x000a0b27... (96 %)
Writing at 0x000a61c3... (100 %)
Wrote 629024 bytes (403328 compressed) at 0x00010000 in 9.4 seconds (effective 535.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 104...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (104 compressed) at 0x00008000 in 0.0 seconds (effective 498.6 kbit/s)...
Hash of data verified.

烧录的芯片是ESP32-D0WDQ6。烧录前擦除Flash的三个区域。

第一个是从0x1000开始擦除,然后烧录Bootloader,大小是25392字节,即25K。

第二个是从0x8000出开始烧录分区表Partition Table,大小是3072字节,即3K。

第三个是从0x10000开始烧录的应用程序Factory app,大小是629024字节,即615K。

因此,64KB以前的空间用来存放Bootloader、Partition Table等,64KB之后的1M空间用来存放工厂应用程序,之后,还剩下将尽3M的空间没有规划利用。

从ESpressif安装目录中找到:

frameworks>esp-idf-vx.x.x>components>partition_table中文件partitions_singleapp.csv

打开文件可以看到,nvs、pyh_init和factory分配的空间分别时24KB、4KB和2M。

在csv文件中,没有定义Offset,但是在config.h和sdkconfig中定义了bootloader、nvs、factory app。

Build sdkconfig.h中定义了Bootloader放置在Flash中的偏移位置是0x1000。

分区表partition table放置在Flash中偏移位置是0x8000。根据分区表中分配的空间大小,可以确定Flash起始位置、终止位置以及大小如下表所示。

名称

起始地址

终止地址

大小

Bootloader

0x1000

Partition table

0x8000

0x8ffff

4K

nvs

0x9000

0xeffff

24K

Phy_init

0xf000

0xffff

4K

Factory app

0x10000

0x2fffff

2M

由此,宏观上我知道当我以nvs的方式存储键值对时,这些键值对将存储在flash的什么位置。

2 nvs介绍

ESP32的片外Flash提供了一个很方便的存储数据的方式非易失性存储 (NVS)。相应的非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据,如:

键:WiFi_SSID,值:wifiname;键:WiFi_PASSWORD,值:password

3 键值对

键是ASCII 字符串当前支持的最大键长为 15 个字符。所以在应用程序中调用如nvs_set_str函数写入WiFi账号时, 后续用来获取wifi账户和密码的索引WiFi_SSID、WiFi_PASSWORD的字符串长度不能超过15个字符。

值可以是如下几种类型:

类型

内容

整数型

uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、uint64_t 和 int64_t

字符串

以 0 结尾的字符串

二进制数据

可变长度的二进制数据 (BLOB)

4 nvs操作API

4.1 nvs_open打开nvs

4.2 nvs_set_str设置存储的内容为字符串

键必须唯一。为现有的键写入新的值可能产生如下结果:

  1. 如果新旧值数据类型相同,则更新值;
  2. 如果新旧值数据类型不同,则返回错误。

读取值时也会执行数据类型检查。如果读取操作的数据类型与该值的数据类型不匹配,则返回错误。

4.3 nvs_get_str获取值为字符串

5 示例程序

选择模板下面storage>nvs_rw_value模板进行编辑。

/* Non-Volatile Storage (NVS) Read and Write a Value - ExampleFor other examples please check:https://github.com/espressif/esp-idf/tree/master/examplesThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"void app_main(void)
{// Initialize NVSesp_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_initESP_ERROR_CHECK(nvs_flash_erase());err = nvs_flash_init();}ESP_ERROR_CHECK( err );// Openprintf("\n");printf("Opening Non-Volatile Storage (NVS) handle... ");nvs_handle_t my_handle;err = nvs_open("storage", NVS_READWRITE, &my_handle);if (err != ESP_OK) {printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));} else {printf("Done\n");err = nvs_open("nvs", NVS_READWRITE, &my_handle);//设置wifi账号和用户名err = nvs_set_str(my_handle, "WiFi_SSID", "wifiname");err = nvs_set_str(my_handle, "WiFi_PASSWORD", "password");err = nvs_commit(my_handle);//读取WiFi_SSIDsize_t required_size;nvs_get_str(my_handle, " WiFi_SSID ", NULL, &required_size);char* wifiname = malloc(required_size);nvs_get_str(my_handle, " WiFi_SSID ", wifiname, &required_size);// Closenvs_close(my_handle);}}

编译完成。

ESP32 通过NVS存储WiFi账号和密码至Flash相关推荐

  1. ESP32用NVS存储wifi信息

    通俗来说,NVS 就是在 flash 上分配的一块内存空间 ,提供给用户保存掉电不丢失的数据. 非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据. NVS适合存储一些小数据,如 ...

  2. ESP32开发--使用NVS存储数据

    ESP32基础系列 ESP32初体验之环境搭建 ESP32外设学习之GPIO ESP32外设学习之UART ESP32开发之给模块连上网络 ESP32的一键配网与Airkiss配网 ESP32使用NV ...

  3. 二维码的妙用:通过Zxing实现wifi账号密码分享功能

    二维码是搭载信息的一种载体,通过二维码可以传递名片.网址.商品信息等,本文讲到二维码的另外一种妙用:通过二维码实现wifi账号和密码分享. 关于二维码的基础知识,请访问:二维码的生成细节和原理 试想这 ...

  4. ESP32学习入门:WiFi连接网络

    目录 一.ESP32简单介绍 二.ESP32 Wi-Fi模块介绍 三.ESP32 Wi-Fi 编程模型 四.ESP32 Wi-Fi 事件处理流程 五.ESP32 Wi-Fi开发环境 六.ESP32 W ...

  5. 无线WiFi网络的密码破解攻防及原理详解

    无线WiFi网络的密码破解攻防及原理详解 大家应该都有过这样的经历,就是感觉自己家的无线网怎么感觉好像变慢了,"是不是有人蹭我家网?""还有的时候咱们出门也想试图蹭一下别 ...

  6. Mac电脑使用:删除保存在Mac电脑自带的Safari浏览器、谷歌浏览器、火狐浏览器中的账号和密码的方法

    掌握删除保存在浏览器中的账号和密码的方法很重要,尤其是你在公司电脑上面存储的密码,万一哪天你离职了,一定要清理电脑浏览器上面存储的各种关于你自己的账号密码,如果不清理就会被别人使用,所以如果不是你私人 ...

  7. linux连公共wifi怎么输密码,公共wifi密码是什么?巴士小编教你怎么用?

    相信使用智能手机或者是平板电脑的朋友们都十分关注公共wifi的使用,它的普及使得大家的上网变得非常的方便,只要有wifi覆盖的地方大家就可以随时随地上网,但是大家在使用公共Wifi的时候是需要密码的, ...

  8. linux wifi密码保存在哪个文件夹,Ubuntu明文存储WiFi密码方法介绍

    玩蛇网推荐图文教程:python 列表 Ubuntu明文存储WiFi密码方法介绍.Linux系统的驱动发行版在主目录外存储Wi-Fi配置文件,这使得它们更易于被访问. 这包括Wi-Fi配置文件的密码: ...

  9. 安卓---第5章 数据存储---保存QQ账号与密码

    文章目录 案例1: 使用文件存储 保存QQ账号与密码 功能描述 saveqq_1.xml FileSaveQQ.java saveqq_1 案例2 使用SP保存QQ账号与密码 功能描述 SPSaveQ ...

最新文章

  1. 在bootstrap ace样式框架上修改的后台管理型模板(Tab页后台管理模板)
  2. 【C++】C++命名空间重定向
  3. pandas使用sort_index函数按照索引排序对dataframe的数据行进行排序(sort dataframe rows by index)
  4. Mint17 FireFox重装英文版问题
  5. Celery组件架构介绍
  6. 在Excel中如何引用其他的工作表或者工作簿
  7. Vista,Windows7中给IIS7添加PHP支持
  8. 求一个序列中,第k个数
  9. hmcl手机版_hmcl启动器整合包安卓版下载-我的世界hmcl启动器安卓版v1.17.10最新版_新绿资源网...
  10. html调用xfplugin,傻瓜式网页里嵌入先锋web万能播放控件
  11. 【Unity】Jay 开发日志(六)——暂停和结束菜单的创建
  12. 拉链表断链、交叉链判断及处理方式
  13. Feign原理:current list of Servers哪里来的
  14. Linux环境中第一行dpa,nvdimm
  15. rtp server
  16. 老照片修复怎么修?这三个方法可以让你实现修复操作
  17. vue watch使用了immediate之后,handler的this指向问题
  18. 2015年三分之一程总结1——工作生活总结(多图慎入)
  19. 全国计算机二级vb 文库,全国计算机二级考试VB题目
  20. 【好文导读】人工智能和机器学习的富有启迪的文章201802

热门文章

  1. Halcon矩阵(Matrix)算子详解
  2. 【DuiLib入门基础】九宫格corner属性详细解释
  3. 怎么用python画房子_python绘图作业:使用pygame库画房子
  4. 每日一滴——python之time.sleep()
  5. SpringBoot序幕——SpringBoot概述及其项目创建
  6. 计算机主机拆装注意事项,电脑硬件拆装前要注意什么 拆装电脑的注意事项
  7. SSH远程操作——一台电脑的的NAS之旅
  8. 安卓-恢复模式--Recovery
  9. “拓维元”震撼发布,拓维信息软硬全栈国产自研战略再落一子!
  10. 分享一个强大无痛的英语学习网站