docker版jxTMS使用指南:使用jxTMS采集数据之二

本文是如何用jxTMS进行数据采集的第二部分,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容

docker版本的使用,请查看:docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

4.2版jxTMS的说明,请查看:4.2版升级内容

设备对数据的处理

设备接收到站点递交的消息后,会依次完成如下的工作:

1、根据配置用相应的策略来解析所接收到的消息

不同的设备有自己独特的编码方式,所以相应的解码工作单独抽离出来由该设备的策略来实现。当然,有的解码工作已经由站点在提取设备标识时就已经完成了,如使用自定义协议包传送数据的站点。

解析策略一般单独编写,然后注册到系统中。代码文件应放到app的相应目录中,并依次在各目录的__init.py__文件中引用。

main.py文件的加载顺序是先import app和module,然后再执行站点的初始化【加载站点和设备】,这就可以在站点加载时正确引用到相应的策略了。

2、触发数据接收事件来对数据做需要的处理

这里所说的处理主要指数据的转换、修正等针对数据本身的处理,如潮位仪收到测得的潮位数据后,要根据潮位仪安装点的标高换算成潮水的实时水位。

在业务上,很多时候我们还需要利用设备数据来启动业务处理。但笔者认为,为了提高系统的稳定性,最好将业务处理与此处所说的数据处理分隔开来,以最大化的降低代码的耦合度。

那么,不在此处启动业务处理,那在什么时候呢?!请参考之前的【本地数据总线】一文,笔者就是基于此种考虑,才增加了数据总线机制。

在需要执行业务处理时,通过向数据总线注册一个兴趣点来抄收设备接收并处理好的数据,然后完成需要的业务操作,从而将业务处理代码从整个设备数据处理流中分离出来,不会对设备的数据处理与保存过程产生任何干扰与影响。

尤其是在业务频繁变动的场景中,此种方案更具稳定性与可靠性。

3、设备数据的保存

接收并处理完毕的设备数据会被保存到数据库中,而这就需要完成两个动作:

  • 根据配置将处理后的设备数据保存到数据库中的哪个数据表中

  • 由于设备数据的采集频率可能会很高,如果数据的短期变化又不太重要,可以必要综合考虑是实时保存所有设备数据,还是周期性保存最新的设备数据

当给出了设备数据的保存间隔【saveDataInterval】参数时,该设备的数据将以saveDataInterval【单位:分钟】为间隔进行保存,如果该参数为0,则实时保存每一个新数据。

此外,由于设备的数据采集频次一般都很高,所以大多数情况下,都需要进行分表。如果需要分表的话,对于启动了jxTMS主系统的主站来说,只要在data文件中相应的数据类定义时指定rename属性即可。

注:如果是不启动jxTMS主系统的从站,如用于现场modbus设备采集,这些数据如果也需要保存到现场的数据库中,并同样需要分表,也很简单,一是【app/data/DieselGenerator.py】中展示的,提供一个_sql_createTable建表语句【通过查询主站所创建的该表的建表语句获得】;二是将此建表语句注册到jxTMS中:

ORM.registerSQL_createTable('DieselGenerator',_sql_createTable,renameType='day')

最后,在main.py中调用:

#启动创建需要分表的调度器
ORM.startRenameTableScheduler()

从站即会同样完成所有注册建表语句时指定了renameType的分表工作。

原则上,我们建议尽可能的使用jxTMS主系统来完成分表工作,原因很简单,风险有点高。python侧来执行分表工作,就意味着,真有需要调整data中的数据类定义的时候,必须同时完成:

  • 修改data文件中的数据类定义,否则java的jxTMS主系统在管理时会出错

  • 修改mysql中该数据库表的定义【新的表会自动更新】

  • 修改python侧的建表语句,并重启python侧的代码

前两者都比较简单,尤其是mysql比较熟悉的情况下;但后者,必须进行相关的全业务测试,尤其是还需要重启服务器,所以风险高了很多。

分表数据的查询,可以利用前面文章中讲解过的query对象【参考:数据查询】,非常的简便。

4、站点综合

一般情况下,站点都是管理方面的作用大于数据处理方面的作用,如开通、停运、对设备的管理/配置等。但有时也确实需要站点综合下属所有设备的数据以提供业务上的支撑。

