很多IOT-Tree的使用者问我,他们接入很多设备之后,采集的数据历史记录在哪里获取,早期这个问题对我来说有点尴尬:为了能够不让整个软件太复杂,在支持消息流之前,我都建议他们自己建立数据库,然后根据自己的需要读取标签数据做数据记录。
现在不一样了,消息流中的InfluxDB模块相关功能已经比较完善,完全可以使用此模块自动对关心的标签数据进行记录存储。如果你有这样的需求,那就跟着试试吧。
如果你对IOT-Tree Server不了解,可以看如下内容:
IOT-Tree Server是个开源物联网软件,可以作为组态软件成为自动化系统的上位软件。她提供了各种设备接入、数据组织管理、数据分享使用、消息流控制逻辑和人机交互多个方面的功能。当然,你也可以仅仅使用这个软件作为数据采集终端或边缘计算的软件。
这是IOT-Tree Server相关的系列文章,你可以参考其他文章更多了解IOT-Tree能给你带来的好处:
使用IOT-Tree Server通过MC协议连接三菱Q系列PLC
使用IOT-Tree Server通过FINS协议连接欧姆龙CP2E-N系列PLC
系列文章还包含IOT-Tree完成一个具体项目的过程,非常详细,如下:
1 InfluxDB时序数据库
InfluxDB 是一个开源的时序数据库(Time Series Database, TSDB),专为处理时间戳数据设计,适用于监控、分析、物联网(IoT)和应用性能管理等场景。由 InfluxData 公司开发,采用 Go 语言编写,具有高性能、高压缩率和易用性等特点。
数据库有如下重要的基本构成:
Measurement:类似关系型数据库的表,用于存储相关数据(如 cpu_usage)。
Tags:索引字段,用于高效查询(如 host=server1)------请注意和IOT-Tree的标签Tag区别
Fields:实际存储的数值数据(如 value=0.64),不支持索引。
Timestamp:每条数据必须包含的时间戳。
很明显,InfluxDB非常适合存储IOT-Tree Server接入的设备数据。如果你还没有使用过,建议试试。
1.1 InfluxDB安装配置
InfluxDB安装配置非常简单,就一个influxd.exe文件。启动之后会自动创建数据存储目录,当然也可以配置脚本启动,指定存储数据的位置。具体网络上资料很多,本文不展开讲了。
在实际项目部署中,如果你使用windows系统,建议使用nssm.exe配置此数据库为一个服务,可以随着系统启动自动启动。
2 IOT-Tree Server配置过程
IOT-Tree Server中的项目配置你可以参考上面提到的相关资料。本文假设你已经配置好了一个能够正常运行的项目,现在需要对项目中的部分标签数据进行记录,以方便后续查询使用。
2.1 配置InfluxDB数据源
访问IOT-Tree Server管理主界面(如http://localhost:9090/admin)。在数据源区域点击添加:

弹出的类型选择"InfluxDB",然后进入对应的InfluxDB界面:

其中,URL是对应的InfluxDB地址和端口,Token是访问密钥,Org 和Bucket根据你的配置添加即可。
添加成功之后,点击这个数据源的链接测试按钮,提示成功说明数据源配置完成。

2.2 配置记录消息流
接下来你就可以配置对你关心的采集数据标签进行记录存储。
2.2.1 新建一个消息流

点击新增的"保存记录"消息流,右边出现了此消息流的配置界面。
2.2.2 添加并设置InfluxDB模块
在存储分类下面选择InfluxDB V2节点,拖拽到绘制区,新增InfluxDB节点,如下:

双击新增的"InfluxDB V2 1"节点,在弹出窗口中选择之前新增的数据源,如图:

2.2.3 新增InfluxDB Writer子节点
选中"InfluxDB V2 1"节点,左边列表下方滑出相关的所有子节点,选择"InfluxDB Writer",拖拽到绘图区

InfluxDB Writer节点会根据输入的JSON格式消息自动写数据记录到InfluxDB数据源中。要求的格式如下:
{
measurement:"mm01",
ts:232123123, //时间戳毫秒
fields:[
{n:"field_name",v:3.14},
{n:"field_2",v:true}
]
}
2.2.4 新增设置"标签变化触发器"和格式转换
在"接入和设备"分类中,选择"标签变化触发器",拖拽到区域,双击弹出配置对话框选择我们关心的数据采集标签。
|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
|
|
|

标签变化触发器可以监听被选择的标签,当项目在运行过程中,标签值发生变化,就会触发JSON格式消息,里面有标签路径,标签值及更新时间毫秒数,格式如下:
{"tag_path":"xxx.xxx.xx","tag_val":3.14,"updt":123456788}
很明显,我们需要对此消息进行格式转换,转换为上面"InfluxDB Writer"需要的输入格式。这里我们使用"JS函数",同样的,在"功能"分类下面,选择"JS函数"节点拖拽到绘制区。

双击打开此节点编辑对话框,在JS编辑区写入如下JS转换代码:
javascript
let fd={n:payload.tag_path,v:payload.tag_val}
//return payload for out msg ,null will has no out msg. [] for idx output
return {measurement:"mytable1",ts:payload.updt,fields:[fd]} ;

转换输出数据写入measurement=mytable1(这个类似关系数据库的Table)。如果不存在,InfluxDB会自动建立。而fields里面只有一个数据,数据名称n=tag_path,v=标签值。
2.2.5 关联节点完成流程
到此,我们就可以把这几个节点消息流向进行关联:

这样整个记录流程就完成,启动项目之后,标签变化触发器会根据配置监听的标签自动触发消息,并通过此流程写入到InfluxDB中。
你也可以添加"调试"节点,查看运行过程中消息流的消息。如图:

3 记录结果和总结
3.1 在InfluxDB中查看记录数据
访问InfluxDB管理界面http://localhost:8086。到里面查看数据如下:

3.2 总结后续处理
从上可以看出,使用IOT-Tree Server项目中的消息流和内置的InfluxDB模块节点,可以非常轻松的实现设备数据的采集和历史记录------整个过程也就几分钟的事。
数据已经进入InfluxDB,你可以基于InfluxDB对记录的历史数据进行后续处理和展示。
在后续文章中,我会继续讲述如何使用InfluxDB中的Read By Tags节点查询记录标签的历史数据。并且如何使用RESTful模块节点把实时数据和历史数据进行组合,形成Api给前端展示提供数据接口。------整个过程也是几分钟的事。