举个栗子🌰
我有一个设备,连接到 EMQX 服务器,采用 thingsboard 作为物联网平台,在里面创建了产品、模型、定义了协议。
topic:
/119/abc123/request
payload:
{"sensorDatas":[{"value":"334","flag":"power"}],"down":"down"}
结构如下图:
假如此时,迁移到了一个新的物联网平台,而这个平台又不能完全适配之前定义的协议,那么要如何应对?反之对于设备端来说一样,平台协议保持不变,设备端变了,又该如何应对?
新平台协议: topic:
/119/abc123/call
payload:
[{"id":"power","value":"334"}]
这就是要面临的实际问题,如何将新协议转换为就协议。
将 topic
/119/abc123/call
转换为
/119/abc123/request
将 payload
[{"id":"power","value":"334"}]
转换为
{"sensorDatas":[{"value":"334","flag":"power"}],"down":"down"}
看到这里,脑海中肯定会冒出一个词来,规则引擎(^-^呲牙咧嘴的笑……)。我们可以在 MQTT 和平台中间一层规则引擎,这是常规做法,这样就需要编码来实现了,当然自由度也高,如果是比较复杂的业务建议使用这种方式。那么有没有不用编码就可以实现的方法呢?使用 EMQX 5.x 开源版的用户有福了,已经内置了规则引擎。通过简单的 SQL 处理,就可以完成协议的转换。
EMQX 规则转换步骤如下:
- 点击创建规则
- 写入规则内容 + 动作
select 语句可以将消息格式重定义成旧格式。
动作要选择重发布,这里表示将 /119/abc123/call
重发到 /119/abc123/request
3、测试
使用 MQTT 客户端工具,模拟平台和设备做发布订阅测试。
模拟平台发布消息(/119/abc123/call
)
模拟客户端订阅消息(/119/abc123/request
)
从截图中可以看出,消息已经被规则进行转换。将新的 topic 路由到了旧 topic 上面,并将 payload 格式进行了转换。
这只是 EMQX 规则引擎的冰山一角,还有更多用法,比如将匹配到的数据转发到其他服务上或者桥接到其他平台做持久化等等。