docker版jxTMS使用指南:站点的调整

本文讲解4.4版jxTMS中的站点的调整,整个系列的文章请查看:[docker版jxTMS使用指南:docker版jxTMS使用指南:4.4版升级内容

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

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

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

在4.0版中,设备device类是非常核心的模块,其主要负责:

  • 根据数据收发的情况来跟踪设备状态

  • 确定本设备接收到的数据该如何解析

  • 根据业务需要对接收到的数据进行处理

  • 确定本设备接收、处理后的数据该保存到哪张数据表中

  • 确定设备数据的保存策略【实时保存还是周期性保存,以及保存的周期】

  • 确定告警策略以在设备出现问题时发出告警

而站点site则只是一个逻辑上收容设备的存在,只是因为从业务逻辑上来说设备都是通过站点统一管理、集中配置、统一接收前端数据的,所以site类主要是以类函数来进行启动、配置等管理动作,业务方面只有一个最基本的数据接收函数:receive。

但随着更多类型的设备、各种接入方式的增多,站点的重要性就在三个方面凸显出来了:

1、如何与数据点打交道

目前已经有三种方式:

  • 通过MQTT推送原始数据

  • 类似modbus型设备的主动拉取

  • 通过MQTT推送自定义协议包

2、如何分发数据

笔者很想和数据源一样,内置一个自动分发数据的机制,但仔细研究过上述的数据采集方式后,由于推送模式和拉取模式的巨大差异,如果想强行统一,那干嘛不在数据源中就完成呢?!

当时既不考虑通过数据源来统一数据接收,自然就是因为接收数据的方式方法难以统一。

所以思考再三,最终还是根据站点类型分别实现各自的接收数据方法,而且具体的站点还可进一步的细化自己的数据接收。

3、如何根据业务需要来综合数据

前面在数据源时讨论这个问题。结合数据源时的讨论和上面site分类的考虑,在site中增加了数据处理接口:

def onReceive(self, type, data):#各站点自己的数据处理事件,默认不做任何额外的处理,相当于只转发#返回True代表接收并处理后的是需保存到数据库中的数据#返回False代表不要保存return data,Truedef recevieData(self, type, data):#具体site的数据处理函数,是site的数据处理流的入口,不应重载#和receive的区别在于,recevieData是站点自身处理数据工作流的入口#receive是推送模式下收并分发数据

供各种类型的站点在数据处理完毕后显式或隐式将数据回送给站点进行综合处理。

站点种类

考虑到上述问题,4.4版jxTMS将站点划分为如下的四种基础的站点类:

  • 单设备直接推送型,就是最基础的site类

  • 多设备推送型,site_multiDev_push类

  • 多设备自定义协议包推送型,site_packet类

  • 多设备拉取型,site_multiDev_poll类

后三者都直接或间接继承自site类,所以整体的设备管理、控制、配置和数据处理流都是一致的,区别只在于数据接收、分发、综合这三者的区别。

site

site完成设备管理、配置、数据保存【如果有的话】等最基础的管理和业务工作,之前已经讲述过,不复赘述。数据方面:

1、接收

以自己的站点名订阅MQTT主题,然后等待现场设备通过MQTT推送给自己,数据是设备直接发送的原始字节串,以utf8编码转为字符串。

2、分发

将转换好的字符串直接递交给自己的设备【就一台】。

3、综合

receive函数中已经隐式调用了recevieData函数进行了数据回送。

site类调整或增加的对象函数:

init(self, type, name, saveDataInterval=15)

站点的构造函数

参数:type:站点类型name:站点名saveDataInterval:默认的站点数据保存间隔,0则直接保存实时数据

receiveData(self, dn, data)

本站点接收数据的入口

参数:dn:设备名或自己约定的事件、命令等data:对应的数据或参数
返回值:无
说明:receiveData主要完成调用站点数据处理函数来处理数据,然后保存数据

onReceive(self, dn, data)

数据处理

参数:dn:设备名或自己约定的事件、命令等data:对应的数据或参数
返回值:rd:处理后的数据newData:接收到的是需要保存的数据,还是予以忽略的其它消息
说明:如果newData为True则保存rd【注意,不是原始的data,而是处理后的rd】默认的onReceive函数是:def onReceive(self, dn, data):return data,True

newOrmData(self)

获取一个新的站点数据对象

参数:无
返回值:ormSiteData:保存本类型site的数据对象,jxTMS会从回送的数据中根据本类的属性为其准备数据
说明:本函数默认返回None,即不保存任何站点数据

site_multiDev_push

构造函数同site,重写receive函数。

1、接收

以自己的站点名订阅MQTT主题,然后等待现场的数据采集器通过MQTT推送给自己。默认一次接收到的就是一个设备的一条消息【未必就一定会是数据,可以是一条数据中的一部分,也可以是命令、事件等】,数据为json格式,本站将其解析为dict。

2、分发

数据打包为json格式,本站将其解析为dict,其中的dn指示设备名,然后根据此设备名将数据直接转交给相应的设备。

3、综合

receive函数中已经隐式调用了recevieData函数进行了数据回送。

site_packet

构造函数同site,重写receive函数、addDevice。

1、接收

以自己的站点名订阅MQTT主题,然后等待现场的数据采集卡通过MQTT推送给自己。默认一次接收到的就是一个设备的一条消息【未必就一定会是数据,可以是一条数据中的一部分,也可以是命令、事件等】,数据格式为自定义协议包,本站将其解析为dict。

2、分发

自定义协议包的包名,指示系统状态报告、事件等,其它则视为设备名或类型【改写addDevice就是用类型取代设备名来添加设备,参考之前的4.2版数据源部分】,然后据此将数据转交给相应的设备。

3、综合

receive函数中已经隐式调用了recevieData函数进行了数据回送。

site_multiDev_poll

之前的数据源相关文章中已经介绍过了,拉取模式下数据源已经接管了整个数据流的处理包括回送机制,所以site_multiDev_poll的主要工作就是定义并为下属设备使用好数据源提供接口,然后重写receive函数以旁路推送模式下的数据送达。

构造函数:

**init(self, type, name, dataSourceType=‘modbus’, saveDataInterval=15,
Test=False, Debug=False)

参数:type:站点类型name:站点名saveDataInterval:默认的站点数据保存间隔,0则直接保存实时数据dataSourceType:数据源的类型,默认是modbusTest:数据源工作于测试模式,即数据不来自实际的拉取,而是由数据产生式模拟Debug:数据源工作于调试模式,对每一步都进行报告

dataSourceParams(self)

获取数据源配置参数

参数:无
返回值:指定数据源格式的数据源所需要的dict格式的配置参数
示例:#app/sinosoarSP30H/site_slave.py中给出的modbus数据源的配置参数是:def dataSourceParams(self):return {'afterPullDual':self._afterPull,'ip':'xx.xx.xx.xx','port':ppp,'taskInterval_milliseconds':500,'interval_seconds':300}

addWantReceiveOver(self, dn, receiveFunc)

为下属设备提供数据源添加某设备数据拉取结束的接口

参数:dn:设备名receiveFunc:其接收函数
返回值:无
示例:#app/sinosoarSP30H/device_pcs_slave.py中:self._informMain = mySite.addWantReceiveOver(name,self.receive)

addWantReceive(self, t, productStatement, compareStatement)

为下属设备提供数据源添加拉取数据点参数的接口

参数:t:约定的数据点拉取参数元组,具体参考前述数据源相关文章以及数据源的定义productStatement:数据产生式compareStatement:数据校验式
返回值:无
示例:#app/sinosoarSP30H/device_pcs_slave.py中:self.site().addWantReceive(t,productStatement,compareStatement)

最后,旁路receive函数:

#拉取模式不用
def receive(self, msg):pass

参考资料:

jxTMS设计思想

jxTMS编程手册

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

如何用jxTMS开发一个功能

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

jxTMS的HelloWorld

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

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

相关文章

zabbix钉钉报警

登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群内. 然后点击群右上角 的"群机器人"->"添加机器人"->"自定义", 记录该机器人的webhook值。 添加机器人 在钉钉群中,找到只能群助手 添加机器人 选择自定义机…

【玩转Linux】文件的一些概念

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

怎样接入chatGPT

官网链接: OpenAI platform

Unity Coroutine 协程

Unity Coroutine 是一种在 Unity 引擎中实现异步编程的技术,它可以让你在多个帧中分段执行一个函数,而不是一次性地执行完毕。Coroutine 可以使用 yield 语句来暂停和恢复执行,从而实现一些复杂的逻辑和效果,如时间延迟、循环动画…

UE4/5C++多线程插件制作(十四、MTPAbandonable)

目录 MTPAbandonable h实现 cpp实现 MTPMarco.h 首先是异步任务的宏定义部分:

IDEA+SpringBoot +ssm+ Mybatis+easyui+Mysql求职招聘管理系统网站

IDEASpringBoot ssm MybatiseasyuiMysql求职招聘管理系统网站 一、系统介绍1.环境配置 二、系统展示1. 登录2.注册3.首页4.公司5.关于我们6.我的简历7.我投递的简历8.修改密码9. 管理员登录10.我的信息11.用户信息12.职位类别13. 职位列表14. 公司列表15. 日志列表 三、部分代码…

【Rust 基础篇】Rust 封装

导言 在 Rust 中,封装是一种面向对象编程的重要概念,它允许将数据和相关的方法组合在一起,形成一个独立的单元。通过封装,我们可以隐藏数据的实现细节,只暴露需要对外部使用的接口,从而提高代码的可维护性和安全性。本篇博客将详细介绍 Rust 中封装的概念,包含代码示例…

Visual Studio 2022 cmake配置opencv开发环境

1. 环境与说明 这里我用的是 widnows 10 64位,Visual Studio 用的 Visual Studio Community 2022 (社区版) 对于Android开发工程师来说,为什么要使用Visual Studio 呢 ? 因为在Visual Studio中开发调试OpenCV方便,可以开发调试好后&#xf…

Transformer+医学图像最新进展【2023】

Transformer主要用于自然语言处理领域。近年来,它在计算机视觉(CV)领域得到了广泛的应用。医学图像分析(MIA,Medical image analysis)作为机器视觉(CV,Computer Vision)的一个重要分支,也极大地受益于这一最先进的技术。 机构:新加坡国立大学机械工程系、中山大学智能系…

基于Eisvogel模板的Markdown导出PDF方法

Requirements 模板地址:Wandmalfarbe/pandoc-latex-template Pandoc:Pandoc官网 Latex环境:例如TexLive Pandoc参数 --template"模板存放位置" --listings --pdf-enginexelatex --highlight-style kate -V CJKmainfontSimSun -V C…

安装nvm管理node

1.首先卸载已存在的node cmd输入node提示:‘node’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 2.安装nvm 安装地址 :Releases coreybutler/nvm-windows GitHub 本人选择1.1.7 输入nvm打印出了nvm的指令列表,说明…

SpringBoot整合JDBC

1. 创建一个新的Spring Boot项目或者使用现有的Spring Boot项目作为基础 2. 在项目的pom.xml文件中添加Spring Boot JDBC和MySQL依赖 打开pom.xml文件&#xff0c;添加以下依赖: <dependency><groupId>org.springframework.boot</groupId><artifactI…

IDEA+SpringBoot + Mybatis + Shiro+Bootstrap+Mysql资产设备管理系统

IDEASpringBoot Mybatis ShiroBootstrapMysql资产设备管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.用户新增3.用户设置4.岗位管理5. 审批节点6. 人员查询7. 组织设置8. 人员调整9.角色设置10.角色模块映射11.模块设置12.应用模块13.光纤交换机14.服务器15.网…

C++之文件操作

1.C文件操作 C中文件操作头文件:fstream。   文件类型&#xff1a;文件文件和二进制文件。 文件操作三大类&#xff1a;     ofstream 写操作     ifstream 读操作     fstream:读写操作 文件打开方式&#xff1a; 标志说明ios::in只读ios::out只写,文件不存在则…

大数据面试题:HBase读写数据流程

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 参考答案&#xff1a; 1、写数据流程 1&#xff09;Client先访问zookeeper&#xff0c;获取hbase:meta表位于哪个Region Server。 2&#xff09;访…

SQL 常见函数整理 _ LTRIM/RTRIM (去除字符串首尾空字符)

LTRIM() 1. 用法 用于去除字符串左侧&#xff08;开头&#xff09;的空格或指定的字符。它返回一个新的字符串&#xff0c;其中左侧的空格或指定字符被删除。 2. 基本语法 LTRIM ( string )参数说明&#xff1a; string&#xff1a;必需&#xff0c;要去除空格或指定字符的字…

使用TensorFlow训练深度学习模型实战(上)

大家好&#xff0c;尽管大多数关于神经网络的文章都强调数学&#xff0c;而TensorFlow文档则强调使用现成数据集进行快速实现&#xff0c;但将这些资源应用于真实世界数据集是很有挑战性的&#xff0c;很难将数学概念和现成数据集与我的具体用例联系起来。本文旨在提供一个实用…

P1149火柴棒等式题解

P1149[NOIP2008 提高组] 火柴棒等式 题目描述 给你 n n n 根火柴棍&#xff0c;你可以拼出多少个形如 A B C ABC ABC 的等式&#xff1f;等式中的 A A A、 B B B、 C C C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0 0 0&#xff09;。用…

详解Mybatis查询之resultType返回值类型问题【4种情况】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 引言一、查询单行数据返回单个对象二、查询多行数据返回对象的集合三、 查询单行数据返回Map[Key,…

STN:Spatial Transformer Networks

1.Abstract 卷积神经网络缺乏对输入数据保持空间不变的能力&#xff0c;导致模型性能下降。作者提出了一种新的可学习模块&#xff0c;STN。这个可微模块可以插入现有的卷积结构中&#xff0c;使神经网络能够根据特征图像本身&#xff0c;主动地对特征图像进行空间变换&#x…