指南

ThingsBoard教程和指南。

RPC调用回复

本教程中指明如何使用 RPC call reply 规则节点:

  • 使用Rule Chain节点并创建连接至其它规则链
  • 使用Script节点过滤消息
  • 使用Script节点转换入站消息
  • 使用Related Attributes节点获取实体属性
  • 使用RPC call reply节点处理设备的RPC请求
  • 使用Log节点记录消息

简介

实例中有控制器和恒温器两个设备通过控制器启动RPC调用并请求恒温器当前温度值。

RPC调用将具有如下属性:

  • method: getTemperature
  • params: empty array

模型定义

假如有一个房间安装了2个设备:恒温器和控制器。

  • 恒温器设备名称Thermostat A和设备类型Thermostat
  • 控制器设备名称Controller A和设备类型Controller
  • 创建Controller A并关联Thermostat AThermostat
  • 添加具有服务器范围的属性添加到设备Thermostat A
    • Attribute name: temperature
    • Attribute value: 52

Controller A发送RPC请求并获取房间内的恒温器最新温度(Thermostat A)

配置规则链

创建Related thermostat temperature规则链

转到Rule Chains -> Add new Rule Chain

配置:

  • 名称 : Related thermostat temperature

image

创建新规则链并点击Edit按钮配置。

添加Related attributes节点

添加Related attributes节点并连接到Input节点。

该节点将加载相关恒温器的temperature属性并将保存在消息元数据中名为temp

配置:

  • Name: get related temperature
  • Direction: From
  • Max relation level: 1
  • Relation type : Thermostat
  • Entity type : Device
  • Latest telemetry : false
  • Source attribute : temperature
  • Target attribute : temp

image

添加Transform Script节点

添加Transform Script节点并将其连接到Related attributes节点。

此节点会将原始消息转换为RPC响应消息RPC call reply节点发送消息payload作为响应,因此我们需要在T​​ransformation节点中构造payload。

配置:

  • Name: build responce
  • Script:
 msg = {"temperature" : metadata.temp} return {msg: msg, msgType: msgType}; 

image

添加RPC call reply节点

RPC call reply节点从消息元数据中获取RPC请求ID此ID用于标识放站的RPC调用。

此节点获取消息payload并将其作为响应发送到消息Originator。

配置:

  • Name : send responce
  • Request ID : requestId

image



Related thermostat temperature保存完成后如下图所示:

image

连接规则链

将新的规则链与Root Chain连接在一起。

getTemperature属性赋值method的入站请求到新的(Related thermostat temperature)规则链。

返回Root Rule Chain点击Edit按钮进行更新。

添加Filter Script节点

添加Filter Script节点并连接到Message Type Switch节点关系类弄为RPC Request

配置:

  • Name : filter getTemperature
  • Script:
 return msg.method === 'getTemperature'; 

image

最后所有消息类型为RPC Request的入站消息被路由到此节点。

在此节点函数只使用method = getTemperature过滤被允许的RPC请求。

添加Rule Chain节点

添加Rule Chain节点类型为True并关联到Filter Script节点(filter getTemperature)。

配置:

  • 规则链: Related thermostat temperature

image

现在所有符合已配置过滤器的消息都将被路由到Related thermostat temperature规则链

Log未知请求

我们还希望记录所有其他未知的RPC请求,我们需要将关联类型为FalseLog节点添加到Filter Script节点(filter getTemperature)。

所有method非等于getTemperature的入站RPC请求都将从Filter Script传递Log节点。

配置:

  • Name : log others
  • Script :
 return 'Unexpected RPC call request message:\n' + JSON.stringify(msg) + '\metadata:\n' + JSON.stringify(metadata); 

image



更改Root Rule Chain并保存完成如下图所示:

image

验证配置

配置完成我们可以验证规则链是否按预期工作。

我们将使用REST RPC API模拟Controller A设备。

为了发送HTTP请求我们将使用curl实用程序。

为了触发RPC请求我们需要:

  • Controller A设备页面复制令牌IAkHBb9N7kKD9ieLRMFN

image

  • POST地址 - http://localhost:8080/api/v1/$ACCESS_TOKEN/rpc
  • POST类型 - application/json和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"}

结果为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功能文章。