1. 边缘设备MQTT连接云平台
任务目标
在边缘设备(以Linux主机模拟)上通过MQTT协议连接IoT云平台(以公共Broker broker.emqx.io:1883模拟),完成一次主题订阅与消息发布,验证双向消息收发链路。
环境依赖
- Python 3.7+,安装
paho-mqtt:pip install paho-mqtt - 网络可访问
broker.emqx.io(1883端口,无需加密)
完整实现代码
import paho.mqtt.client as mqtt
import time
import threading
BROKER = "broker.emqx.io"
PORT = 1883
TOPIC = "edgeai/device001/data"
CLIENT_ID = "edge_device_001"
received_messages = []
def on_connect(client, userdata, flags, rc):
if rc == 0:
print(f"[OK] 已连接Broker: {BROKER}:{PORT}")
client.subscribe(TOPIC, qos=1)
print(f"[OK] 已订阅主题: {TOPIC}")
else:
print(f"[ERR] 连接失败, 返回码={rc}")
def on_message(client, userdata, msg):
payload = msg.payload.decode()
received_messages.append(payload)
print(f"[RECV] 主题: {msg.topic}, 消息: {payload}")
def on_publish(client, userdata, mid):
print(f"[SENT] 消息已发布, mid={mid}")
client = mqtt.Client(client_id=CLIENT_ID, protocol=mqtt.MQTTv311)
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.connect(BROKER, PORT, keepalive=60)
client.loop_start()
# 等待连接与订阅完成
time.sleep(2)
# 发布一条测试消息到自身订阅的主题
test_payload = f"hello-from-{CLIENT_ID}-{int(time.time())}"
client.publish(TOPIC, test_payload, qos=1)
print(f"[INFO] 已发送: {test_payload}")
# 等待消息回环
time.sleep(3)
client.loop_stop()
client.disconnect()
if test_payload in received_messages:
print("[PASS] 消息收发闭环验证通过")
else:
print("[FAIL] 未收到自身发布的消息,请检查网络或Broker状态")
运行方式
python mqtt_edge_client.py
验证方法与判定标准
- 连接成功:控制台输出
[OK] 已连接Broker,说明TCP与MQTT握手正常。 - 订阅成功:输出
[OK] 已订阅主题,说明已注册该主题的监听。 - 消息发布:输出
[SENT] 消息已发布,说明publish调用已由Broker确认(QoS 1)。 - 消息回环:输出
[RECV]且内容与发送的test_payload一致,说明Broker将消息正确路由回订阅端。 - 最终判定:输出
[PASS] 消息收发闭环验证通过,即完成边缘设备经MQTT与云平台双向通信的完整链路。
常见问题
- 连接超时:检查防火墙是否放行1883端口,或更换网络环境重试。
- 收不到自身消息:确认订阅与发布使用完全相同的主题字符串(含大小写);公共Broker可能对短时重复连接有频率限制,可等待数秒后重跑。
- QoS说明:本案例使用QoS 1,保证消息至少送达一次;若需严格去重可改用QoS 2,但公共Broker可能增加延迟。