如何在ThingsBoard规则链中转发Protobuf消息?
问题说明
我通过MQTT从IoT设备向ThingsBoard发送Protobuf消息,目前流程正常,可在ThingsBoard UI中查看遥测数据。现在我希望通过规则链将Protobuf消息转发至外部服务器,但发现ThingsBoard似乎已将Protobuf消息转换为JSON格式,请问能否直接转发原始的Protobuf消息?
我的当前规则链流程为:设备消息进入后,经过「Device Profile」节点,再到「Script Filter」节点,最后通过「REST API Call」节点尝试转发。在消息到达REST节点前,我可将其作为JavaScript对象读写,且在第一个可调试节点即「Device Profile」节点中,能以JSON格式查看消息。由于已在设备配置文件的传输配置中设置Protobuf,我推测转换发生在进入规则链之前,无法转发原始Protobuf消息,能否有人对此进行确认?
确认及解释
是的,你的推测完全正确——ThingsBoard在消息进入规则链之前就已经完成了Protobuf到JSON/内部JavaScript对象的转换,无法直接通过规则链转发原始的Protobuf二进制消息。
原因如下:
- 当你在设备配置文件中配置了Protobuf传输格式,ThingsBoard的传输层(MQTT broker模块)会自动完成Protobuf二进制数据的解析,将其转换为平台内部通用的JSON/JS对象格式。这个转换是前置的标准化处理,目的是让平台的规则链、UI、数据存储等模块能统一处理不同格式的设备消息。
- 规则链中流转的消息都是经过标准化后的结构,原始的Protobuf二进制数据不会被保留在规则链的消息上下文中,所以你在调试节点看到的只能是JSON格式内容,也只能基于转换后的对象进行操作。
替代解决方案
如果必须实现转发原始Protobuf消息的需求,有两种可行思路:
绕过设备配置的Protobuf解析
- 不在设备配置文件中设置Protobuf传输规则,而是将Protobuf二进制消息以原始格式发送到ThingsBoard的MQTT主题(不关联设备配置的解析逻辑)。
- 此时规则链可以获取到原始二进制payload,再通过自定义JavaScript节点处理二进制数据,或使用HTTP节点直接以二进制格式发送到外部服务器。但这种方式下,ThingsBoard UI无法直接展示结构化的遥测数据,需要你自行处理解析逻辑。
重新序列化JSON为Protobuf
- 在规则链的JavaScript节点中,基于转换后的JSON数据,引入对应的Protobuf定义并实现序列化逻辑,将JSON重新转换为Protobuf二进制数据。
- 再通过REST API Call节点以二进制格式(设置正确的
Content-Type: application/protobuf请求头)发送到外部服务器。这种方式可以兼顾UI查看遥测和转发Protobuf的需求,但需要额外开发序列化代码。
内容的提问来源于stack exchange,提问作者Tobias Uhmann
相关产品推荐
相关产品推荐