如,配电系统的告警处理,管理方关心的是母线电压、储电系统的SOC等配电系统的综合性健康指标。但这些指标却是分别采集自下属的各个设备的某几个数据点。

这种情况下,以站点来统一过滤并综合这些关键指标就是必然的选择了。

因此,站点在接收并提取出设备信息后,调用distribute函数来将接收到的数据分发给相应的设备:

def distribute(self, d, data):

其使用一般是在站点的receive中,如site_multiDev_push类型的站点:

def receive(self, bsMsg):s = str(bsMsg,"utf8")js = json.loads(s)dn = js.get('dn')if not dn is None:d = self.getDev(dn)if not d is None:self.distribute(d,js)

distribute在向下属设备分发数据后,会将设备回传的数据回传给站点内部的receiveData函数,以完成站点的数据综合处理框架。该框架完成:

  • 设备对站点的通知,目前主要是跟踪状态改变以完成相应的告警处理

  • 站点触发onReceive事件来对设备回送的数据进行必要的综合

  • 如果必要【重载newOrmData函数并返回站点数据对象】,保存【实时或周期性】站点综合后的数据

5、数据联动

数据处理完毕,设备会通过数据总线发送自己接收并处理完毕的数据,所有对该设备的数据感兴趣者,都可以注册到数据总线上,接收到此新收数据事件并执行自己的处理。

前文说过,jxTMS以此种方式实现数据处理与业务处理的隔离,以提供更好的灵活性、弹性。比如,不停机重启的动态升级业务功能。

所以,使用jxTMS时应尽可能的将数据方面的处理与业务方面的处理区分出来,在设备与站点的onReceive事件【需要的话】中只完成数据转换、调整、综合、加工等工作。和业务相关的处理则通过监听数据总线的方式放到另外的代码模块中完成。

这种方式虽然看起来比较繁琐,而且效率有些低,但由于充分的隔离了数据处理与业务处理,所以业务的变动不会干扰到数据处理框架的正常工作,使得不管什么样情况下,总能稳定而可靠的接收、处理并保存正确的数据。

目前,数据总线还只是本地的数据总线,有需要的话,数据总线可以基于MQ实现异机联动,就如jxTMS的java侧管控平台那样,从而进一步的提高数据处理的稳定性与可靠性。

6、告警

目前主要是针对超时未接收到设备数据发出告警。

现版本是将告警放到了设备处,考虑到收不到数据一是设备故障、二是线路故障,所以新版本会将告警收到站点处进行,以兼顾这二者。

新版本的故障告警机制是:

  • 某站点处于正常状态时【刚开机或当下属所有设备都正常工作时】第一次收到失联,则发送故障告警

  • 当出现失联后,每半个小时发送一次当前的故障综述,即当前失联设备的列表与第一次故障的时间点

  • 当所有失联设备都恢复正常后,发送一个全站恢复的通知

目前,jxTMS只有一个默认的钉钉告警策略,但如果服务器网络中断,则依然无法发出告警,所以如果对告警非常敏感,还应增加一个网络之外的告警通道或机制。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue + MapBox快速搭建

一、说明: 1.mapbox-gl自2.0版本开始不再开源,需要用户在官网申请key使用。 2.maplibre GL JS是一个开源库,它起源于 mapbox-gl-js 的开源分支。该库的初始版本(1.x)旨在替代Mapbox的OSS版本。简单来说maplibre是mapb…

异步场景加载详解

异步场景加载详解 介绍 异步场景加载是一种在Unity中加载场景的方式,它允许在加载过程中执行其他操作,并提供了加载进度的反馈。通过异步加载,可以避免加载大型场景时的卡顿现象,提高游戏的流畅性和用户体验。 方法 在Unity中…

C++——缺省参数

