docker版jxTMS使用指南:python服务之内置自动机

news2024/11/24 21:05:50

本文讲解4.0版的jxTMS中python服务的内置自动机,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容

docker版本的使用,请参考:docker版jxTMS使用指南

4.0版jxTMS中python服务是一个采集前端数据的接口机。其自建了两个自动机:

  • 跟踪设备状态的_devSM

  • 解析vrs20设备所接收到的文本消息的vrs20SM

后者则定义在app/policy_vrs20.py文件中,所以我们主要讲解_devSM。

_devSM

状态图为:

devSM状态图

该自动机有四个状态:

  • init,自动机刚启动所处状态

  • normal,正常工作状态

  • disconnect,失去连接状态

  • error,接收错误状态

三种事件【本自动机非常简单,每种事件都对应跃迁到相应状态并执行对应的操作】:

  • received,正确接收到数据,状态跃迁到normal,并执行changeNormal函数

  • timeOut,未接收到数据的时间超时,状态跃迁到timeOut,并执行changeDisconnect函数

  • error,接收错误,状态跃迁到error,并执行changeError函数

响应函数的定义为:

def changeNormal(devObj, param):
    devObj.setState('数据接收','info','ok', 'receive', '正确接收到数据')
    
def changeError(devObj, param):
    devObj.setState('数据接收','error','error', 'receive', f'接收数据[{param}]解析错误')
    
def changeDisconnect(devObj, param):
    devObj.setState('数据接收','error','error', 'disconnect', '连接超时')
    devObj.warn('连接超时','设备失连','失去连接')

所以状态机的定义就非常简单了:

_devSM = jxLocalStateMachine('devSM','init')
_devSM.addTrans('init','timeOut','disconnect',changeDisconnect)
_devSM.addTrans('init','received','normal',changeNormal)
_devSM.addTrans('init','error','error',changeError)
_devSM.addTrans('normal','error','error',changeError)
_devSM.addTrans('normal','timeOut','disconnect',changeDisconnect)
_devSM.addTrans('disconnect','received','normal',changeNormal)
_devSM.addTrans('error','received','normal',changeNormal)

事件触发点有两个:

1、超时检查

管理设备的dev类在声明后,会启动一个超时检查【apscheduler的BackgroundScheduler,执行间隔由timeOutCheckInterval指定】,当其被触发时有两种情况被认为已经超时:

  • 尚未接收到数据,即启动后的timeOutCheckInterval时间内都没有接收到数据

  • 自上次接收到数据以来,timeOutCheckInterval时间内再没有接收到数据

当检测到这两种情况时,触发timeOut事件:

self.happen('timeOut')

2、接收到数据

设备的receive函数负责接收数据。该函数被调用,就意味着设备接收到了数据。此时有三种情况:

  • 本设备的解析策略对接收到的数据没有解析成功,则认为是接收错误

  • 本设备的解析策略对接收到的数据解析成功,则认为是接收正确

  • 本函数的执行出现错误,则认为是接收错误

接收正确,则触发received事件:

self.happen('received')

接收错误,则触发error事件:

self.happen('error',param=msg)

由于changeError函数需要打印接收到的错误消息,所以error事件被触发时需要送入导致错误的msg。

vrs20SM

app/policy_vrs20.py文件中说明了vrs20型设备发送消息的格式。大家对照该格式和vrs20SM的定义应该可以更深刻的理解状态机是如何工作的了。

状态机的最大优点就是简单可靠,只要我们定义对了,其基本不会出现问题。

此外,在定义了vrs20SM后,我们需要定义一个消息解析策略将其打包起来,并将该策略以设备类型为名进行注册,这样当设备创建后就可以根据设备类型设置恰当的消息解析策略了。

参考资料:

jxTMS设计思想

jxTMS编程手册

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

如何用jxTMS开发一个功能

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

jxTMS的HelloWorld

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

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

相关文章

【FreeMarker】学习笔记

【FreeMarker】学习笔记 【一】FreeMarker概述【1】FreeMarker概念【2】FreeMarker特性(1)通用目标(2)强大的模板语言(3)通用数据模型(4)为Web准备(5)强大的X…

opencv_c++学习(三十)

一、加载深度神经网络模型 Net cv:dnn::readNet(const String & model, const String & config "", const String & framework "")model:模型文件名称 config:配置文件名称 framework:框架种类 Net类中的函数名称以及作用: 向…

Eplan使用过程中的知识点1

一、新建时的几种标准模板 EPLAN中的符号库符合国际标准,分为单线图和原理图符号库。 符号库符合GB(国标)、IEC(国际标准)、NFPA(美国标准)和GOST(俄罗斯标准)4大标准。…

排水管网监测预警系统:全面感知管网运行态势

