You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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格式,例如:
    {"temperature": 26.2, "humidity": 58}
    
    注意检查JSON语法,避免引号缺失、逗号错误等问题。

(2)默认规则链的必要性

ThingsBoard自带的Root Rule Chain已经包含Save Timeseries节点,无需额外导入规则链就能存储遥测数据。你导入的温度告警链是扩展功能,不是数据存储的必要条件。

3. 解决设置根规则链的NullPointerException错误

这个错误通常是因为导入的规则链存在缺陷,或者原默认根规则链被误删除导致的,解决步骤如下:

  • 恢复默认根规则链:
    1. 进入规则链页面,点击右上角+按钮选择Import rule chain
    2. 导入安装目录data/rule_chains下的默认根规则链JSON文件,或重启ThingsBoard服务尝试自动恢复。
  • 避免直接替换根规则链:应该将导入的规则链作为子链添加到默认根规则链中,而非设置为根链。

4. 额外验证步骤

  • 查看设备详情页的Events标签:如果存在Post Telemetry事件,说明数据已到达服务端,需排查存储或展示问题;如果没有,说明MQTT报文未送达,需重新检查MQTT连接配置。
  • 确认数据库状态:检查PostgreSQL/MySQL是否正常运行,数据库异常会导致遥测数据无法存储。

内容的提问来源于stack exchange,提问作者Rodrigo Honorio

火山引擎 最新活动