记录运行日志:存储产品历史的运行日志,异常告警的记录等
KVDB 键值数据库介绍
- 🌿KVDB 的基础功能的使用:
记录开机次数:
void kvdb\_basic\_sample(fdb\_kvdb\_t kvdb)
{
struct fdb\_blob blob;
int boot_count = 0;
FDB\_INFO("==================== kvdb\_basic\_sample ====================\n");
{ /\* GET the KV value \*/
/\* get the "boot\_count" KV value \*/
fdb\_kv\_get\_blob(kvdb, "boot\_count", fdb\_blob\_make(&blob, &boot_count, sizeof(boot_count)));
/\* the blob.saved.len is more than 0 when get the value successful \*/
if (blob.saved.len > 0) {
FDB\_INFO("get the 'boot\_count' value is %d\n", boot_count);
} else {
FDB\_INFO("get the 'boot\_count' failed\n");
}
}
{ /\* CHANGE the KV value \*/
/\* increase the boot count \*/
boot_count ++;
/\* change the "boot\_count" KV's value \*/
fdb\_kv\_set\_blob(kvdb, "boot\_count", fdb\_blob\_make(&blob, &boot_count, sizeof(boot_count)));
FDB\_INFO("set the 'boot\_count' value to %d\n", boot_count);
}
FDB\_INFO("===========================================================\n");
}
- 🌿字符串类型 KV
字符串 KV 的相关功能,字符串 KV 作为一个特殊的 KV 类型,其 Key 与 Value 均为字符串,常被用于参数存储、命令存储等可读性要求较高的场景。
void kvdb\_type\_string\_sample(fdb\_kvdb\_t kvdb)
{
FDB\_INFO("==================== kvdb\_type\_string\_sample ====================\n");
{ /\* CREATE new Key-Value \*/
char temp_data[10] = "36C";
/\* It will create new KV node when "temp" KV not in database. \*/
fdb\_kv\_set(kvdb, "temp", temp_data);
FDB\_INFO("create the 'temp' string KV, value is: %s\n", temp_data);
}
{ /\* GET the KV value \*/
char \*return_value, temp_data[10] = { 0 };
/\* Get the "temp" KV value.
\* NOTE: The return value saved in fdb\_kv\_get's buffer. Please copy away as soon as possible.
\*/
return_value = fdb\_kv\_get(kvdb, "temp");
/\* the return value is NULL when get the value failed \*/
if (return_value != NULL) {
strncpy(temp_data, return_value, sizeof(temp_data));
FDB\_INFO("get the 'temp' value is: %s\n", temp_data);
}
}
{ /\* CHANGE the KV value \*/
char temp_data[10] = "38C";
/\* change the "temp" KV's value to "38C" \*/
fdb\_kv\_set(kvdb, "temp", temp_data);
FDB\_INFO("set 'temp' value to %s\n", temp_data);
}
{ /\* DELETE the KV by name \*/
fdb\_kv\_del(kvdb, "temp");
FDB\_INFO("delete the 'temp' finish\n");
}
FDB\_INFO("===========================================================\n");
}
- 遍历所有 KV
遍历 KVDB 中的所有 KV ,用户可以在遍历 KV 时增加自己的处理动作。
- 首先初始化了 KVDB 的迭代器,然后使用迭代器 API ,将 KVDB 的所有 KV 逐一遍历出来。
遍历出来的 KV 对象含有 KV 的一些属性,包括:key name, value saved addr, value length 等,用户通过fdb_blob_read
配合fdb_kv_to_blob
读取出来,做一些自己的业务处理。
void kvdb\_tarversal\_sample(fdb\_kvdb\_t kvdb)
{
struct fdb\_kv\_iterator iterator;
fdb\_kv\_t cur_kv;
struct fdb\_blob blob;
size\_t data_size;
uint8\_t \*data_buf;
fdb\_kv\_iterator\_init(kvdb, &iterator);
while (fdb\_kv\_iterate(kvdb, &iterator)) {
cur_kv = &(iterator.curr_kv);
data_size = (size\_t) cur_kv->value_len;
data_buf = (uint8\_t \*) malloc(data_size);
if (data_buf == NULL) {
FDB\_INFO("Error: malloc failed.\n");
break;
}
fdb\_blob\_read((fdb\_db\_t) kvdb, fdb\_kv\_to\_blob(cur_kv, fdb\_blob\_make(&blob, data_buf, data_size)));
/\*
\* balabala do what ever you like with blob...
\*/
free(data_buf);
}
}
- 二进制大对象 (BLOB)
时序数据库
- TSDB 基础示例,具体介绍:
https://armink.gitee.io/flashdb/#/zh-cn/sample-tsdb-basic
- 该示例主要演示了 TSDB 的基础功能,包括 TSL(时序记录)的追加、查询及状态修改功能。
samples/tsdb_sample.c ,包含追加、查询及状态修改这几个过程,大致代码如下:
void tsdb\_sample(fdb\_tsdb\_t tsdb)
{
struct fdb\_blob blob;
FDB\_INFO("==================== tsdb\_sample ====================\n");
{ /\* APPEND new TSL (time series log) \*/
struct env\_status status;
/\* append new log to TSDB \*/
status.temp = 36;
status.humi = 85;
fdb\_tsl\_append(tsdb, fdb\_blob\_make(&blob, &status, sizeof(status)));
FDB\_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
status.temp = 38;
status.humi = 90;
fdb\_tsl\_append(tsdb, fdb\_blob\_make(&blob, &status, sizeof(status)));
FDB\_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
}
{ /\* QUERY the TSDB \*/
/\* query all TSL in TSDB by iterator \*/
fdb\_tsl\_iter(tsdb, query_cb, tsdb);
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/d1a825f095a6e5b3f0cbe08cad4602a5.png)
![img](https://img-blog.csdnimg.cn/img_convert/aad9d19656f48acad43f55777857467d.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/7ac26d3d563295d5aedf440f19ac85c8.png)
![img](https://img-blog.csdnimg.cn/img_convert/594f10e41ac4aaec35b433a867905cdb.png)
![img](https://img-blog.csdnimg.cn/img_convert/e044918fd6611265b26baf756ac3bb06.png)
![img](https://img-blog.csdnimg.cn/img_convert/b472afccd5b6c5e45687e51db749131d.png)
![](https://img-blog.csdnimg.cn/img_convert/3c4e8568550cd3a121da61407d4ec56e.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!