产品定价 立即试用
社区版
指南 > 教程 > 进阶 > 使用关联设备数据回复RPC
入门 文档
安装 架构 API 常见问题
目录

使用关联设备数据回复 RPC 请求

本教程说明如何使用 RPC call reply 节点,并涵盖:

  • 使用 rule chain 节点创建并连接不同rule chains。
  • 使用filter script 节点过滤消息。
  • 使用transformation script 节点转换入站消息。
  • 使用 related entity data 节点获取关联实体的最新telemetry。
  • 使用 log 节点记录消息。

简介

有两个设备:controller和thermostat。需从controller发起 client-side RPC 调用,请求关联thermostat的当前温度。 RPC调用包含2个属性:

  • method:getCurrentTemperature
  • params:空JSON对象

模型定义

房间内安装有2个设备:thermostat和controller。

  • thermostat表示为Device,名称为 Thermostat A,类型为 Thermostat
  • controller表示为Device,名称为 Controller A,类型为 Controller
  • 通过relation类型 Thermostat 创建从 Controller AThermostat A 的relation。

配置Rule Chains

新建Rule Chain:Related thermostat temperature

进入 Rule Chains -> Add new Rule Chain

配置:

  • Name:Related thermostat temperature

image

规则链已创建。点击规则链行以打开。

添加节点:related entity data

添加 related entity data 节点并将其连接到 input 节点。

该节点将获取关联thermostat Thermostat A 的最新 temperature 读数,并以 roomTemperature 为名保存到消息metadata中。

配置:

  • Name:Get temperature from related Thermostat
  • Direction:From originator
  • Max relation level:1
  • Relation type:Thermostat
  • Entity type:Device
  • Data to fetch:Latest telemetry
  • Source attribute key:temperature
  • Target key:roomTemperature

image

image

添加transformation节点:script

添加transformation script 节点并将其连接到 related entity data 节点。

该节点将把原始消息转换为RPC回复消息。RPC call reply 节点以消息payload作为对请求的响应发送,因此需在transformation节点中构建正确的payload。

配置:

  • Name:Build response
  • ScriptLang:TBEL
  • Script:
    1
    
       return {msg: {"temperature": metadata.roomTemperature}, metadata: metadata, msgType: msgType};
    

image

添加action节点:RPC call reply

RPC call reply 节点从消息metadata中获取RPC requestId,该id用于识别入站RPC调用。

该节点获取消息payload并作为响应发送给消息originator。

配置:

  • Name:Send response
  • Request ID:requestId

image



该规则链已配置完毕,请保存。Related thermostat temperature 规则链应如下所示:

image

连接规则链

现在将把新规则链与 Root Rule Chain 连接起来。

需要把 method 属性为 getCurrentTemperature 的入站RPC请求路由到新规则链 Related thermostat temperature。 返回规则链列表并打开 Root Rule Chain 进行所需修改。

添加filter节点:script

添加filter script 节点,并以relation type RPC Request from Device 连接到默认 message type switch 节点。

默认 Root Rule Chain 应已有从 message type switch 到名为 “Log RPC from Device” 的 log 节点的连接。 此时需用新建的 script 节点替换log节点 Log RPC from Device。 请不要删除log节点,将复用它记录未知RPC请求。

配置:

  • Name:Filter getCurrentTemperature RPC
  • ScriptLang:TBEL
  • Script:
    1
    
       return msg.method == "getCurrentTemperature";
    

image

此后,所有message type为 RPC Request from Device 的入站消息都会路由到此节点。 在该节点内,函数仅过滤 method == getCurrentTemperature 的允许RPC请求。

添加节点:rule chain

添加 rule chain 节点,以 True 连接连接到上一个filter script 节点 “Filter getCurrentTemperature RPC”。

配置:

  • Name:To Related thermostat temperature
  • Rule Chain:Related thermostat temperature
  • Forward message to the originator’s default rule chain:Disabled

image

现在,所有满足配置filter的消息都会路由到 Related thermostat temperature 规则链。

记录未知请求

将filter script 节点 “Filter getCurrentTemperature RPC” 以 False 连接重新连接到先前断开的 log 节点。 所有method不等于 “getCurrentTemperature” 的入站RPC请求将从filter script 传递到 log 节点。

配置:

  • Name:Log RPC from Device
  • ScriptLang:TBEL
  • Script:
    1
    
       return '\nIncoming message:\n' + JSON.stringify(msg) + '\nIncoming metadata:\n' + JSON.stringify(metadata);
    

image



Root Rule Chain 的修改已完成,请保存。Root Rule Chain 应如下所示:

image

验证配置

配置已完成,可验证规则链是否按预期工作。

先从为 Thermostat A 设备发布 “temperature” telemetry开始。发送HTTP请求将使用 curl 工具。

  • 触发telemetry上传:进入设备页的 Check connectivity 选项卡,复制 curl 命令以发布thermostat设备的telemetry。

image

  • 执行复制的命令:
1
curl -v -X POST https://thingsboard.cloud/api/v1/CF8zr16VZeCk7zRyztZB/telemetry --header Content-Type:application/json --data "{temperature:25}"

将使用REST RPC API模拟 Controller A 设备从设备到服务器的RPC请求。

为触发RPC请求,需对 Controller A 设备执行与 Thermostat A 相同操作:从 Check connectivity 选项卡复制 curl 命令。 然后修改命令以触发REST RPC API:

  • 将API路径中的 telemetry 替换为 rpc
  • 将payload从 {temperature:25} 改为 {method: "getCurrentTemperature", params:{}}

修改后的命令应类似:

1
curl -v -X POST https://thingsboard.cloud/api/v1/ZcHBHbptBqxgV1A6Qrtx/rpc --header Content-Type:application/json --data "{method: "getCurrentTemperature", params:{}}"

响应:

1
{"temperature":"25"}

符合预期。Controller A向ThingsBoard发送method为getCurrentTemperature的RPC调用。 消息经配置的规则链路由,关联thermostat的最新telemetry被获取并返回在响应中。

若尝试提交未知method的请求:

1
curl -v -X POST https://thingsboard.cloud/api/v1/ZcHBHbptBqxgV1A6Qrtx/rpc --header Content-Type:application/json --data "{method: "getCurrentHumidity", params:{}}"

可在ThingsBoard日志中看到:


[rule-dispatcher-0-3] INFO  o.t.rule.engine.action.TbLogNode -
Incoming message:
{"method":"getCurrentHumidity","params":{}}
Incoming metadata:
{"deviceType":"Controller","requestId":"1","sessionId":"54c2abd1-6496-4ab3-9036-e044083b1823","serviceId":"tb-core-1","deviceName":"Controller A"}



有关ThingsBoard中RPC的更多说明,请阅读RPC capabilities一文。