使用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
};
最终输出结果即为我们想要的格式。