在上一篇文章 使用IOT-Tree Server和InfluxDB对采集数据进行记录 中,我们使用IOT-Tree Server中的InfluxDB模块和配置流程,实现了对监控设备接入数据标签的历史记录。
此文章是上述文章的后续,会接着介绍如何查询InfluxDB的历史数据,并且讲述如何使用这些数据------通过提供RESTful接口,把IOT-Tree Server变成了典型的后台系统。通过RESTful Api对前端提供调用接口。整个过程几乎不需要写程序,并且可以在几分钟之内完成。
如果你对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 V2 1"这个节点,左边节点列表下方出现这个节点的子节点,选中"Read By Tags"拖拽到绘图区,如图:
此节点是InfluxDB的子节点,双击打开我们可以看到,选择Measurement的下拉选择框会列举出对应数据源的所有内容,我们选择"mytable1"这是上一篇文章我们在"JS函数"节点中,使用JS语言转换JSON数据时使用的名称。
接着我们可以选择一个或多个有历史记录的标签,并每个配置对应一个变量值Var------这个会成为输出JSON对应的属性值。如下:
完成之后,我们需要验证一下这个节点,最简单的是在此节点前方放置一个"手动触发器",result输出端子配置一个"调试"节点,点击手动触发器,触发消息,就可以在调试节点中看到结果,如下:
展开调试里面的消息payload,可以看到输出数据:
至此,我们就完成了读取标签历史数据的节点配置。那么接下来,我们如何使得这些数据能够支持外部访问呢?这是一个物联网系统最基本的需求。
2 配置RESTful Api接口
2.1 RESTful模块配置
IOT-Tree Server消息流新增了一个RESTful模块。我们在"网络"分类下面,选择RESTful服务节点,拖拽到绘制区。双击打开编辑对话框,填写Module Name=m1。确定之后,如下:
选中此节点,列表下方出现子节点,"请求","应答"。各自拖拽添加,如下:
其中,请求应答应该配对使用------内部使用相同的Api名称即可。双击打开"请求 1"节点,填写
Api Name=api1
填写完成之后,再次打开对话框,注意里面的Access Path,这是外部RESTful访问URL,其中localhost可以在你部署环境使用nginx等软件做域名映射转换而修改(在此不做展开说明了):
确定,然后双击打开"应答 1",在Api Name下拉框选择api1,最终形成配对的请求和应答,效果如下:
其中,"请求1"节点在上述的URL被访问收到信息时,就会触发消息输出。我们只需要在这个后面接收处理消息,然后把结果输出到"应答1"节点,就会自动完成RESTful的处理和响应过程。
2.2 组合历史数据和实时数据
为了方便前端UI展示,我们准备一个请求能够同时获取"Read By Tags 1"的历史数据和部分标签的当前实时数据。因此我们选择"接入与设备"分类下的"标签数据读取"节点,放入绘制区,双击打开对话框修改如下内容:

注意:我们把节点标题改成了"rt",这个会在后面被使用。结果如下:

我们双击上方的"Read By Tags 1"节点,把里面的标题改成"his"。然后,在分类"功能"下面选择"JS函数"拖拽添加在his和rt后方。如图:

很明显,我们要使用这个JS函数对his和rt两个节点的输出做组合形成一个JSON消息并输出。双击"JS函数 2"节点,修改标题=合并JSON,并点击"初始化JS"框,填写节点初始化变量:
javascript
var cached_ob={}

此代码会在节点中运行一次,并且可以在"运行JS"框中被使用。
选择"运行JS"框:填写如下JS代码:
javascript
let t = from_node.getTitle() ;
cached_ob[t] = payload;
return cached_ob;

这个代码根据消息来源节点的标题作为key,把消息负载payload存入cached_ob中,然后返回输出这个对象,达到消息组合的效果。如果我们把前面的his和rt两个节点作为输入,那么组合后的消息格式为:
javascript
{
rt: {...} //rt节点消息
his: {...} //his节点消息
}
2.3 完成RESTful消息网络
我们把整个过程连接起来,就完成了配置过程,如图:

既简单又轻松,对吧
3 测试总结
3.1 测试
我们使用浏览器REST客户端插件进行测试,如下:

注意,我们"请求 1"节点设置了json_object作为输入,所以请求必须是{}结构。或者我们可以设置请求时间参数:
javascript
{"start_dt":1769862684323,"end_dt":1769862784323}
运行效果如下:

3.2 总结
可以发现,使用IOT-Tree Server要为相关的应用开发提供后端Api几乎不费吹灰之力。
这里有个建议,如果你没有前端支持但要完成前端数据展示功能,可以使用AI。因为当前LLM对于前端的代码生成支持的非常好。你完全可以把上述的Api输出数据扔给AI,然后让它给你做出一个前端界面。