城市排水管网是城市基础设施系统中至关重要的一部分,它负责将雨水和废水排出城市,维持城市的正常运行。然而,随着管网的老化和城市扩张,排水管网出现了越来越多的问题,如泄漏、堵塞和损坏,给城市环境和公共…

一、机器人传动方式

1、齿轮传动 齿轮的最重要属性就是它的齿数。齿轮是根据齿数分类的。齿轮通常不会单独使用,齿 轮的基本属性就是可以将运动从一根轴传到其它轴上。 利用齿轮改变转速 利用齿轮改变转动方向 将旋转运动改变为直线运动 带自锁的涡轮蜗杆传动 齿轮可以用来传递力、增加…

Python中打印彩色信息的方法

在Python中,可以使用print()函数打印出彩色信息。在使用print()打印之前,需要调用os标准库对系统进行设置。 1 os标准库 1.1 简介 os是Operating System的简写,即“操作系统”。os标准库是一个操作系统接口模块,提供了使用操作…

关于Addressable打包图集与图片都打进去造成冗余

1)关于Addressable打包图集与图片都打进去造成冗余 ​2)Unity如何计算Root动画旋转 3)IL2CPP编译的Protobuf反射类运行时报空 4)为什么Active Constraints会出现过高的现象 这是第337篇UWA技术知识分享的推送,精选了UW…

配置 ssh key 后 git 拉取代码一直提示输入用户名、密码问题

中间过程比较碎碎念,涉及到一些错误的方案以及和 gpt 对线 可以直接跳到结论部分 0 场景 我有一个项目,仓库里已经配置了 ssh 公钥,但是每次 pull 或者 push 代码依旧提示输入用户名、密码 -1 失败的方案 -1.1 失败的方案1:全…

迅为国产化RK3588开发板在安防前后端应用解决方案

K3588是瑞芯微推出的一款高性能处理器,针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍: 前端摄像头端: 高清视频采集:利用RK3588处理器的高性能图像处理能力,…

MySQL 对字符串使用 STR_TO_DATE() 函数

文章目录 STR_TO_DATE() 函数1. 待转换字符串中出现数字以外的,自动去除字符,然后添加0至8位转换为日期2. 如果格式字符串仅包含日期,则待转字符串至少需要 8 位数字3. 转换后日期时间必须有效,否则返回结果为 null4. 如果被转字符…

视频怎么加水印?如何录制带水印的视频?

案例:如何给视频添加水印? 【我发布在短视频平台的视频,总是被别人盗用,我想给自己的视频添加水印。有没有视频添加水印的方法?在线等!】 很多视频制作者或者爱好者,都希望自己的视频作品得到…

OSPFv2特殊区域---NSSA区域

NSSA区域原理 NSSA区域 no-so-stub-area,次末梢区域。 NSSA区域能够将外部路由引入并传播到整个OSPF自治域中,同时又不会学习来自OSPF网络其它区域的5类LSA OSPF规定Stub区域是不能引入外部路由的,这样可以避免大量外部路由对Stub区域路由器…

我“Hack”了一款精酿啤酒

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / 声网、CBCE 2023 录音间 / 声湃轩北京站 今天这位嘉宾的爱好非常广泛,除了自己是一位网络安全领域的从业者之外,平时还爱好攀…

Win32 API 编写一个串口助手

首先对串口操作做了一些封装: 助手类声明如下 CSerialPort.h #pragma once#include <string> #include <windows.h> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endifclass CSerialPort { pu…

JetBrains的Go语言集成开发环境GoLand 2023版本在Linux系统的下载与安装配置教程

目录 前言一、GoLand 安装二、使用配置总结 前言 GoLand是一款专为Go语言开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署Go应用程序。注&#xff1a;已在CentOS7.9和Ubuntu20.04安装…

删除排序数组的重复项

给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums [1,1,2…

JavaEE进阶5/25(属性注入)

目录 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 3. Resource注入 4.Resource注入和Autowired注入的区别 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 对象装配&#xff08;对象注入&#xff09;有三种方…

含镍废水树脂吸附工艺方案

项目基本信息 工艺及产品信息 甲方 欣兴同泰科技(昆山)有限公司 采用工艺 沉淀工艺过滤系统离子交换放流池 工程公司 / 工艺原理 镍离子以氢氧化物的形式做成镍泥&#xff0c;清液中微量镍离子通过螯合离子交换原理实现出水稳定达标 开始时间 2019/6/20 工艺特点 …

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

TortoiseGit的安装及使用, 并配合Gitee码云使用

Windows10下, TortoiseGit的安装及使用, 并配合Gitee码云使用! 1) 安装TortoiseGit 官网, 32位, 64位, 自选 Download – TortoiseGit – Windows Shell Interface to Git 2) 点击下载, 安装, 我选择的是64位, 中文安装包(说明: 中文安装包也分32, 64位), 这两个下载. Tips:…