跳转到内容

MQTT Broker 配置

MQTT Broker 配置

本节介绍如何在 Node-RED 中配置 MQTT Broker 连接。学习完成后,您将能够:

  • 在 Node-RED 中添加和配置 MQTT Broker
  • 配置连接安全选项(用户名/密码)
  • 管理多个 Broker 连接
  • 排查常见的 MQTT 连接问题
在 MQTT 节点配置中:
1. 双击 MQTT 输入/输出节点
2. Server → Add new mqtt-broker
3. 填写连接信息
4. 验证连接状态
参数默认值说明
Server(必填)Broker 主机地址
Port1883MQTT 端口 (8883 for TLS)
Protocolmqtt://mqtt:// 或 mqtts://
Client ID自动生成唯一标识 (建议自定义)
Username(可选)认证用户名
Password(可选)认证密码
Keep Alive60s心跳间隔
Clean Sessiontrue是否清除会话
TLS(可选)SSL/TLS 配置
Topic Prefix(可选)主题前缀过滤
{
"broker": "localhost",
"port": "1883",
"clientid": "nodered_local",
"protocol": "mqtt://"
}
{
"broker": "192.168.1.100",
"port": "1883",
"clientid": "nodered_production",
"protocol": "mqtt://",
"credentials": {
"user": "iot_user",
"password": "StrongPassword2024!"
}
}
{
"broker": "mqtt.example.com",
"port": "8883",
"clientid": "nodered_tls",
"protocol": "mqtts://",
"credentials": {
"user": "iot_user",
"password": "SecurePassword123"
},
"tls": {
"ca": "-----BEGIN CERTIFICATE-----\n...",
"cert": "-----BEGIN CERTIFICATE-----\n...",
"key": "-----BEGIN PRIVATE KEY-----\n...",
"servername": "mqtt.example.com",
"verify": true
}
}
services:
mosquitto:
image: eclipse-mosquitto:2
container_name: mosquitto
restart: unless-stopped
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
nodered:
image: nodered/node-red:latest
container_name: nodered
restart: unless-stopped
ports:
- "1880:1880"
volumes:
- ./nodered/data:/data
depends_on:
- mosquitto

Node-RED 支持同时连接多个 MQTT Broker:

┌──────────────────────────────────────┐
│ Node-RED │
├──────────────────────────────────────┤
│ Broker 1: [Local Mosquitto] │
│ ├─ MQTT In: sensor/data │
│ ├─ MQTT Out: device/control │
│ │
│ Broker 2: [Cloud EMQX] │
│ ├─ MQTT In: cloud/commands │
│ ├─ MQTT Out: cloud/telemetry │
│ │
│ Broker 3: [Customer Broker] │
│ ├─ MQTT In: customer/alerts │
│ └─ MQTT Out: customer/status │
└──────────────────────────────────────┘
// Broker 1: 本地
{
"id": "local-broker",
"broker": "mosquitto",
"port": "1883",
"clientid": "nodered-local"
}
// Broker 2: 云端
{
"id": "cloud-broker",
"broker": "cloud.emqx.io",
"port": "1883",
"clientid": "nodered-cloud",
"credentials": {
"user": "cloud_user",
"password": "cloud_password"
}
}
图标颜色说明:
🟢 绿色: 已连接
🔴 红色: 连接失败
🟡 黄色: 正在连接
⚪ 灰色: 未配置

问题 1: Connection refused

Terminal window
# 原因: Broker 未运行或端口错误
# 检查 Broker 状态
docker ps | grep mosquitto
# 检查端口
netstat -tlnp | grep 1883
# 检查防火墙
sudo ufw status
sudo ufw allow 1883

问题 2: Not authorized

Terminal window
# 原因: 认证信息错误
# 检查用户名密码
docker exec mosquitto cat /mosquitto/config/password.txt
# 检查配置文件
docker exec mosquitto cat /mosquitto/config/mosquitto.conf | grep allow_anonymous

问题 3: Connection timeout

Terminal window
# 原因: 网络不通
# 测试网络连通性
ping broker-address
telnet broker-address 1883
# 检查 DNS 解析
nslookup broker-address
Terminal window
# Mosquitto 密码文件配置
docker exec -it mosquitto sh
mosquitto_passwd -c /mosquitto/config/password.txt iot_user
exit
# Node-RED 配置
# Server: broker-address
# Port: 1883
# Username: iot_user
# Password: *****
Terminal window
# 生成自签名证书
openssl req -new -x509 -days 365 \
-keyout mosquitto/certs/server.key \
-out mosquitto/certs/server.crt \
-subj "/CN=mqtt.example.com"
# Mosquitto 配置
listener 8883
cafile /mosquitto/certs/ca.crt
certfile /mosquitto/certs/server.crt
keyfile /mosquitto/certs/server.key
tls_version tlsv1.2

推荐做法:

  • 为每个 Node-RED 实例设置唯一的 Client ID
  • 生产环境始终启用密码认证
  • 使用环境变量管理敏感信息
  • 定期检查 Broker 连接状态
  • 配置心跳 Keep Alive 参数

避免做法:

  • 多个 Node-RED 实例使用相同 Client ID
  • 生产环境使用匿名连接
  • 在 Flow 中硬编码凭据
  • 忽略 TLS 证书过期
  • 不监控连接状态
  1. Node-RED 支持配置多个 MQTT Broker 连接
  2. 支持匿名、密码、TLS 三种认证方式
  3. 连接状态指示器便于监控连接健康度
  4. Docker Compose 环境使用容器名连接
  5. 多 Broker 配置适合边云协同场景