鸿蒙Hi3861 NV操作——如何保存数据到开发板,断电不丢失

系统
实际产品开发过程中,我们肯定需要保存一些数据,并且掉电不丢失。例如很多人在使用我之前写的一篇WiFi配网功能后,都会遇到一个问题:我配置了WiFi账户密码,但是下次我又得重新配网,能不能把WiFi账户密码保存起来?

[[350817]]

想了解更多内容,请访问:
51CTO和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com/#zz

实际产品开发过程中,我们肯定需要保存一些数据,并且掉电不丢失。例如很多人在使用我之前写的一篇WiFi配网功能后,都会遇到一个问题:我配置了WiFi账户密码,但是下次我又得重新配网,能不能把WiFi账户密码保存起来?

好,接下来我们来实现这个功能:保存数据到开发板,断电不丢失。

有两种方式:

1、使用KV系统——最简单,推荐使用

关于如何保存数据的,可以直接使用 kv系统更加简单方便,不必参考本文的 nv操作,本文nv操作仅供大家参考。

kv系统可以保存数据到flash,只需要简单的两个函数即可:

//删除kv

void DeleteKVCache(const char* key);

//增加kv

void AddKVCache(const char* key, const char* value, boolean isNew);

//获取kv值

int GetValueByCache(const char* key, char* value, unsigned int maxLen);

//清除kv

int ClearKVCacheInner(void);

例如:

//把ssid写入到kv中

AddKVCache("ssid", ssid, TRUE);

//读取出来kv

GetValueByCache("ssid",ssid,sizeof(ssid));

可以看到更加简单高效~~推荐大家使用

2、NV系统——仅hi3861支持

首先我们要使用到 hi3861 的nv操作,它支持我们自定义一些数据保存到工厂参数分区,其实就是写入到hi3861的flash中。

不过这个功能使用挺复杂的,我们以保存wifi账户密码为例。

1、修改 mss_nvi_db.xml 文件

打开vendor\hisi\hi3861\hi3861\tools\nvtool\xml_file\mss_nvi_db.xml 文件,在 Factory 中增加我们的参数:ID为0x0B 。 

 

截图的内容是这个:

  1. <NV ID="0x0B" NAME="INIT_CONFIG_SSID_MY" PARAM_NAME="wal_cfg_ssid_my" PARAM_VALUE="{[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}" CATEGORY="FTM" DEV="CCO-STA-NDM" DESCRIPTION="" /> 

2、修改 nv_factory_struct_def.txt 文件 增加 结构体

修改 vendor\hisi\hi3861\hi3861\tools\nvtool\h_file\nv\nv_factory_struct_def.txt,增加结构体: 

  1. typedef struct { 
  2.  
  3.     hi_u8 ssid[50]; 
  4.  
  5.     hi_u8 passwd[50]; 
  6.  
  7. } wal_cfg_ssid_my; 

3、编写代码,读取写入数据

通常来说,需要先执行一次 hi_nv_init(0xA000, 0x2000, 0x1000); 进行初始化,但是由于系统启动的时候已经初始化过了,所以我们不需要重复初始化。 

  1. //写入到工厂区 
  2.  
  3.     /* NV值写入 */ 
  4.  
  5.     wal_cfg_ssid_my nv; 
  6.  
  7.     memset(&nv, 0, sizeof(wal_cfg_ssid_my)); 
  8.  
  9.     memcpy_s(&nv.ssid[0], sizeof(wal_cfg_ssid_my), ssid, ssid_len); 
  10.  
  11.     memcpy_s(&nv.passwd[0], sizeof(wal_cfg_ssid_my), passwd, passwd_len); 
  12.  
  13.  
  14.  
  15.  
  16.     ret = hi_factory_nv_write(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0); 
  17.  
  18.     if (ret != HISI_OK) { 
  19.  
  20.     printf("%x\n", ret); 
  21.  
  22.     } 
  23.  
  24.     /* 再次读取写入的NV值 */ 
  25.  
  26.     ret = hi_factory_nv_read(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0); 
  27.  
  28.     if (ret != HISI_OK) { 
  29.  
  30.     printf("%x\n", ret); 
  31.  
  32.     } 
  33.  
  34.     printf("nv read : %d,  ssid  :[%s]  psswd [%s]\n",ret, nv.ssid, nv.passwd); 

附件我提供了一个wifi配网的升级版功能的源码,支持保存wifi账号密码。

完成以上操作后,我们就可以发现wifi账户密码可以写入到nv中了,可以永久保存数据了。查看开机打印:  

 

可以看到开机后读取到ssid 和密码正确,并且成功连接到wifi热点了。

我们再来看这个nv的一些内容吧:

mss_nvi_db.xml 文件记录了所有系统参数的默认值,而且这个文件其实还分组的: 

 

可以看到分为 Factory 和 Modem。

NV模块用于管理系统关键配置信息。 NV存储于Flash上,分为以下2个区:

● 工厂区 Factory:仅在工厂时使用。

● 非工厂区 Modem :分为以下2个区:

– Keep区: NV项在升级后保留原值

– Modem区: NV项在升级后被新版本值替换。  

 

关于

  1. <GROUP NAME="Factory" ID="0x3" FEATURE="1<<0,1<<5" USEDMODE="0" PARAM_DEF_FILE="../nv/nv_factory_struct_def.txt"

每一项的说明如下:

 

关于

  1. <NV ID="0x0B" NAME="INIT_CONFIG_SSID_MY" PARAM_NAME="wal_cfg_ssid_my" PARAM_VALUE="{[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}" CATEGORY="FTM" DEV="CCO-STA-NDM" DESCRIPTION="" /> 

的每一项说明如下: 

 

另外需要注意的是工厂区的读写操作跟非工厂区的读写操作的API不同。  

想了解更多内容,请访问:
51CTO和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com/#zz

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2020-10-14 09:37:03

HiBurn鸿蒙.bin文件

2020-11-06 10:15:16

HiBurn

2020-12-08 12:36:41

Hi3861 ADC驱动开发

2020-10-30 17:42:36

鸿蒙 OS Hi386

2021-06-25 15:32:13

鸿蒙HarmonyOS应用

2020-12-15 11:57:49

Hi3861 HarmonyOS开发板

2020-11-18 11:56:06

鸿蒙Hi3861

2020-10-27 10:08:19

Hi3861ADC驱动

2020-12-17 10:02:16

鸿蒙Hi3861开发板

2020-10-30 17:12:05

Hi3861

2022-08-19 10:54:47

操作系统鸿蒙

2020-12-09 09:44:29

Hi3861硬件介绍鸿蒙开发板

2020-10-30 09:48:03

Hi3861开发板get请求

2021-12-20 21:01:52

鸿蒙HarmonyOS应用

2020-10-29 09:53:06

Hi3861硬件开发板

2020-12-02 11:48:05

TFTP

2021-09-16 10:03:39

鸿蒙HarmonyOS应用

2020-11-02 12:07:11

鸿蒙 GPIO

2020-12-11 12:45:04

鸿蒙Hi3861游戏

2020-12-31 12:22:15

鸿蒙Hi3861应用开发
点赞
收藏

51CTO技术栈公众号