docker版jxTMS使用指南:通过REST接口访问站点数据

本文讲解4.4版jxTMS中如何通过web访问站点数据,整个系列的文章请查看
:[docker版jxTMS使用指南:docker版jxTMS使用指南:4.4版升级内容

docker版本的使用,请查看:docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

4.2版jxTMS的说明,请查看:4.2版升级内容

我们以新增的app/sinosoarSP30H/site_master.py中所定义的sp30h_master站点为例来演示如何通过REST接口来获取jxTMS中的数据。

web用户获取数据需要经过如下的步骤:

  • 登录

  • 鉴权,用户是否有对指定资源执行相应操作的权限

  • 对指定资源执行相应的操作

  • 对操作所获得的数据执行策略性处理

  • 将处理后的数据返回用户

鉴权部分我们合并到后面的文章中进行解说。本文主要讲解如何添加操作与后处理。

除去授权部分,增加外部数据访问需要两个步骤:增加操作、增加操作后处理。

增加操作

分为两步:定义操作、注册。

定义,我们增加一个操作函数:

def op_getSiteData(user, siteName, params):
    s = site.getSite(siteName)
    if s is None:
        return None,None,404,f'站点[{siteName}]不存在'
    else:
        return s.type(),s.data(),200,None

该操作函数是根据所给出的站点名来查询站点,并返回站点类型和站点数据。

我们打算演示的操作是sp30h_slave型的站点。所以我们看一下【app/sinosoarSP30H/site_slave.py】文件,可以发现其重载了newOrmData函数:

def newOrmData(self):
    return SP30H()

大家可以再去看一下上篇文章的讲解,其中说到newOrmData返回一个数据对象,则站点就会在数据回送时为其准备数据,如果返回None则不保存数据。

site_slave由于没有重载onReceive函数,所以jxTMS会从回送数据中为SP30H准备数据,这些数据可以通过data()对象函数获得。

所以,op_getSiteData函数所返回的s.data(),就是site_slave的实时数据。

则,当op_getSiteData的参数是一个site_slave类型的站点名时,会返回其站点类型和根据SP30H数据类中的属性定义从起下属各设备的回送数据中进行综合后的实时数据。

注册操作

注册一个操作非常简单,在定义好操作函数后,执行:

auth.registerOP('getSiteData', op_getSiteData)

就将操作函数注册为操作:getSiteData。

注册后,当用户access时,只要给出参数【op:getSiteData】,如果通过了授权,jxTMS就会调用op_getSiteData函数。

op_getSiteData的定义和注册可查看:app/sinosoarSP30H/op_getSiteData.py

增加操作后处理

当操作执行完毕后,jxTMS会用其所返回的第一个结果:数据类型【op_getSiteData函数返回的是站点类型】来请求数据策略【dataPolicy】进行后处理。

如果我们为这个结果类型注册了相应的数据策略策略的话,jxTMS就会将操作所返回的第二个结果【数据】递交给改策略进行加工处理。

数据策略同样包括定义和注册两个步骤:

1、定义数据策略

def resultTrans_sp30h_slave(data):
    rd = {}
	rd['VoltageA'] = date.get('VoltageA')
	rd['VoltageB'] = data.get('VoltageB')
	rd['VoltageC'] = data.get('VoltageC')
	rd['DG1_VoltageAB'] = date.get('DG1_VoltageAB')
	#rd['DG1_VoltageBC'] = data.get('DG1_VoltageBC')
	#rd['DG1_VoltageCA'] = data.get('DG1_VoltageCA')
	rd['SOC1'] = date.get('SOC1')
	rd['SOC2'] = date.get('SOC2')
	rd['SOC3'] = date.get('SOC3')
    rd['timestamp'] = data.get('timestamp')
    return rd

resultTrans_sp30h_slave只演示了最简单的数据加工:从各设备的回送数据data中搬运自己感兴趣的数据返回给用户。

需要注意的是:站点的回送数据来自下属的各站点,所以其综合后的数据每次只是其中的一小部分。

2、注册数据策略

注册数据策略同样非常简单,执行:

dataPolicy.register('sp30h_slave',resultTrans_sp30h_slave,target='webServer')

数据策略在注册时有一个target参数,其指示的是用户名或角色名,我们这里的webServer是角色名,即所有角色为webServer的用户,当其操作后的数据是sp30h_slave类型时,需要调用resultTrans_sp30h_slave执行后处理。

默认的target是default,当注册了default的后处理,则当该类型的数据匹配不到其它target时就会使用default的后处理,如果该类型连default都未注册,则直接返回原始数据。

所以,当某类型的数据需要数据策略来做后处理时,一定要先定义一个最小精度的default的后处理策略来兜底。

sp30h_slave的数据后处理策略的定义和注册可查看:app/sinosoarSP30H/dualResult.py

参考资料:

jxTMS设计思想

jxTMS编程手册

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

如何用jxTMS开发一个功能

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

jxTMS的HelloWorld

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用OpenAPI定义REST接口的示例: ``` openapi: 3.0.0 info: title: 示例API description: 用于演示OpenAPI定义REST接口的示例 version: 1.0.0 servers: - url: https://api.example.com/v1 paths: /users: get: summary: 获取用户列表 operationId: getUsers responses: '200': description: 成功获取用户列表 content: application/json: schema: type: array items: type: object properties: id: type: integer description: 用户ID name: type: string description: 用户名 email: type: string description: 用户邮箱 post: summary: 创建新用户 operationId: createUser requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 用户名 email: type: string description: 用户邮箱 required: - name - email responses: '201': description: 成功创建新用户 content: application/json: schema: type: object properties: id: type: integer description: 用户ID name: type: string description: 用户名 email: type: string description: 用户邮箱 /users/{userId}: get: summary: 获取指定用户信息 operationId: getUserById parameters: - name: userId in: path description: 用户ID required: true schema: type: integer responses: '200': description: 成功获取指定用户信息 content: application/json: schema: type: object properties: id: type: integer description: 用户ID name: type: string description: 用户名 email: type: string description: 用户邮箱 put: summary: 更新指定用户信息 operationId: updateUserById parameters: - name: userId in: path description: 用户ID required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 用户名 email: type: string description: 用户邮箱 required: - name - email responses: '200': description: 成功更新指定用户信息 content: application/json: schema: type: object properties: id: type: integer description: 用户ID name: type: string description: 用户名 email: type: string description: 用户邮箱 delete: summary: 删除指定用户 operationId: deleteUserById parameters: - name: userId in: path description: 用户ID required: true schema: type: integer responses: '204': description: 成功删除指定用户 ``` 以上是一个简单的示例,包含了获取用户列表、创建新用户、获取指定用户信息、更新指定用户信息和删除指定用户等5个接口。其中,每个接口都包含了请求参数、响应数据和状态码等信息,可以通过OpenAPI工具自动生成客户端或服务端代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值