|
[平头哥RVB2601创意应用开发] RVB2601之KV组件介绍和使用
[复制链接]
一、KV组件介绍
-
KV 组件是什么
对于物联网RTOS的产品来说,KV 组件是一个不可获取的组件。无论Alios Things、RT-Thread还是LiteOS,都有KV相关的组件库。那么 KV 组件是用来做什么的呢?
KV 存储系统是YOC中一个以Key-Value方式进行持久化存储的轻量级组件,主要为基于nor flash的小型MCU设备提供通用的Key-Value持久化存储接口。该系统采用极小的代码及内存开销,支持断电保护、磨损均衡等功能。 KV 存储系统支持只读模式与读写模式共存,只读模式可以用于工厂生产数据,读写模式可用于运行时的数据存储
-
KV 组件在哪里会用到
example:
- 设备属性中 当前温度为21,就可以通过定义一个键值对:{“Temperture”:21}来进行存储
- 存储 WiFi 设备需要连接的ssid和pwd,可用于 WiFi 设备重新上电时还可以连接之前的路由器
用户无需关心具体的值被写到哪里了,仅需要通过对键的操作即可完成数据的存取。该组件目前针对Nor flash设备。
可以看到 官方提供的 Demo《网络播放器设计》也使用到了 KV 组件,这里通过宏定义来确认KV生效的位置
-
Alios-Things的 KV 组件目录
│ ├── kv_adapt.c# kv和flash的适配层
│ ├── kv_aos.c# kv的aos api接口
│ ├── kv.c# kv的核心实现代码
│ ├── kv_cli.c# kv cli注册命令
│ └── kv_secure.c# kv的安全存储适配层
├── include
│ ├── aos
│ │ └── kv.h# kv的对外AOS API
│ └── kv_api.h# kv_开头的API
├── internal# 内部头文件
├── package.yaml# 编译配置文件
└── example
└── kv_example.c# kv示例代码
-
KV 组件的 API
函数 |
说明 |
aos_kv_init |
KV初始化 |
aos_kv_flash_init |
KV初始化FLASH |
aos_kv_reset |
KV复位 |
aos_kv_set |
KV项设置 |
aos_kv_setfloat |
设置浮点数类型的KV项 |
aos_kv_setint |
设置整数类型的KV项 |
aos_kv_get |
获取KV项 |
aos_kv_getfloat |
获取浮点数类型的KV项 |
aos_kv_getint |
获取整数类型的KV项 |
aos_kv_setstring |
设置字符串类型的KV项 |
aos_kv_getstring |
获取字符串类型的KV项 |
aos_kv_del |
删除KV项 |
二、KV组件移植:基于helloworld demo
-
头文件包含
-
硬件初始化
-
从 int parttion_init(void) 中初始化了flash,调用的 void *partition_flash_open(int id) 是在 库文件”parttion“下
-
然后调用了HAL 层的flash操作 hal_csi 里面的API,例如 int32_t hal_flash_info_get(hal_partition_t in_partition, hal_logic_partition_t *partition)
-
建立 KV 测试代码
static void kv_comp_example(void)
{
char *key = "test_kv_key";
char *set_value = "test_kv_value";
int set_len = strlen(set_value);
char get_value[32] = {0};
int get_len = 32;
int ret = -1;
ret = aos_kv_set(key, set_value, set_len, 1);
if(ret){
LOGD(TAG, "kv comp test fail! aos_kv_set ret:%d\r\n", ret);
return;
}else{
LOGD(TAG, "aos_kv_set key:%s\r\n", key);
}
ret = aos_kv_get(key, get_value, &get_len);
if(ret){
LOGD(TAG, "kv comp test fail! aos_kv_get ret:%d\r\n", ret);
return;
}else{
LOGD(TAG, "aos_kv_get key_value:%s key_len:%d\r\n",get_value, get_len);
}
if(get_len != set_len){
LOGD(TAG, "kv comp test fail! get_len != set_len, get_len:%d\r\n", get_len);
return;
}
if(strcmp(get_value, set_value)){
LOGD(TAG, "kv comp test fail! get value not right! get_value:%s\r\n", get_value);
return;
}
LOGD(TAG, "kv comp test success!\r\n");
return;
}
-
main函数里调用,或调用cli使用
int main(void)
{
board_yoc_init();
LOGD(TAG, "%s\n", aos_get_app_version());
oled_init();
aos_kv_init("kv");// 初始化 KV 组件
kv_comp_example();// 函数测试 KV 函数
while (1) {
LOGD(TAG, "Hello world! YoC");
aos_msleep(1000);
}
return 0;
}
-
调试、日志打印
三、感想
- 想做查询天气的,但因为时间关系,就先输出 KV 了,对于物联网的设备使用 KV 库是个很基本的操作,也很有必要。RVB2601刚好在YoC移植了 Alios-Things的内核和一些组件库,所以有了这篇文章,希望大家可以很好的来使用~
|
|