当前位置: 首页 > news >正文

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

相关文章:

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

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

element ui input 深层循环v-model绑定默认数据删除不了的情况

例子&#xff1a; 在项目开发中遇到的&#xff0c;简单记录一下 <el-input style"width: 180px"v-model"item.dataForm"input"handleChangeDataForm($event)"type"number"placeholder"请输入1-2的数值"size"smal…...

GBDT的参数空间与超参数优化

目录 1. 默认参数下的GBDT与其它算法的对比 2. 基于TPE对GBDT进行优化 step1&#xff1a;建立benchmark step2&#xff1a;定义参数init需要的算法 step3&#xff1a;定义目标函数、参数空间、优化函数、验证函数 step4&#xff1a;训练贝叶斯优化器 step5&#xff1a;修…...

多线程练习——抽奖箱

题目&#xff1a; 分析以下需求&#xff0c;并用代码实现&#xff1a; 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,900,2,80,300,700};创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”&#xff0c;“抽奖箱2”&#xff0c;随…...

RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析

🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…...

Windows 11的最新人工智能应用Windows Copilot面世!

Windows Copilot是Windows 11预览版中的一项AI辅助功能。 Windows 11还包括设置应用程序的更改&#xff0c;更广泛的支持压缩文件格式。 上个月&#xff0c;微软宣布将继续其将ChatGPT应用于所有产品的冒险之旅&#xff0c;推出了名为Copilot的新Windows 11功能。几个月前&…...

Mac 预览(Preview)丢失PDF标注恢复

感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐&#xff01; 辛苦用预览在pdf上做的阅读标记&#xff0c;关闭后打开全丢失了&#xff0c;推荐尝试下网站导入文件进行恢复&#xff1a; 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…...

4.5. 方法的四种类型

文章目录 1、无参数无返回值的方法2、有参数无返回值的方法3、有返回值无参数的方法4、有返回值有参数的方法5、return 在无返回值方法的特殊使用 1、无参数无返回值的方法 // 无参数无返回值的方法(如果方法没有返回值&#xff0c;不能不写&#xff0c;必须写void&#xff0c…...

四旋翼无人机使用教程

文章目录 前言一、检查遥控器电源开关混控拨码开关微调开关飞行模式刹车开关行程开关接收机对码 二、检查飞机检查接线 三、解锁并飞行 前言 PX4固件 QGC地面站 Pixhwak飞控 Mc6c遥控器 开源飞控博大精深&#xff0c;欢迎广大爱好者加博主微信名片&#xff0c;一起学习交流。…...

优化 PHP 数据库查询性能

优化 PHP 数据库查询性能可以从以下几个方面入手&#xff1a; 使用索引&#xff1a;在数据库中创建适当的索引可以大大提高查询性能。索引可以加快数据的查找速度&#xff0c;特别是在大型数据库中。选择合适的数据类型&#xff1a;选择正确的数据类型可以减少存储空间的占用&…...

vue 使用stompjs websocket连接rabbitmq

1. 首先确保rabbitmq服务已开启web-stomp 1.1 登录rabbitmq web控制台 1.2 在overview目录下 下拉找到Ports and contexts 看列表有没有http/web-stomp 1.3 如果没有需要开启 window/centos 进入rabbitmq安装目录的bin目录下执行rabbitmq-plugins enable rabbitmq_web_stomp ra…...

com.android.ide.common.signing.KeytoolException:

签名没问题但是提示Execution failed for task :app:packageDebug. > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable > com.android.ide.common.signing.KeytoolException: Failed to read ke…...

leetcode 1870. Minimum Speed to Arrive on Time(准时到达的最小速度)

需要找一个speed, 使得dist[i] / speed 加起来的时间 < hour, 而且如果前一个dist[i] / speed求出来的是小数&#xff0c;必须等到下一个整数时间才计算下一个。 speed最大不会超过107. 不存在speed满足条件时返回-1. 思路&#xff1a; 如果前一个dist[i] / speed求出来的…...

本地非文字资源无法加载

目录 方法A.静态/动态绑定路径 方法B.require导入&#xff08;运行时加载&#xff09; 方法C.import导入&#xff08;x&#xff09;&#xff08;编译时加载&#xff09; 方法D.ref直接操作元素赋值&#xff08;x&#xff09; 相关知识 import和requir区别 模板路径&#…...

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看…...

万向节死锁

要理解万向节死锁的产生原因&#xff0c;首先要理解欧拉角变换&#xff0c;欧拉角变换是基于最初始的坐标进行变换而非变换后的坐标进行变换。 欧拉角变换需要空间中的三个角&#xff08;即变换后每个轴的偏移量&#xff09;&#xff0c;另外还有每个轴的变换顺序。值得注意的…...

大数据课程D1——hadoop的初识

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解大数据的概念&#xff1b; ⚪ 了解大数据的部门结构&#xff1b; ⚪ 了解hadoop的定义&#xff1b; ⚪ 了解hadoop的发展史&#xff1b; 一、大数据简介 1. 概述…...

xml命名空间

xml命名空间 一个xml文档中可以包含多个元素和属性&#xff0c;在文档中使用多个DTD文件时&#xff0c;可能会碰到相同的元素&#xff0c;而这些名称相同的元素可能代表了完全不同的含义&#xff0c;为了防止命名冲突&#xff0c;W3C提供了一个推荐标准-XML命名空间 命名空间有…...

七、Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…...

WEB安全测试通常要考虑的测试点

1、问题&#xff1a;没有被验证的输入 测试方法&#xff1a; 数据类型&#xff08;字符串&#xff0c;整型&#xff0c;实数&#xff0c;等&#xff09; 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值&#xff08;枚举型&a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...

XXE漏洞知识

目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例&#xff1a;文件读取&#xff08;需要Apache >5.4版本&#xff09; 案例&#xff1a;内网探测&#xff08;鸡肋&#xff09; 案例&#xff1a;执行命…...

设计模式-3 行为型模式

一、观察者模式 1、定义 定义对象之间的一对多的依赖关系&#xff0c;这样当一个对象改变状态时&#xff0c;它的所有依赖项都会自动得到通知和更新。 描述复杂的流程控制 描述多个类或者对象之间怎样互相协作共同完成单个对象都无法单独度完成的任务 它涉及算法与对象间职责…...