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
};

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

### 安装环境准备 为了在 CentOS 上成功安装并运行 ThingsBoard Gateway (tb-gateway),需要先确保操作系统已经更新至最新版本,并且 Docker 已经正确安装。对于 Docker 的安装,可以通过官方文档获取最新的指导说明[^2]。 ### 配置Docker容器以启动ThingsBoard Gateway 针对 CentOS 用户,在同一台机器上如果同时部署有 ThingsBoard 平台,则需要注意网络配置部分。由于两者可能竞争相同的 MQTT 端口(默认为 1883),因此建议调整其中一个服务使用的端口号,或者指定不同的主机地址给 tb-gateway 使用[^3]。 具体命令如下所示: ```bash docker run -it \ -v ~/.tb-gateway/logs:/thingsboard_gateway/logs \ -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions \ -v ~/.tb-gateway/config:/thingsboard_gateway/config \ --restart always \ -e TB_GW_TB_HOST="your_thingsboard_host_ip" \ # 替换为实际的 IP 地址或域名 -p 1884:1883 \ # 如果存在端口冲突可更改此映射 thingsboard/tb-gateway ``` 上述命令中的 `-e` 参数用于设置环境变量 `TB_GW_TB_HOST` 来指向正确的 ThingsBoard 主机位置;而 `-p` 则用来重新映射外部访问端口以防内部冲突发生。 ### 解决国内镜像源问题 考虑到某些地区可能存在下载速度慢甚至无法拉取镜像的情况,推荐使用加速器或者其他可靠的第三方仓库来代替默认的 Docker Hub 获取所需镜像文件[^4]。 例如,阿里云提供了免费的公共镜像站,只需简单修改 `/etc/docker/daemon.json` 文件即可实现加速效果: ```json { "registry-mirrors": ["https://<Your_Aliyun_ID>.mirror.aliyuncs.com"] } ``` 之后重启 Docker 服务使新配置生效。 ### 关于配置文件路径的选择 当利用 Docker 方式部署时,默认情况下会挂载当前用户的家目录下的 `.tb-gateway` 子文件夹作为持久化存储空间。这包含了日志、扩展插件以及最重要的配置文件等内容。确保这些卷能够正常读写非常重要,尤其是在 SELinux 启用的情况下可能会遇到权限方面的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值