Thingsboard通过Tb-gateway网关+MQTT+Emqx下发数据至设备RPC请求实战

使用Thingsboard进行数据下发至设备操作,设备端需要传入如下Json格式数据。

规则链如下图 :

#变量控制下发格式
	{
		"variants":[
			{
				"id":1,
				"value":"9.9"
			},
			{
				"id":2,
				"value":"true"
			}
		]
	}

但是Thingsboard的数据格式为:

{
    "method": "setValue",
    "params": "869.76",
    "additionalInfo": null
}

所以需要写js脚本做数据置换。

在tb_gateway中mqtt.json配置中自己的serverSideRpc配置

"serverSideRpc": [
    {
      "deviceNameFilter": ".*",
      "methodFilter": ".*",
      "requestTopicExpression": "自己的下发主题",
      "responseTopicExpression": "自己的下发响应主题",
      "responseTimeout": 10000,
      "valueExpression": "${params}"
    },
    {
      "deviceNameFilter": ".*",
      "methodFilter": ".*",
      "requestTopicExpression": "自己的下发主题",
      "valueExpression": "${params}"
    }
  ]

此处的${params}就是msg中的params。最终Thingsboard传到设备的也只有这个params(变更后的值),method是做判断操作。

 因为我需要请求中携带Id,所以在Tb源码的ToDeviceRpcRequestBody中加入Id属性

 随后在抽象类AbstractRpcController的HandleDeviceRpcRequest方法中get此属性,加入msg中

便会使类型为RPC Request to Device的节点携带msg为如下格式:

{
    "method": "getValue",
    "params": "null",
    "id": 9,
    "additionalInfo": null
}

随后配置script脚本节点

var id = msg.id;
var value = msg.params;

var variants = [];
variants[0] = {"id": id,"value": value};
var variants1 = {"variants":variants};
var jsonData1 = JSON.stringify(variants1);
var newmsg = {
    "method": msg.method,
    "params": jsonData1,
    "id": msg.id,
    "additionalInfo": msg.additionalInfo
};
return {
    msg: newmsg,
    metadata: metadata,
    msgType: msgType
};

最终输出结果即为我们想要的格式。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值