1. MQTT基础连接与断开
任务目标
使用Python的paho-mqtt库,实现MQTT客户端连接到公共Broker(broker.emqx.io),完成连接建立与正常断开,并通过回调函数验证连接状态变化。
环境准备
安装依赖:
pip install paho-mqtt
完整实现代码
import paho.mqtt.client as mqtt
import time
# 连接状态标志
connected = False
disconnected = False
def on_connect(client, userdata, flags, rc, properties=None):
"""连接成功回调"""
global connected
if rc == 0:
connected = True
print(f"连接成功,返回码: {rc}")
else:
print(f"连接失败,返回码: {rc}")
def on_disconnect(client, userdata, flags, rc, properties=None):
"""断开连接回调"""
global disconnected
disconnected = True
print(f"已断开连接,返回码: {rc}")
# 创建客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
# 绑定回调
client.on_connect = on_connect
client.on_disconnect = on_disconnect
# 连接到公共Broker
BROKER_HOST = "broker.emqx.io"
BROKER_PORT = 1883
KEEPALIVE = 60
client.connect(BROKER_HOST, BROKER_PORT, KEEPALIVE)
# 启动网络循环(非阻塞)
client.loop_start()
# 等待连接完成(最多等待5秒)
wait_time = 0
while not connected and wait_time < 5:
time.sleep(0.1)
wait_time += 0.1
if connected:
print("连接状态验证通过")
# 保持连接2秒后主动断开
time.sleep(2)
client.disconnect()
# 等待断开回调触发
wait_time = 0
while not disconnected and wait_time < 5:
time.sleep(0.1)
wait_time += 0.1
if disconnected:
print("断开状态验证通过")
else:
print("断开回调未触发")
else:
print("连接超时,请检查网络或Broker地址")
# 停止网络循环并释放资源
client.loop_stop()
client = None
运行方式
python mqtt_connect_disconnect.py
验证方法与判定标准
运行程序后,观察控制台输出:
- 连接成功:出现
连接成功,返回码: 0,随后输出连接状态验证通过,说明客户端已成功建立与Broker的TCP连接并完成MQTT握手。 - 断开成功:约2秒后出现
已断开连接,返回码: 0,随后输出断开状态验证通过,说明客户端主动发送了DISCONNECT报文并正常关闭连接。 - 失败情况:若网络不通或Broker不可达,会输出
连接超时;若返回码非0,会输出对应的错误码(如5表示认证失败)。
关键说明
本案例使用loop_start()启动后台网络线程处理MQTT报文,避免阻塞主线程。回调函数on_connect和on_disconnect分别在连接建立和断开时被触发,通过全局标志变量记录状态变化,主线程轮询这些标志来确认操作是否成功。公共Broker无需注册即可连接,但网络需能访问外网(默认端口1883)。