【边缘计算网关教程】8.ModbusTCP采集存储Influxdb

前景回顾-【边缘计算网关教程】7.Modbus协议转MQTT协议-CSDN博客

需求概述

💡注:使用Influxdb数据库节点,需要插上micro sd卡才可以

本章节主要实现一个流程:EG8200每10秒采集一次Modbus TCP数据存入Influxdb数据库,并且每分钟从Influxdb数据库中取6条数据打包上报。

Modbus TCP数据采集此处不做过多赘述,可参考其他案例介绍。下文默认已经采集到Modbus TCP数据。

  数据上报格式

[{  "time": "2023-12-20 14:50:13",  "value1": 12573,  "value2": 12568,  "value3": 12561,  "value4": 12557,  "value5": 12552,  "value6": 12545,  "value7": 12540,  "value8": 12535}, {  "time": "2023-12-20 14:50:13",  "value1": 12573,  "value2": 12568,  "value3": 12561,  "value4": 12557,  "value5": 12552,  "value6": 12545,  "value7": 12540,  "value8": 12535}, {  "time": "2023-12-20 14:50:13",  "value1": 12574,  "value2": 12569,  "value3": 12562,  "value4": 12558,  "value5": 12553,  "value6": 12546,  "value7": 12541,  "value8": 12536}, {  "time": "2023-12-20 14:50:14",  "value1": 12574,  "value2": 12569,  "value3": 12562,  "value4": 12558,  "value5": 12553,  "value6": 12546,  "value7": 12541,  "value8": 12536}, {  "time": "2023-12-20 14:50:14",  "value1": 12575,  "value2": 12570,  "value3": 12563,  "value4": 12559,  "value5": 12554,  "value6": 12547,  "value7": 12542,  "value8": 12537}, {  "time": "2023-12-20 14:50:14",  "value1": 12575,  "value2": 12570,  "value3": 12563,  "value4": 12559,  "value5": 12554,  "value6": 12547,  "value7": 12542,  "value8": 12537}]

需求分析

第一步:配置并连接数据库

第二步:创建一个数据库

第三步:指定使用新创建的数据库

第四步:读取Modbus TCP数据并存入指定表中

第五步:从数据库中读取6个数据

第六步:将读取出来的数据打包

第七步:将打包的数据发送到MQTT

需求实现

  第一步:配置并连接数据库

首次连接EG8200的Influxdb数据库按照默认的配置即可无需修改

  第二步:创建一个数据库

创建一个数据库需要使用到sql语句 CREATE DATABASE myDatabase ,这条语句的意思是创建一个名字叫做myDatabase的数据库。按照下面视频的方式创建,日志窗口打印[empty],说明数据库创建成功

  第三步:指定使用新创建的数据库

在第一步创建了一个名字叫做myDatabase的数据库,现在需要使用这个数据库,将Influxdb的一个配置名Database改成myDatabase

  DO能控制的设备

从节点库里面拿出一个写时序数据库节点,选择前面步骤已经添加的配置信息,并将表名填写在Measurement,

这里使用myTable作为表名

  第五步:从数据库中读取6个数据

通过函数节点构造sql读取指令,通过时间查询最近6条数据

上面视频中使用到的函数代码

if (global.get("startTime") == undefined || global.get("startTime") == null) global.set("startTime", new Date().getTime())var startTime = global.get("startTime")var temp = new Date(startTime).toISOString()var table = "myTable"msg.query = "SELECT * FROM" + " \"" + table + "\" " + " WHERE time > '" + temp + "' LIMIT 6"return msg;

  第六步:将读取出来的数据打包

使用函数节点将数据封装成对应的json字符串

上面视频中使用到的函数代码

