6.8 KiB
6.8 KiB
MQTT 规则节点检查指南
问题分析
根据日志分析,发现以下情况:
-
消息处理流程:
- 设备数据正常进入规则链
- 消息在
Save Timeseries节点处被处理 - 但没有继续到 MQTT 节点
-
日志显示:
Last Rule Node: [RuleChain: Root Rule Chain|RuleNode: Save Timeseries(64ebb5c0-b857-11f0-b3fb-3333a2767a21)]- 所有消息都在
Save Timeseries节点停止 - 没有看到 MQTT 节点相关的日志
- 所有消息都在
-
可能的原因:
- MQTT 节点没有正确连接到 Save Timeseries 节点的输出
- MQTT 节点配置错误(host、port、credentials 等)
- MQTT 节点初始化失败但没有记录错误
- 规则链连接配置问题
检查步骤
1. 检查规则链配置(Web UI)
-
登录 ThingsBoard Web UI
- 访问:
http://localhost:8080 - 使用管理员账号登录
- 访问:
-
检查 Root Rule Chain
- 进入:
Rule Chains→Root Rule Chain - 查看节点列表:
- 确认是否有 MQTT 节点
- 查看 MQTT 节点的配置
- 进入:
-
检查节点连接
- 在规则链编辑器中,检查:
Save Timeseries节点是否有输出连接到 MQTT 节点- 连接类型应该是
Success(绿色箭头)
- 常见问题:
- 节点没有连接
- 连接到了错误的路由(如
Failure而不是Success)
- 在规则链编辑器中,检查:
2. 检查 MQTT 节点配置
必需的配置项:
- Host: MQTT Broker 地址(如
localhost、mqtt.example.com) - Port: MQTT Broker 端口(如
1883、8883) - Topic Pattern: MQTT 主题模式(如
tb/telemetry/${deviceName}) - Credentials: 认证信息(如果 MQTT Broker 需要认证)
检查方法:
- 在规则链编辑器中,点击 MQTT 节点
- 查看配置面板
- 确认所有必需字段都已填写
3. 检查日志中的错误信息
查看 MQTT 节点初始化错误:
docker logs mytb 2>&1 | grep -i "mqtt.*node\|mqtt.*init\|mqtt.*connect\|mqtt.*broker" | tail -50
查看规则链相关错误:
docker logs mytb 2>&1 | grep -i "rule.*node.*error\|rule.*chain.*error\|external.*node" | tail -50
查看连接失败错误:
docker logs mytb 2>&1 | grep -i "failed to connect\|connection.*refused\|timeout" | tail -50
4. 测试 MQTT Broker 连接
检查 MQTT Broker 是否可访问:
# 如果 MQTT Broker 在本地
nc -zv localhost 1883
# 如果 MQTT Broker 在其他服务器
nc -zv mqtt.example.com 1883
使用 mosquitto 客户端测试:
# 测试连接
mosquitto_pub -h <mqtt-broker-host> -p <port> -t "test/topic" -m "test message"
常见问题及解决方案
问题 1:MQTT 节点没有连接到 Save Timeseries 节点
症状:
- 日志显示消息在 Save Timeseries 节点停止
- 没有 MQTT 节点处理日志
解决方案:
- 在规则链编辑器中,从
Save Timeseries节点拖出连接线 - 连接到 MQTT 节点
- 确保连接类型是
Success(不是Failure) - 保存规则链
问题 2:MQTT Broker 连接失败
症状:
- 日志中可能有连接错误(如果日志级别足够详细)
- MQTT 节点初始化失败
解决方案:
-
检查 MQTT Broker 地址和端口:
- 确认 Host 和 Port 配置正确
- 测试网络连接性
-
检查认证信息:
- 如果 MQTT Broker 需要用户名密码,确保配置正确
- 检查 SSL/TLS 配置(如果需要)
-
检查防火墙:
- 确保 ThingsBoard 容器可以访问 MQTT Broker
- 检查端口是否开放
问题 3:MQTT 节点配置错误
症状:
- Topic Pattern 配置错误
- 消息格式不正确
解决方案:
-
检查 Topic Pattern:
- 使用正确的占位符(如
${deviceName},${deviceType}) - 示例:
tb/telemetry/${deviceName}
- 使用正确的占位符(如
-
检查消息格式:
- 确认
Parse to plain text设置是否正确 - 如果设置为
true,消息会被转换为纯文本格式
- 确认
问题 4:日志级别不够详细
症状:
- 看不到 MQTT 节点的详细日志
解决方案:
-
修改日志级别:
- 编辑
thingsboard.conf或logback.xml - 将 MQTT 相关类的日志级别设置为
DEBUG
- 编辑
-
查看特定日志:
docker logs mytb 2>&1 | grep -i "org.thingsboard.rule.engine.mqtt" | tail -50
验证 MQTT 节点是否生效
方法 1:订阅 MQTT 主题
在外部 MQTT 客户端订阅主题:
# 订阅 MQTT 节点配置的主题
mosquitto_sub -h <mqtt-broker-host> -p <port> -t "tb/telemetry/#" -v
如果收到消息,说明 MQTT 节点正常工作。
方法 2:检查 MQTT Broker 日志
如果 MQTT Broker 有日志:
- 查看是否有来自 ThingsBoard 的连接
- 查看是否有消息发布到指定主题
方法 3:使用 ThingsBoard 调试功能
-
启用规则节点调试事件:
- 在规则链编辑器中,点击 MQTT 节点
- 启用 "Debug mode"
- 保存规则链
-
查看调试事件:
- 进入:
Rule Chains→Root Rule Chain→Debug events - 查看 MQTT 节点的处理情况
- 进入:
正确配置示例
规则链结构
设备数据
↓
Save Timeseries (Success)
↓
MQTT Node (Success)
↓
结束
MQTT 节点配置示例
{
"topicPattern": "tb/telemetry/${deviceName}",
"host": "mqtt.example.com",
"port": 1883,
"connectTimeoutSec": 10,
"clientId": "tb-rule-engine",
"cleanSession": true,
"retainedMessage": false,
"ssl": false,
"parseToPlainText": false,
"protocolVersion": "MQTT_3_1_1",
"credentials": {
"type": "anonymous"
}
}
下一步操作建议
-
立即检查:
- 规则链中 MQTT 节点是否存在
- Save Timeseries 节点是否连接到 MQTT 节点
- MQTT 节点配置是否完整
-
配置验证:
- MQTT Broker 地址和端口是否正确
- 认证信息是否正确(如果需要)
- Topic Pattern 是否正确
-
测试验证:
- 使用外部 MQTT 客户端订阅主题
- 发送测试数据到 ThingsBoard
- 检查是否收到转发消息
-
日志检查:
- 查看是否有连接错误
- 查看是否有发布成功日志
- 启用调试模式查看详细日志
总结
根据当前日志分析,MQTT 节点很可能没有生效,原因可能是:
- 节点连接问题(最可能):Save Timeseries 节点没有连接到 MQTT 节点
- 配置错误:MQTT Broker 地址、端口或认证信息错误
- 初始化失败:MQTT 节点初始化失败但没有记录详细错误
建议:
- 首先在 Web UI 中检查规则链配置和节点连接
- 确认 MQTT 节点配置正确
- 测试 MQTT Broker 连接
- 如果问题仍然存在,启用调试模式查看详细日志