本教程中指明如何使用 RPC call reply 规则节点:
实例中有控制器和恒温器两个设备通过控制器启动RPC调用并请求恒温器当前温度值。
RPC调用将具有如下属性:
假如有一个房间安装了2个设备:恒温器和控制器。
从Controller A发送RPC请求并获取房间内的恒温器最新温度(Thermostat A)
转到Rule Chains -> Add new Rule Chain
配置:
创建新规则链并点击Edit按钮配置。
添加Related attributes节点并连接到Input节点。
该节点将加载相关恒温器的temperature属性并将保存在消息元数据中名为temp。
配置:
添加Transform Script节点并将其连接到Related attributes节点。
此节点会将原始消息转换为RPC响应消息RPC call reply节点发送消息payload作为响应,因此我们需要在Transformation节点中构造payload。
配置:
msg = {"temperature" : metadata.temp} return {msg: msg, msgType: msgType};
RPC call reply节点从消息元数据中获取RPC请求ID此ID用于标识放站的RPC调用。
此节点获取消息payload并将其作为响应发送到消息Originator。
配置:
Related thermostat temperature保存完成后如下图所示:
将新的规则链与Root Chain连接在一起。
将getTemperature属性赋值method的入站请求到新的(Related thermostat temperature)规则链。
返回Root Rule Chain点击Edit按钮进行更新。
添加Filter Script节点并连接到Message Type Switch节点关系类弄为RPC Request。
配置:
return msg.method === 'getTemperature';
最后所有消息类型为RPC Request的入站消息被路由到此节点。
在此节点函数只使用method = getTemperature过滤被允许的RPC请求。
添加Rule Chain节点类型为True并关联到Filter Script节点(filter getTemperature)。
配置:
现在所有符合已配置过滤器的消息都将被路由到Related thermostat temperature规则链
我们还希望记录所有其他未知的RPC请求,我们需要将关联类型为False的Log节点添加到Filter Script节点(filter getTemperature)。
所有method非等于getTemperature的入站RPC请求都将从Filter Script传递Log节点。
配置:
return 'Unexpected RPC call request message:\n' + JSON.stringify(msg) + '\metadata:\n' + JSON.stringify(metadata);
更改Root Rule Chain并保存完成如下图所示:
配置完成我们可以验证规则链是否按预期工作。
我们将使用REST RPC API模拟Controller A设备。
为了发送HTTP请求我们将使用curl实用程序。
为了触发RPC请求我们需要:
{"method": "getTemperature", "params":{}}
curl -X POST -d '{"method": "getTemperature", "params":{}}' http://localhost:8080/api/v1/IAkHBb9N7kKD9ieLRMFN/rpc --header "Content-Type:application/json"
响应:
{"temperature":"52"}
结果为Controller A使用方法getTemperature将RPC调用发送到Thingsboard。
通过配置的规则链路由消息并在响应中获取并返回相关恒温器的属性。
如果我们尝试使用未知方法提交请求,我们将在Thingsboard日志文件中看到消息:
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"}
有关RPC在Thignsboard中如何工作的更多详细信息,请阅读RPC功能文章。