function dateFormat(fmt, timestamp) {    let ret;    const opt = {        "Y+": timestamp.getFullYear().toString(), // 年        "m+": (timestamp.getMonth() + 1).toString(),  // 月        "d+": timestamp.getDate().toString(), // 日        "H+": timestamp.getHours().toString(), // 时        "M+": timestamp.getMinutes().toString(), // 分        "S+": timestamp.getSeconds().toString() // 秒        // 有其他格式化字符需求可以继续添加,必须转化成字符串    };    for (let k in opt) {        ret = new RegExp("(" + k + ")").exec(fmt);        if (ret) {            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))        };    };    return fmt;}// const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())var dataList = msg.payloadif (dataList.length == 0) {    node.error("数据库无数据请检查")    return}dataList.forEach(item => item.time = dateFormat("YYYY-mm-dd HH:MM:SS", new Date(item.time)))global.set("startTime", new Date(dataList[dataList.length - 1].time).getTime() + 1000)msg.payload = JSON.stringify(dataList)return msg

  第七步:将打包的数据发送到MQTT

客户端ID:网关SN

用户名:网关SN

密码:EG87654321

发布主题:${sn}/send

总结

本章节介绍了一个相对复杂的流程,旨在表述网关所具备的能力,因此并未对程序的安全性、稳定性、灵活性等方面做优化。通过理解本流程,相信你已经对网关的可视化编程有了一定的熟悉。接下来,深入学习每个节点的功能用法吧,掌握它们将会为你制作更复杂的流程提供更多的选择和可能!

注意

MQTT配置节点导出时,不会携带用户名和密码。因此导入时需要重新录入用户名和密码

如上来源于官方授权公众号-微信公众平台 (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s/GkNHQ7oLKkVVs0LUVX5-MQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/801347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言: 今天跟大家唠唠如何用小money生 大money的方法,首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying,它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内,与AI进行几轮对话就能开发出一个可以解决实际…

pytorch学习(六):卷积层的使用

卷积函数的概念 卷积核从输入特征图的左上角开始,按照设定的步长(Stride)滑动。步长决定了卷积核每次滑动的像素数,这里我们假设步长 s1。在每次滑动时,卷积核与输入特征图对应位置的元素相乘,然后将这些乘…

ENSP中VLAN的设置

VLAN的详细介绍 VLAN(Virtual Local Area Network)即虚拟局域网,是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 以下是关于 VLAN 的一些详细介绍: 一、基本概念 1. 作用: - 隔离广播域&#xff1a…

Linux 安装 Docker Compose

Docker Compose 是一种用于定义、运行和管理多容器Docker应用程序的工具,通过YAML文件配置服务,实现一键启动和停止所有服务。 以下是如何在 Linux 系统上安装 Docker Compose 的步骤 1. 下载 Docker Compose 可执行文件 wget https://github.com/dock…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

暑期大数据人工智能企业项目试岗实训班

在数字化转型的浪潮中,大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前,全球各行各业都在积极推进数字化转型,不仅为经济增长注入新活力,也对人才市场结构产生了深刻影响,尤其是对数字化人才…

2024.7.16作业

使用结构体完成学生(学号、姓名、性别、成绩)管理系统 1> 使用菜单实现 2> 功能1:完成对学生信息的录入,确定人数,完成输入 2> 功能2:完成对学生信息的输出 3> 功能3:输出成绩最…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的,这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO(命名管道)在以只读模式打开时,如果没有其他进程以写模式打开该 FIFO,open 调用将…

ASP.NET Core----基础学习07----ViewStart ViewImports文件的使用

文章目录 1._ViewStart.cshtml的使用2.更换Layout文件3._ViewImports.cshtml文件的使用 1._ViewStart.cshtml的使用 step1: 在Views文件夹下面创建_ViewStart.cshtml文件 step2: 删掉视图文件中的Layout设置行 step3: 最终显示效果&#xff…

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现? 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏:http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中,有两个基本命令&#xff1…

企业智能制造赋能的环境条件为什么重要?需要准备什么样的环境?

在全球制造业不断演进的今天,智能制造已经成为推动行业创新和转型的关键力量。它不仅代表了技术的革新,更是企业管理模式和运营思路的全面升级。然而,智能制造的落地实施并非一蹴而就,它需要企业在环境条件上做好充分的准备&#…

Java设计模式的7个设计原则

Java设计模式的7个设计原则是面向对象设计领域中的重要指导方针,它们旨在提高软件系统的可维护性、可扩展性、可复用性和灵活性。以下是这7个设计原则的详细解释: 1. 开闭原则(Open-Closed Principle, OCP) 定义:一个…

tinymce vue拓展多图上传 实现拖拽切换位置,图片排序

实现功能:基于tinymce TinyMCE中文文档中文手册 拖拽图片排序,去掉全部上传按钮,点击保存上传图片并关闭弹窗,优化了一些交互提示 声明:本人不是做vue前端的,可能有些更好的方法实现拖拽或者其他一些开源…

TS 入门(五):TypeScript接口与类

目录 前言回顾高级类型与类型操作1. 接口a. 基本接口b. 可选属性和只读属性c. 函数类型接口d. 可索引类型e. 接口继承 2. 类a. 基本类b. 类的成员(属性和方法)c. 构造函数d. 继承和派生类e. 公有、私有和受保护的修饰符f. 静态属性和方法g. 抽象类 扩展知…

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook,用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应,useState 让函数组件也能拥有…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片,因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同,但图像(例如 JPG 格式)在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作…

设计模式-UML类图

1.UML概述 UML-统一建模语言,用来设计软件的可视化建模语言; 1.1 UML分类 静态结构图:类图、对象图、组件图、部署图动态行为图:状态图、活动图、时序图、协作图、构件图等 类图:反应类与类结构之间的关系&#xff0…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会,安全问题愈发受到重视。随着科技的进步,非法闯入智能监测摄像机应运而生,成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能,还集成了智能识别和报警系统,能够在第一时间内检测到潜在的入侵行…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题:《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源:Glasgow大学;爱丁堡大学 连接:https://arxiv.org/abs/2406.13099 提示:写完文章后,目录可以自动生成,如何…