1. MQTT基础连接与断线重连

MQTT基础连接与断线重连 学习卡片

任务目标

使用 Eclipse Paho MQTT Python 客户端连接公共 Broker(broker.emqx.io:1883),实现基础连接、订阅/发布消息,并配置自动重连机制,确保网络波动后客户端能自动恢复连接并继续收发消息。

环境依赖

  • Python 3.8+
  • 安装 Paho MQTT 客户端:pip install paho-mqtt

关键完整代码

import paho.mqtt.client as mqtt
import time
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Broker 配置
BROKER_HOST = "broker.emqx.io"
BROKER_PORT = 1883
TOPIC = "test/topic/reconnect-demo"
CLIENT_ID = "mqtt-reconnect-demo-001"

# 连接状态回调
def on_connect(client, userdata, flags, rc, properties=None):
    if rc == 0:
        logger.info("✅ 连接成功")
        client.subscribe(TOPIC, qos=1)
    else:
        logger.error(f"❌ 连接失败,返回码: {rc}")

# 消息回调
def on_message(client, userdata, msg):
    logger.info(f"📩 收到消息: {msg.topic} -> {msg.payload.decode()}")

# 断线回调(触发自动重连)
def on_disconnect(client, userdata, rc):
    if rc != 0:
        logger.warning(f"⚠️ 意外断开 (rc={rc}),尝试自动重连...")
    # Paho 在 rc!=0 时会自动重连(若 reconnect_delay 已设置)

# 重连回调
def on_reconnect(client, userdata, rc):
    logger.info(f"🔄 已重连,返回码: {rc}")

# 创建客户端
client = mqtt.Client(
    client_id=CLIENT_ID,
    protocol=mqtt.MQTTv311,
    callback_api_version=mqtt.CallbackAPIVersion.VERSION2
)

# 绑定回调
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.on_reconnect = on_reconnect

# 配置自动重连参数(关键)
client.reconnect_delay_set(min_delay=1, max_delay=30)  # 指数退避重连

# 连接 Broker
client.connect(BROKER_HOST, BROKER_PORT, keepalive=60)

# 启动网络循环(非阻塞,自动处理重连)
client.loop_start()

# 模拟业务:周期发布消息
try:
    msg_count = 0
    while True:
        msg_count += 1
        payload = f"心跳消息 #{msg_count}"
        client.publish(TOPIC, payload, qos=1)
        logger.info(f"📤 发布: {payload}")
        time.sleep(5)
except KeyboardInterrupt:
    logger.info("手动终止,断开连接")
    client.loop_stop()
    client.disconnect()

运行方式

  1. 保存代码为 mqtt_reconnect.py
  2. 执行:python mqtt_reconnect.py

验证方法与判定标准

  • 正常连接验证:启动后 2 秒内日志出现 ✅ 连接成功,随后每 5 秒出现一次 📤 发布 和 📩 收到消息(因为自己订阅了自己发布的主题)。
  • 断线重连验证:运行过程中断开网络(如关闭 Wi-Fi 或拔掉网线),观察日志出现 ⚠️ 意外断开;恢复网络后,日志应在 1~30 秒内出现 🔄 已重连 和 ✅ 连接成功,并继续周期性收发消息。
  • 通过条件:断网恢复后无需手动重启程序,客户端能自动恢复连接并继续发布/接收消息,即视为重连机制生效。

常见问题

  • 连接失败(rc=5):公共 Broker 可能拒绝重复 Client ID,更换 CLIENT_ID 中的唯一后缀即可。
  • 收不到自己发布的消息:确认订阅主题与发布主题完全一致(含通配符层级)。
  • 重连不触发:检查是否调用了 loop_start() 或 loop_forever()——只有网络循环运行时 Paho 才能检测断线并自动重连。