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

连志安
发布于 2020-11-4 16:47
浏览
13收藏

实际产品开发过程中,我们肯定需要保存一些数据,并且掉电不丢失。例如很多人在使用我之前写的一篇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 。

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

截图的内容是这个:

<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,增加结构体:

typedef struct {

    hi_u8 ssid[50];

    hi_u8 passwd[50];

} wal_cfg_ssid_my;

 

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

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



//写入到工厂区

    /* NV值写入 */

    wal_cfg_ssid_my nv;

    memset(&nv, 0, sizeof(wal_cfg_ssid_my));

    memcpy_s(&nv.ssid[0], sizeof(wal_cfg_ssid_my), ssid, ssid_len);

    memcpy_s(&nv.passwd[0], sizeof(wal_cfg_ssid_my), passwd, passwd_len);




    ret = hi_factory_nv_write(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0);

    if (ret != HISI_OK) {

    printf("%x\n", ret);

    }

    /* 再次读取写入的NV值 */

    ret = hi_factory_nv_read(NV_ID, &nv, sizeof(wal_cfg_ssid_my), 0);

    if (ret != HISI_OK) {

    printf("%x\n", ret);

    }

    printf("nv read : %d,  ssid  :[%s]  psswd [%s]\n",ret, nv.ssid, nv.passwd);

 

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

 

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

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

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

 

 

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

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

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

 

可以看到分为 Factory 和 Modem。

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

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

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

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

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

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

 

关于

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

每一项的说明如下:

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

 

 

关于

   

<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="" />

的每一项说明如下:

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

 

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

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

 

 

分类
标签
wifi_config.zip 6.09K 187次下载
已于2020-11-4 17:30:24修改
6
收藏 13
回复
举报
6条回复
按时间正序
/
按时间倒序
SummerRic
SummerRic

前排!!!前排!!!

回复
2020-11-4 17:03:15
红叶亦知秋
红叶亦知秋

搬板凳来学习连老师的分享。

回复
2020-11-4 17:04:23
鲜橙加冰
鲜橙加冰

这个太实用了,没云没服务器的时候。

1
回复
2020-11-4 17:04:29
老克
老克

实用!已收藏~~

1
回复
2020-11-4 17:04:36
gordonlonglong
gordonlonglong

沙发,感谢分享!实实在在的干货!

回复
2020-11-4 17:05:57
千云山庄
千云山庄

老师好,kv能不能讲讲详细点?

回复
2021-12-26 06:16:00
回复
    相关推荐