缺省参数的定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数的时候&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout << a << endl; } int main() { Func()…

【Kubernetes】Kubernetes之Pod详解

Pod 一、 Pod1. Pod 基础概念2. 在 Kubrenetes 集群中 Pod 使用方式2.1 pasue 容器2.2 kubernetes 中的 pause 容器提供的功能 3. Pod 的概念和结构组成4. Pod 的分类5. Pod 容器的分类5.1 基础容器&#xff08;infrastructure container&#xff09;5.2 初始化容器&#xff08…

07 |「异步任务」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、进程与线程1、进程2、线程 二、实现三、异步任务加载器 一、进程与线程 1、进程 进程(Process)是操作系统分配资源的基本单位,它是一个执行中的程序实例&#xff1b;每个进程都有自己独立的内存空间,不同…

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制&#xff1f; Flink 使用 轻量级分布式快照&#xff0c;设计检查点&#xff08;checkpoint&#xff09;实现可靠容错。 30、什么是 Checkpoin 检查点&#xff1f; Checkpoint …

百度 amis 当成 UI 库用

百度 amis 当成 UI 库用 1.获取到这些 amis 对外提供的方法 var amisLib amisRequire(amis);// 获取到这些 amis 对外提供的方法。 2.js中使用百度amis中 confirm var name"name";amisLib.confirm(请确认删除 name !,"删除").then((confirmed) > {if…

如何进行游戏平台搭建?

游戏平台搭建涉及多个步骤和技术&#xff0c;下面是一个大致的指南&#xff1a; 市场调研和定位&#xff1a;首先&#xff0c;要了解游戏市场和受众的需求&#xff0c;选择适合的游戏类型和定位。 选择平台类型&#xff1a;决定是要搭建网页平台、移动应用平台还是其他类型的…

群晖6.X便捷的安装cpolar内网穿透

群晖6.X便捷的安装cpolar内网穿透 文章目录 群晖6.X便捷的安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展&#xff0c;以及数据…

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布&#xff0c;进行有效的推理和学习&#xff0c;以及解决各种实际问题&#xff0c;如图…

Redis小例子

MAC电脑下Redis的安装&#xff1a; brew install redis下面给一个Java操作redis的小例子 import redis.clients.jedis.Jedis;public class Demo {public static void main(String[] args) {// 创建 Jedis 客户端实例&#xff0c;连接到本地 Redis 服务器&#xff0c;默认端口…

RedisDesktopManage

RDM 简介下载安装 简介 RedisDesktopManager&#xff08;RDM&#xff09;是一个开源的跨平台图形界面工具&#xff0c;用于管理和操作 Redis 数据库。它提供了一个用户友好的界面&#xff0c;使用户能够轻松地连接、浏览、查询和修改 Redis 数据&#xff0c;而无需使用命令行界…

教你10分钟内学习如何CSS 设置网页打印时的样式

本文将教您开始为要打印的页面编写CSS所需要的一切提供帮助。 media 规则 If you’ve done any responsive design, you’ll already know about the media rule. As well as different screen sizes, media also lets you target “print” media. Here’s an example: 如果…

竞赛项目 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

【Java】一只小菜坤的编程题之旅【3】

文章目录 1丶判定是否互为字符重排2、杨辉三角3丶某公司的1个面试题&#xff08;字符串包含问题&#xff09; 1丶判定是否互为字符重排 这个题我们用一个非常简单的思想就能实现&#xff0c;我们先将字符串转换为字符数组&#xff0c;然后对字符数组进行排序&#xff0c;然后再…

el-radio单选框,取消选中

1.背景&#xff1a;在公司开发需求中有一个选择颜色的单选框&#xff08;黑色&#xff0c;白色&#xff09;&#xff0c;每种颜色选择后均支持取消选中&#xff0c;可是el-radio标签不支持取消选中。 2.解决&#xff1a; 方法1: <el-radio-group v-model"radioColo…

【Apollo】自动驾驶的平台背景,平台介绍

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

spring boot 集成 jetcache【基础篇:@Cached、@CreateCache、@CacheRefresh】

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/129832925 目录 前言 版本 配置通用说明 项目结构 代码 启动类 实体类 基础使用——增删改查&#xff08;Cached、CacheInv…

opencv实战项目 手势识别-手势控制键盘

手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&#xff08;封装调用&am…

虚拟机安装 Ubuntu桌面版,宿主机无法访问虚拟机 ufw 防火墙简单使用

虚拟机安装 Ubuntu桌面版&#xff0c;宿主机无法访问虚拟机 问题处理安装ssh服务ufw防火墙 放行ssh服务ufw 常用命令 问题 本次安装使用的 ubuntu-22.04.2-desktop-amd64 &#xff0c;网络连接使用的是桥接&#xff0c;查看ubuntu的ip是正常的&#xff0c;与宿主机在同一个网段…