使用来自相关设备的数据进行RPC应答
在本教程中,我们将讲解如何使用RPC调用应答规则节点,以及如何:
- 使用规则链节点创建和连接不同的规则链。
- 使用脚本节点过滤消息
- 用脚本节点转换传入消息。
- 使用相关属性节点获取相关实体的属性
- 从带有RPC调用应答节点的设备中处理RPC调用。
- 日志消息与日志节点。
介绍
我们有2个设备-控制器和恒温器。我们想从控制器发起RPC调用并请求相关恒温器当前温度值。RPC调用有两个属性:
- 方法:getTemperature
- 参数:空数组
模式定义
- 有一个房间安装了两个设备:恒温器和控制器。
- 用一个名为恒温器A的设备表示恒温器
- 用一个名为控制器A的控制器表示控制器
- 通过关系恒温器创建控制器A到恒温器A的关系
- 将属性(带有服务器范围)添加到恒温器A。
- 属性名称:温度
- 属性值:52 我们从控制器A发起RPC请求,请求获取同一房间内恒温器的最新温度(恒温器A)
配置规则链
床架与恒温器温度相关的新规则链 打开规则链-添加先的规则链 配置: 名称:相关恒温器温度
新规则链创建完成。点击“编辑”按钮配置该规则链。 添加相关属性节点 添加相关属性节点并将该节点链接到输入节点。 该节点将加载相关恒温器的温度属性并将属性值保存在消息元数据中,名为temp. 配置:
- 名称: get related temperature
- 指令: From
- 最大关系级别: 1
- 相关类型 : Thermostat
- 实体类型 : Device
- 最新遥测 : false
- 原属性 : temperature
- 目标属性 : temp
添加转换脚本节点
添加转换脚本节点并将其连接到相关的属性节点。 该节点将原始消息转换为RPC应答消息。RPC调用应答节点发送消息有效负载作为对请求的响应,因此我们需要在转换节点中构造适当的有效负载。 配置:
- 名称: build responce
- 脚本:
msg = {"temperature" : metadata.temp} return {msg: msg, msgType: msgType};
添加RPC调用应答节点
RPC调用应答节点从消息元数据获取RPC请求ID。这个ID用于识别传入的RPC调用。 此节点接收消息有效负载并将其作为响应发送给消息发送方。 配置:
- 名称:send responce
- 请求ID:requestId
相关恒温器温度规则链图示如下:
Connect Rule Chains
连接规则链 现在我们将新规则链与跟规则链连接。我们希望用getTemperature方法将传入的RPC请求路由到新的规则链(相关的恒温器温度)。 接下来我们返回到根规则链,单击Edit按钮,做相应的修改。
添加过滤脚本节点
添加过滤脚本节点,并将其连接到具有关系类型RPC请求的消息类型切换节点。 配置:
- 名称:filter getTemperature
脚本
return msg.method === 'getTemperature';
所有的消息类型为RPC请求的传入消息将被路由到该节点 该节点使用getTemperature方法仅过滤并允许RPC请求
添加规则链节点
使用True关系类型将规则链节点添加到之前的过滤脚本节点(filter getTemperature). 配置
- 规则链:相关恒温器温度
现在,所有符合过滤条件的消息将被路由到相关恒温器温度规则链
记录未知请求
我们仍然需要记录其他未知的RPC请求。使用False关系类型将日志节点添加到过滤器脚本节点(filter getTemperature)。 所有不符合getTemperature方法的传入RPC请求将被从过滤脚本发送到日志节点 配置
- 名称:记录其他
- 脚本:
return 'Unexpected RPC call request message:\n' + JSON.stringify(msg) + '\metadata:\n' + JSON.stringify(metadata);
做完所有修改后,根规则链图示如下:
Verify configuration
Configuration is finished and we can verify that Rule Chain works as we expect. We will use REST RPC API for emulating Controller A device. For sending HTTP request, we will use curl utility. For triggering RPC request, we need to:
验证配置
配置完成之后我们来验证一下规则链是否正常工作 我们使用REST RPC API来模拟控制器。 我们将使用curl实用程序,发送HTTP请求,。 要触发RPC请求,我们需要:
- 获取控制器A设备API token。 我们可以从设备页面复制Token。在本教程中,我们使用的token是IAkHBb9N7kKD9ieLRMFN。请注意,token是唯一的,你必须使用你自己的设备token。
对Thingsboard URL发送RPC请求 - http://localhost:8080/api/v1/$ACCESS_TOKEN/rpc with content type = application/json and payload {"method": "getTemperature", "params":{}}
curl -X POST -d '{"method": "getTemperature", "params":{}}'
http://localhost:8080/api/v1/IAkHBb9N7kKD9ieLRMFN/rpc --header "Content-Type:application/json"
应答:
{"temperature":"52"}
这个结果符合预期。控制器A使用getTemperature方法像TB发送RPC请求。将获取并返回通过规则链和相关恒温器属性路由的消息作为RPC应答。
如果我们使用未知方法提交请求,我们将会在TB日志文件中看到消息:
curl -X POST -d '{"method": "UNKNOWN", "params":{}}' http://localhost:8080/api/v1/IAkHBb9N7kKD9ieLRMFN/rpc --header "Content-Type:application/json"
[pool-35-thread-3] INFO o.t.rule.engine.action.TbLogNode - Unexpected RPC call request message: {"method":"UNKNOWN","params":{}}metadata: {"deviceType":"Controller","requestId":"0","deviceName":"Controller A"}