1. MQTT基础连接与断开

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)。