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绑定默认数据删除不了的情况
例子: 在项目开发中遇到的,简单记录一下 <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:建立benchmark step2:定义参数init需要的算法 step3:定义目标函数、参数空间、优化函数、验证函数 step4:训练贝叶斯优化器 step5:修…...
多线程练习——抽奖箱
题目: 分析以下需求,并用代码实现: 有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,900,2,80,300,700};创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随…...
RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析
🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…...
Windows 11的最新人工智能应用Windows Copilot面世!
Windows Copilot是Windows 11预览版中的一项AI辅助功能。 Windows 11还包括设置应用程序的更改,更广泛的支持压缩文件格式。 上个月,微软宣布将继续其将ChatGPT应用于所有产品的冒险之旅,推出了名为Copilot的新Windows 11功能。几个月前&…...
Mac 预览(Preview)丢失PDF标注恢复
感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐! 辛苦用预览在pdf上做的阅读标记,关闭后打开全丢失了,推荐尝试下网站导入文件进行恢复: 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…...
4.5. 方法的四种类型
文章目录 1、无参数无返回值的方法2、有参数无返回值的方法3、有返回值无参数的方法4、有返回值有参数的方法5、return 在无返回值方法的特殊使用 1、无参数无返回值的方法 // 无参数无返回值的方法(如果方法没有返回值,不能不写,必须写void,…...
四旋翼无人机使用教程
文章目录 前言一、检查遥控器电源开关混控拨码开关微调开关飞行模式刹车开关行程开关接收机对码 二、检查飞机检查接线 三、解锁并飞行 前言 PX4固件 QGC地面站 Pixhwak飞控 Mc6c遥控器 开源飞控博大精深,欢迎广大爱好者加博主微信名片,一起学习交流。…...
优化 PHP 数据库查询性能
优化 PHP 数据库查询性能可以从以下几个方面入手: 使用索引:在数据库中创建适当的索引可以大大提高查询性能。索引可以加快数据的查找速度,特别是在大型数据库中。选择合适的数据类型:选择正确的数据类型可以减少存储空间的占用&…...
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求出来的是小数,必须等到下一个整数时间才计算下一个。 speed最大不会超过107. 不存在speed满足条件时返回-1. 思路: 如果前一个dist[i] / speed求出来的…...
本地非文字资源无法加载
目录 方法A.静态/动态绑定路径 方法B.require导入(运行时加载) 方法C.import导入(x)(编译时加载) 方法D.ref直接操作元素赋值(x) 相关知识 import和requir区别 模板路径&#…...
Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购
功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…...
万向节死锁
要理解万向节死锁的产生原因,首先要理解欧拉角变换,欧拉角变换是基于最初始的坐标进行变换而非变换后的坐标进行变换。 欧拉角变换需要空间中的三个角(即变换后每个轴的偏移量),另外还有每个轴的变换顺序。值得注意的…...
大数据课程D1——hadoop的初识
文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解大数据的概念; ⚪ 了解大数据的部门结构; ⚪ 了解hadoop的定义; ⚪ 了解hadoop的发展史; 一、大数据简介 1. 概述…...
xml命名空间
xml命名空间 一个xml文档中可以包含多个元素和属性,在文档中使用多个DTD文件时,可能会碰到相同的元素,而这些名称相同的元素可能代表了完全不同的含义,为了防止命名冲突,W3C提供了一个推荐标准-XML命名空间 命名空间有…...
七、Kafka源码分析之网络通信
1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器,首先得从 Deque 里找到自己的目标分区,如果没有就新建一个批量消息 Deque 加进入 2、消…...
WEB安全测试通常要考虑的测试点
1、问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型&a…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
