发 帖  
原厂入驻New
[经验]

【HarmonyOS HiSpark Wi-Fi IoT套件】Hi3861 NV操作——如何保存数据到开发板,断电不丢失

2020-11-7 15:30:38  102 Hispark开发套件 HarmonyOS开发板 HarmonyOS
分享
3
原文链接:https://bbs.elecfans.com/jishu_2005133_1_1.html


实际产品开发过程中,我们肯定需要保存一些数据,并且掉电不丢失。例如很多人在使用我之前写的一篇WIFi配网功能后,都会遇到一个问题:我配置了WiFi账户密码,但是下次我又得重新配网,能不能把WiFi账户密码保存起来?
好,接下来我们来实现这个功能:保存数据到开发板,断电不丢失。
有两种方式:
1、使用KV系统——最简单,推荐使用
关于如何保存数据的,可以直接使用 kv系统更加简单方便,不必参考本文的 nv操作,本文nv操作仅供大家参考。
kv系统可以保存数据到flash,只需要简单的两个函数即可:
  1. <p>//删除kv</p><p>void DeleteKVCache(const char* key);</p><p>//增加kv
  2. void AddKVCache(const char<em> key, const char</em> value, boolean isNew);</p><p>//获取kv值
  3. int GetValueByCache(const char<em> key, char</em> value, unsigned int maxLen);</p><p>//清除kv
  4. int ClearKVCacheInner(void);</p><p>例如:</p><p>//把ssid写入到kv中</p><p>AddKVCache("ssid", ssid, TRUE);</p><p>//读取出来kv</p><p>GetValueByCache("ssid",ssid,sizeof(ssid));</p>
复制代码

可以看到更加简单高效~~推荐大家使用
2、NV系统——仅hi3861支持
首先我们要使用到 hi3861 的nv操作,它支持我们自定义一些数据保存到工厂参数分区,其实就是写入到hi3861的flash中。
不过这个功能使用挺复杂的,我们以保存wifi账户密码为例。
1、修改 mss_nvi_db.xml 文件
打开vendorhisihi3861hi3861toolsnvtoolxml_filemss_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 文件 增加 结构体
修改 vendorhisihi3861hi3861toolsnvtoolh_filenvnv_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); 进行初始化,但是由于系统启动的时候已经初始化过了,所以我们不需要重复初始化。
  1. //写入到工厂区

  2.     /* NV值写入 */

  3.     wal_cfg_ssid_my nv;

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

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

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




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

  8.     if (ret != HISI_OK) {

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

  10.     }

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

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

  13.     if (ret != HISI_OK) {

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

  15.     }

  16.     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项在升级后被新版本值替换。

关于
<GROUP NAME="Factory" ID="0x3" FEATURE="1<<0,1<<5" USEDMODE="0" PARAM_DEF_FILE="../nv/nv_factory_struct_def.txt">每一项的说明如下:

关于
<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#jssq

只有小组成员才能发言,加入小组>>

1101个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表