本文讲解4.0版的jxTMS中python服务的设备,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
4.0版的jxTMS中python服务是一个采集前端数据的接口机,所以device模块是其关键部件,用来对设备进行管理。
device的主要任务是:
1、解析数据
设备在创建时会根据设备类型获取到本设备的数据解析策略,等接收到数据时,使用该策略将接收到的文本信息解析为dict的内部数据
2、保存数据
将正确解析后的数据保存到数据库,根据配置,可以全部保存还是以一定的时间间隔保存
3、设备状态
跟踪设备工作状态,参见前面的内置自动机一章
引用:
from jx.device import device
device说明:
class device(SMInstance):
@classmethod
def New(cls,type,name,params,saveDataInterval=15, timeOut=180, timeOutCheckInterval=1):
#根据type创建一个设备
#type:设备类型
#name:设备名
#params:参数
#saveDataInterval:保存设备数据的间隔分钟数,0则接收的数据都保存
#timeOut:没接收到设备数据的超时秒数
#timeOutCheckInterval:检测超时的间隔分钟数
@classmethod
def register(cls,type, newFunc):
#注册type类型的设备创建函数
#type:设备类型
#newFunc:设备创建函数
#newFunc的签名是:
#New(name,params,saveDataInterval, timeOut, timeOutCheckInterval)
@classmethod
def getDevByName(cls, devName):
#根据设备名获取设备
#devName:设备名
def __init__(self, type, name, saveDataInterval, timeOut, timeOutCheckInterval):
#设备的初始化函数
#type:设备类型
#name:设备名
#saveDataInterval:保存设备数据的间隔分钟数,0则接收的数据都保存
#timeOut:没接收到设备数据的超时秒数
#timeOutCheckInterval:检测超时的间隔分钟数
def setWarnType(self, wty):
#设置设备的告警类型
#wty:告警类型,初始为test,打印到日志;设置为ok则通过告警策略告警
def warnType(self):
#返回设备的告警类型
def warn(self, event, title, msg):
#告警
#event:诱发事件
#title:如果是告警到钉钉,则为消息标题
#msg:消息内容
def onClose(self):
#设备关闭时触发的事件,默认无动作
def close(self):
#关闭设备
def onInit(self):
#设备完成初始化时触发的事件,默认无动作
def setParam(self,paramName,value):
#设置设备参数,默认无动作
#paramName:参数名
#value:参数值
def state(self):
#获取设备的当前状态,dict:
#logTime
#logState
#logEvent
#logMsg
def type(self):
#获取设备的类型
def site(self):
#获取设备所属站点
def channel(self):
#获取设备的通道号
def fullname(self):
#获取设备全名:{站点名}.{设备名}
def name(self):
#获取设备名
def ormObj(self):
#获取本设备的ORM对象
def data(self):
#获取本设备所接收到的最新数据
def onReceive(self):
#本设备接收到新数据后,正确解析并完成保存、received事件触发后,触发本事件
#默认无动作
设备是基础,但jxTMS管理的单位却是站点,因为业务逻辑上不可能单独部署一台设备,而是要开通一个站点,哪怕这个站点其实就一台设备。
站点的工作逻辑主要有两点:
1、站点开通后,要以站点名为主题向mqtt订阅所有发往该主题的消息
2、站点接收到前端发送过来的消息后,要对其进行解析,将其拆解为【channel:msg】的值对,然后按channel查找到本站点的相应设备,然后将msg递交给该设备进一步处理
所以,默认的站点就是单设备型站点,接收到的消息直接递交该设备处理即可。但其它类型的设备,就需要基础site类,然后以站点类型来注册创建该类型站点的函数。
引用:
from jx.site import site
site说明:
class site:
@classmethod
def New(cls,type,name):
#创建一个新的站点
#type:站点类型,如果该type没有用registerSiteType注册过
#那返回的就是基础的site【单设备型站点,该设备发出的数据就是site收到的数据】
#name:站点名
@classmethod
def register(cls,type, newFunc):
#注册type类型站点的site创建函数
#type:站点类型
#newFunc:生成一个该类型的站点对象
# newFunc(siteName)
@classmethod
def init(cls):
#加载本地存储中的通过jxTMS平台下发的所有site的配置
#这些配置不但包括site的类型,还包括该站点各设备的信息
#site.init在pyService初始化函数的最后一步自动调用
@classmethod
def stopSite(cls, siteName):
#关停站点,同时从本地存储中清除该站点,以避免重启后仍被加载
#siteName:站点名
@classmethod
def setWarnType(cls, siteName, warnType):
#设置站点的告警类型
#siteName:站点名
#warnType:告警类型
def onClose(self):
#关闭事件,本站点被关闭后被触发,默认无动作
def receive(self, str):
#默认的site是单设备无多串口卡,设备上传数据直接透传到MQTT
#其它类型的站点要继承后并重写receive
#str:从mqtt以站点名为主题接收到的字符串
def type(self):
#返回站点类型
def name(self):
#返回站点名
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld