1. 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()
运行方式
- 保存代码为
mqtt_reconnect.py - 执行:
python mqtt_reconnect.py
验证方法与判定标准
- 正常连接验证:启动后 2 秒内日志出现
✅ 连接成功,随后每 5 秒出现一次📤 发布和📩 收到消息(因为自己订阅了自己发布的主题)。 - 断线重连验证:运行过程中断开网络(如关闭 Wi-Fi 或拔掉网线),观察日志出现
⚠️ 意外断开;恢复网络后,日志应在 1~30 秒内出现🔄 已重连和✅ 连接成功,并继续周期性收发消息。 - 通过条件:断网恢复后无需手动重启程序,客户端能自动恢复连接并继续发布/接收消息,即视为重连机制生效。
常见问题
- 连接失败(rc=5):公共 Broker 可能拒绝重复 Client ID,更换
CLIENT_ID中的唯一后缀即可。 - 收不到自己发布的消息:确认订阅主题与发布主题完全一致(含通配符层级)。
- 重连不触发:检查是否调用了
loop_start()或loop_forever()——只有网络循环运行时 Paho 才能检测断线并自动重连。