本文讲解4.0版的jxTMS中python服务的设备策略,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
jxTMS实现的接口机对设备的数据采集与处理采取的是框架组装模式。
即jxTMS定义了一整套的设备数据采集、处理、查询/访问的工作机制,然后只需要针对新类型的设备、不同用户、不同的操作需求、不同的服务等级进行定制,然后一一注册到该框架中即可。
加上jxTMS的python服务还支持动态升级,所以jxTMS实现了动态的、简单的、灵活的升级与伸缩能力。
接口机python服务提供的可以动态升级的能力有:
1、新类型设备如何解析、处理数据
定义该类型设备的数据处理策略,然后用policy.registerPolicy注册即可。
类似app/policy_vrs20.py,然后动态加载【loadNewPy】这样的py文件即动态增加了对新类型设备的数据解析能力。
注:app.policy_vrs20模块在app/device_vrs20.py中被引用
2、新类型设备如何保存数据
定义该类型设备的数据类,然后用Device.register注册即可。
类似app/data_vrs20.py,然后动态加载【loadNewPy】这样的py文件即动态增加了对新类型设备的数据保存能力。
注:app.data_vrs20模块在main.py中被引用
3、新类型设备的特殊处理与生成
继承device类,然后针对性处理,然后用device.registerDevType注册即可。
类似app/device_vrs20.py,然后动态加载【loadNewPy】这样的py文件即动态增加了对新类型设备的处理能力。
注:app.device_vrs20模块在main.py中被引用
4、新的操作
定义对应的操作函数,然后用auth.registerOP注册即可。
类似app/op_getDevData.py,然后动态加载【loadNewPy】这样的py文件即动态增加了对新的操作。
注1:app.op_getDevData模块在main.py中被引用
注2:新增的操作必须在相应的资源(组)的权限管理中追加操作才能被执行,通过【操作权限查询】,按【资源(组)】进行条件查询,然后对该权限执行【修改操作】。如果没有相应资源(组)的权限配置,则新增相应的资源配置。权限配置完毕,要对影响到的资源(组)做权限下发,新的操作才会被相应的用户有权操作
5、给操作后得到的数据增加SLA【服务水平,如不同的精度、不同的粒度、不同的范围等等】
完成操作后,根据数据类型和用户的不同,可以提供针对性的SLA。只需要针对不同的SLA分别定义对应的数据处理函数,然后将这些数据处理函数以数据类型、角色用dataPolicy.register注册跟即可。
类似app/dualResult_vrs20.py,然后动态加载【loadNewPy】这样的py文件即动态增加了对新数据类型、新的角色提供的操作后过滤能力。
注1:app.dualResult_vrs20模块在main.py中被引用
注2:未注册的数据类型直接返回原数据;注册了数据类型时,按用户名、用户角色、默认这三个顺序依次搜索,找到就交其处理,未找到则返回原数据
SLA只是数据策略的一个应用,在jxTMS中,数据策略称为数据的后处理。即设备所接收到的数据有三次处理机会:
-
设备接收到的数据会交给设备所配置的数据处理策略进行解析、处理、保存等
-
当用户发起操作并通过授权检验后,jxTMS会调用相应的操作函数来执行该操作。虽然我们示例的操作就是读取设备的实时数据,但也不排除根据需要对数据进行加工处理
-
当用户操作完毕,取得操作后的数据时,jxTMS会检查是否有合适的数据转换策略,如果有则调用该策略对获取到的数据进行转换后再递交用户,否则直接将数据递交用户
注:数据策略使用dataPolicy.register进行注册:
引用:
from jx.dataPolicy import dataPolicy
dataPolicy.register函数说明:
register(cls, type, dual, target=‘default’)
注册一个数据转换策略
参数:
type:数据类型
dual:处理函数
target:期望匹配的目标,应该是角色名,默认是default,即该类型数据的默认转换策略
返回值:
无
说明:
1、同一数据类型,数据转换策略的搜索顺序是:用户名、用户的各角色、default,先找到哪个就用哪个;没找到就返回原数据
2、dual函数的签名是:
dual(data)
data:当前数据
6、mqtt接收到不同的主题如何处理【参考后继的mqqt讲解】
定义对应的处理函数,然后用mqttClient.registerDual注册即可。
main.py中注册了default的topic,即处理所有未指明的topic消息
7、增加新的rest接口来执行操作【参考后继的web讲解】
有两种方案:
a web服务尚未启动前
定义继承自UserRouter的相应的uri处理类,然后用web.register在web服务启动前注册即可。
类似app/web.py,但其中所增加的uri【/api/getDeviceData】只能在web服务启动前添加,无法被动态加载。
b web服务已经启动
增加一个新的操作【需授权】,然后通过/api/access访问即可。即,本方法或说/api/access是将权限、操作、SLA进行了深度融合后的产物,只需要增加新的操作并授权,即可通过/api/access访问。
注:/api/access实质上只是将user.access暴露给了web访问,给user.access提供了web访问通道
8、增加新的告警方式
定义继承warnPolicy的告警策略,然后重写dual对象函数后,然后创建一个该策略的实例用warnPolicy.register注册即可。
类似app/warnPolicy_dingding.py,然后动态加载【loadNewPy】这样的py文件即动态增加了新的告警方式。
注:app.warnPolicy_dingding模块在main.py中被引用
warnPolicy.register的函数签名:
register(cls, type, wp, purpose=None)
type:使用告警策略对象的类型
wp:告警策略实例
purpose:如果一种类型需要更详细的告警策略区分,则用purpose来辅助区分
结语
本文一共讲述了8种动态扩展,加上上篇文章中的注册新型站点,所以jxTMS的python服务一共提供了9种动态扩展能力:
笔者在main.py中做了说明:本示例一共用到了8种动态注册,本文讲述的这8种动态扩展都使用到了【7b的web服务启动后添加access动作未示例】,只有site.register没被用到。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld