MQTT.fx上报遥测数据未在Thingsboard最新遥测栏显示求助
MQTT上报遥测数据到ThingsBoard但无法在Latest Telemetry查看的问题排查
问题背景
我通过MQTT.fx上报遥测数据(本地配置无误),但在ThingsBoard创建的设备的「latest telemetry」标签页中无法看到数据。起初猜测需要创建规则链来存储遥测数据,于是导入了官方的温度告警示例规则链,但并未生效。Windows防火墙已关闭。
查看日志发现以下内容(是否表明消息已送达ThingsBoard服务?):
2018-05-29 16:03:10,305 [http-nio-0.0.0.0-8080-exec-3] INFO o.t.s.c.plugin.TbWebSocketHandler - [7] Processing TextMessage payload=[{"tsSubCmd..], byteCount=161, last=true] 2018-05-29 16:03:15,715 [http-nio-0.0.0.0-8080-exec-9] INFO o.t.s.c.plugin.TbWebSocketHandler - [7] Processing TextMessage payload=[{"tsSubCmd..], byteCount=176, last=true] 2018-05-29 16:03:15,722 [http-nio-0.0.0.0-8080-exec-2] INFO o.t.s.c.plugin.TbWebSocketHandler - [7] Processing TextMessage payload=[{"tsSubCmd..], byteCount=180, last=true] 2018-05-29 16:03:53,715 [http-nio-0.0.0.0-8080-exec-6] INFO o.t.s.c.plugin.TbWebSocketHandler - [7] Processing TextMessage payload=[{"tsSubCmd..], byteCount=157, last=true] 2018-05-29 16:03:53,718 [http-nio-0.0.0.0-8080-exec-10] INFO o.t.s.c.plugin.TbWebSocketHandler - [7] Processing TextMessage payload=[{"tsSubCmd..], byteCount=161, last=true
同时,设置规则链为根规则链时出现审计日志错误:
java.lang.NullPointerException at org.thingsboard.server.dao.rule.BaseRuleChainService.setRootRuleChain(BaseRuleChainService.java:90) at org.thingsboard.server.controller.RuleChainController.setRootRuleChain(RuleChainController.java:140) at org.thingsboard.server.controller.RuleChainController$$FastClassBySpringCGLIB$$c2487d43.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:69) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656) at org.thingsboard.server.controller.RuleChainController$$EnhancerBySpringCGLIB$$165ea7a1.setRootRuleChain(<generated>) at sun.reflect.GeneratedMethodAccessor333.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.Applica
问题分析与排查方案
1. 日志内容的正确解读
你提供的日志是TbWebSocketHandler处理前端页面与服务端WebSocket交互的记录(比如订阅遥测的请求),完全不代表MQTT消息已经送达服务端。要确认MQTT报文是否到达,需要查看tb-mqtt-transport相关日志(通常在logs/mqtt-transport.log),寻找包含Received MQTT message的条目。
2. 遥测数据不显示的核心排查点
(1)验证MQTT连接与报文合法性
- 确认MQTT.fx的配置:使用设备的Access Token作为用户名,密码留空,连接地址为
tcp://你的ThingsBoardIP:1883(默认端口)。 - 上报遥测的主题必须是
v1/devices/me/telemetry,报文必须是标准JSON格式,例如:
注意检查JSON语法,避免引号缺失、逗号错误等问题。{"temperature": 26.2, "humidity": 58}
(2)默认规则链的必要性
ThingsBoard自带的Root Rule Chain已经包含Save Timeseries节点,无需额外导入规则链就能存储遥测数据。你导入的温度告警链是扩展功能,不是数据存储的必要条件。
3. 解决设置根规则链的NullPointerException错误
这个错误通常是因为导入的规则链存在缺陷,或者原默认根规则链被误删除导致的,解决步骤如下:
- 恢复默认根规则链:
- 进入规则链页面,点击右上角
+按钮选择Import rule chain; - 导入安装目录
data/rule_chains下的默认根规则链JSON文件,或重启ThingsBoard服务尝试自动恢复。
- 进入规则链页面,点击右上角
- 避免直接替换根规则链:应该将导入的规则链作为子链添加到默认根规则链中,而非设置为根链。
4. 额外验证步骤
- 查看设备详情页的Events标签:如果存在
Post Telemetry事件,说明数据已到达服务端,需排查存储或展示问题;如果没有,说明MQTT报文未送达,需重新检查MQTT连接配置。 - 确认数据库状态:检查PostgreSQL/MySQL是否正常运行,数据库异常会导致遥测数据无法存储。
内容的提问来源于stack exchange,提问作者Rodrigo Honorio




