thingsboard/summary/24-MQTT规则节点检查指南.md

6.8 KiB
Raw Permalink Blame History

MQTT 规则节点检查指南

问题分析

根据日志分析,发现以下情况:

  1. 消息处理流程

    • 设备数据正常进入规则链
    • 消息在 Save Timeseries 节点处被处理
    • 但没有继续到 MQTT 节点
  2. 日志显示

    Last Rule Node: [RuleChain: Root Rule Chain|RuleNode: Save Timeseries(64ebb5c0-b857-11f0-b3fb-3333a2767a21)]
    
    • 所有消息都在 Save Timeseries 节点停止
    • 没有看到 MQTT 节点相关的日志
  3. 可能的原因

    • MQTT 节点没有正确连接到 Save Timeseries 节点的输出
    • MQTT 节点配置错误host、port、credentials 等)
    • MQTT 节点初始化失败但没有记录错误
    • 规则链连接配置问题

检查步骤

1. 检查规则链配置Web UI

  1. 登录 ThingsBoard Web UI

    • 访问:http://localhost:8080
    • 使用管理员账号登录
  2. 检查 Root Rule Chain

    • 进入:Rule ChainsRoot Rule Chain
    • 查看节点列表:
      • 确认是否有 MQTT 节点
      • 查看 MQTT 节点的配置
  3. 检查节点连接

    • 在规则链编辑器中,检查:
      • Save Timeseries 节点是否有输出连接到 MQTT 节点
      • 连接类型应该是 Success(绿色箭头)
    • 常见问题
      • 节点没有连接
      • 连接到了错误的路由(如 Failure 而不是 Success

2. 检查 MQTT 节点配置

必需的配置项

  • Host: MQTT Broker 地址(如 localhostmqtt.example.com
  • Port: MQTT Broker 端口(如 18838883
  • Topic Pattern: MQTT 主题模式(如 tb/telemetry/${deviceName}
  • Credentials: 认证信息(如果 MQTT Broker 需要认证)

检查方法

  1. 在规则链编辑器中,点击 MQTT 节点
  2. 查看配置面板
  3. 确认所有必需字段都已填写

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"

常见问题及解决方案

问题 1MQTT 节点没有连接到 Save Timeseries 节点

症状

  • 日志显示消息在 Save Timeseries 节点停止
  • 没有 MQTT 节点处理日志

解决方案

  1. 在规则链编辑器中,从 Save Timeseries 节点拖出连接线
  2. 连接到 MQTT 节点
  3. 确保连接类型是 Success(不是 Failure
  4. 保存规则链

问题 2MQTT Broker 连接失败

症状

  • 日志中可能有连接错误(如果日志级别足够详细)
  • MQTT 节点初始化失败

解决方案

  1. 检查 MQTT Broker 地址和端口

    • 确认 Host 和 Port 配置正确
    • 测试网络连接性
  2. 检查认证信息

    • 如果 MQTT Broker 需要用户名密码,确保配置正确
    • 检查 SSL/TLS 配置(如果需要)
  3. 检查防火墙

    • 确保 ThingsBoard 容器可以访问 MQTT Broker
    • 检查端口是否开放

问题 3MQTT 节点配置错误

症状

  • Topic Pattern 配置错误
  • 消息格式不正确

解决方案

  1. 检查 Topic Pattern

    • 使用正确的占位符(如 ${deviceName}, ${deviceType}
    • 示例:tb/telemetry/${deviceName}
  2. 检查消息格式

    • 确认 Parse to plain text 设置是否正确
    • 如果设置为 true,消息会被转换为纯文本格式

问题 4日志级别不够详细

症状

  • 看不到 MQTT 节点的详细日志

解决方案

  1. 修改日志级别

    • 编辑 thingsboard.conflogback.xml
    • 将 MQTT 相关类的日志级别设置为 DEBUG
  2. 查看特定日志

    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 调试功能

  1. 启用规则节点调试事件

    • 在规则链编辑器中,点击 MQTT 节点
    • 启用 "Debug mode"
    • 保存规则链
  2. 查看调试事件

    • 进入:Rule ChainsRoot Rule ChainDebug 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"
  }
}

下一步操作建议

  1. 立即检查

    • 规则链中 MQTT 节点是否存在
    • Save Timeseries 节点是否连接到 MQTT 节点
    • MQTT 节点配置是否完整
  2. 配置验证

    • MQTT Broker 地址和端口是否正确
    • 认证信息是否正确(如果需要)
    • Topic Pattern 是否正确
  3. 测试验证

    • 使用外部 MQTT 客户端订阅主题
    • 发送测试数据到 ThingsBoard
    • 检查是否收到转发消息
  4. 日志检查

    • 查看是否有连接错误
    • 查看是否有发布成功日志
    • 启用调试模式查看详细日志

总结

根据当前日志分析,MQTT 节点很可能没有生效,原因可能是:

  1. 节点连接问题最可能Save Timeseries 节点没有连接到 MQTT 节点
  2. 配置错误MQTT Broker 地址、端口或认证信息错误
  3. 初始化失败MQTT 节点初始化失败但没有记录详细错误

建议

  1. 首先在 Web UI 中检查规则链配置和节点连接
  2. 确认 MQTT 节点配置正确
  3. 测试 MQTT Broker 连接
  4. 如果问题仍然存在,启用调试模式查看详细日志