小默叔叔 发表于 2022-3-21 22:52

[平头哥RVB2601创意应用开发] RVB2601之KV组件介绍和使用

<h2>一、KV组件介绍</h2>

<ol>
        <li>
        <p>KV 组件是什么</p>

        <p>对于物联网RTOS的产品来说,KV 组件是一个不可获取的组件。无论Alios Things、RT-Thread还是LiteOS,都有KV相关的组件库。那么 KV 组件是用来做什么的呢?</p>

        <p>KV 存储系统是YOC中一个以Key-Value方式进行持久化存储的轻量级组件,主要为基于nor flash的小型MCU设备提供通用的Key-Value持久化存储接口。该系统采用极小的代码及内存开销,支持断电保护、磨损均衡等功能。 KV 存储系统支持只读模式与读写模式共存,只读模式可以用于工厂生产数据,读写模式可用于运行时的数据存储</p>
        </li>
        <li>
        <p>KV 组件在哪里会用到</p>

        <p>example:</p>

        <ol>
                <li>设备属性中 当前温度为21,就可以通过定义一个键值对:{&ldquo;Temperture&rdquo;:21}来进行存储</li>
                <li>存储 WiFi 设备需要连接的ssid和pwd,可用于 WiFi 设备重新上电时还可以连接之前的路由器</li>
        </ol>

        <p>用户无需关心具体的值被写到哪里了,仅需要通过对键的操作即可完成数据的存取。该组件目前针对Nor flash设备。</p>

        <p>可以看到 官方提供的 Demo《网络播放器设计》也使用到了 KV 组件,这里通过宏定义来确认KV生效的位置 &nbsp; &nbsp;</p>
        </li>
        <li>
        <p>Alios-Things的 KV 组件目录</p>

        <pre>
<code>│   ├── 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示例代码
</code></pre>
        </li>
        <li>
        <p>KV 组件的 API</p>

        <table>
                <thead>
                        <tr>
                                <th>函数</th>
                                <th>说明</th>
                        </tr>
                </thead>
                <tbody>
                        <tr>
                                <td>aos_kv_init</td>
                                <td>KV初始化</td>
                        </tr>
                        <tr>
                                <td>aos_kv_flash_init</td>
                                <td>KV初始化FLASH</td>
                        </tr>
                        <tr>
                                <td>aos_kv_reset</td>
                                <td>KV复位</td>
                        </tr>
                        <tr>
                                <td>aos_kv_set</td>
                                <td>KV项设置</td>
                        </tr>
                        <tr>
                                <td>aos_kv_setfloat</td>
                                <td>设置浮点数类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_setint</td>
                                <td>设置整数类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_get</td>
                                <td>获取KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_getfloat</td>
                                <td>获取浮点数类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_getint</td>
                                <td>获取整数类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_setstring</td>
                                <td>设置字符串类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_getstring</td>
                                <td>获取字符串类型的KV项</td>
                        </tr>
                        <tr>
                                <td>aos_kv_del</td>
                                <td>删除KV项</td>
                        </tr>
                </tbody>
        </table>
        </li>
</ol>

<h2>二、KV组件移植:基于helloworld demo</h2>

<ol>
        <li>
        <p>头文件包含 &nbsp; &nbsp;</p>
        </li>
        <li>
        <p>硬件初始化</p>

        <ol>
                <li>
                <p>从 int parttion_init(void) 中初始化了flash,调用的 void *partition_flash_open(int id) 是在 库文件&rdquo;parttion&ldquo;下 &nbsp;</p>
                </li>
                <li>
                <p>然后调用了HAL 层的flash操作 hal_csi 里面的API,例如 int32_t hal_flash_info_get(hal_partition_t in_partition, hal_logic_partition_t *partition) &nbsp;</p>
                </li>
        </ol>
        </li>
        <li>
        <p>建立 KV 测试代码</p>

        <pre>
<code class="language-coffeescript">static void kv_comp_example(void)
{
    char *key = "test_kv_key";
    char *set_value = "test_kv_value";
    intset_len = strlen(set_value);
    char get_value = {0};
    intget_len = 32;
    intret = -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, &amp;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;
}</code></pre>
        </li>
        <li>
        <p>main函数里调用,或调用cli使用</p>

        <pre>
<code class="language-coffeescript">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;
}</code></pre>
        </li>
        <li>
        <p>调试、日志打印 &nbsp;</p>
        </li>
</ol>

<h2>三、感想</h2>

<ol>
        <li>想做查询天气的,但因为时间关系,就先输出 KV 了,对于物联网的设备使用 KV 库是个很基本的操作,也很有必要。RVB2601刚好在YoC移植了 Alios-Things的内核和一些组件库,所以有了这篇文章,希望大家可以很好的来使用~</li>
</ol>

lugl4313820 发表于 2022-3-22 10:42

<p>感谢楼主的分享,让我们学习到KV库的使用,希望在这里普及更多的知识。非常感谢!</p>
页: [1]
查看完整版本: [平头哥RVB2601创意应用开发] RVB2601之KV组件介绍和使用