无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

精通 MQTT:消息队列遥测传输指南!

2025-6-18 08:40| 发布者: 闪电| 查看: 1| 评论: 0

摘要: 引言MQTT(消息队列遥测传输)是一种轻量级消息协议,专为低带宽、高延迟和不可靠的网络环境设计。它广泛应用于物联网(IoT)应用、消息系统以及实时数据通信领域。本指南深入探讨了 MQTT 的工作原理,解释了其关键 ...

引言

MQTT(消息队列遥测传输)是一种轻量级消息协议,专为低带宽、高延迟和不可靠的网络环境设计。它广泛应用于物联网IoT)应用、消息系统以及实时数据通信领域。

本指南深入探讨了 MQTT 的工作原理,解释了其关键组件,并演示了如何使用 Python 实现 MQTT 客户端。

MQTT 代理

MQTT 系统的核心是代理,它负责管理客户端之间的消息交换。

MQTT 中的客户端

发布者(Publishers):向特定主题发送消息的设备或应用程序。

订阅者(Subscribers):监听这些主题上的消息的设备或应用程序。

代理确保发布者的消息能够可靠地传递给相应的订阅者。

运行本地 MQTT 代理

在本示例中,代理托管在本地(127.0.0.1),这意味着它与 MQTT 客户端运行在同一台机器上。

代理在 Docker 容器中运行,使用 Mosquitto MQTT 代理,并映射到 1883 端口。mosquitto.conf 文件用于配置,允许消息保留和持久化。

MQTT 代理的工作原理

1.代理在 1883 端口监听传入消息。

2.客户端连接到代理。

3.客户端向特定主题发布消息。

4.代理接收并处理消息。

5.代理将消息转发给所有订阅该主题的客户端。

发布者和订阅者

发布者

发布者向特定主题发送消息,代理随后将这些消息分发给感兴趣的客户端。

订阅者

订阅者监听特定主题上的消息,并在收到消息时进行处理。

在 Python 中创建 MQTT 客户端

Python 中的 Paho MQTT 库允许创建可以发布和订阅消息的 MQTT 客户端。

创建 MQTT 客户端

importpaho.mqtt.clientasmqttmqtt_client_1 = mqtt.Client( callback_api_version=mqtt.CallbackAPIVersion.VERSION2, client_id="myClient1", clean_session=True, userdata="Client 1", protocol=mqtt.MQTTv311, transport="tcp")

参数解释

client_id="myClient1" → 为客户端分配一个唯一标识符。

clean_session=True → 如果为 True,客户端断开连接时不会存储会话数据。

protocol=mqtt.MQTTv311 → 指定 MQTT 版本为 3.1.1。

transport="tcp" → 使用 TCP 连接(也可以使用 WebSocket)。

连接到代理

mqtt_client_1.connect("127.0.0.1", port=1883, keepalive=240)

向主题发布消息

mqtt_client_1.publish("robotcell1/temperature", payload=25)

这将向主题 robotcell1/temperature 发送一条消息(25)。任何订阅该主题的客户端将立即收到此消息。

保留消息与非保留消息

保留消息(retain=True)

保留消息会持久化存储在代理上,确保新订阅者能立即收到最后一条消息。

mqtt_client_1.publish("robotcell1/temperature", payload=666, retain=True)

非保留消息(retain=False)

非保留消息仅在发送时被活动订阅者接收。

服务质量(QoS)级别

MQTT 支持三种消息传递保证级别:

+-----------+-----------------------------------+| QOS | Guarantee |+-----------+-----------------------------------+| 0 | At most once (fire and forget) || 1 | At least once (may be duplicated) || 2 | Exactly once (highest reliability)|+-----------+-----------------------------------+

订阅主题

all_messages = []defon_message(client, userdata, msg): print(f"Client:{userdata}| Topic:{msg.topic}| Message:{msg.payload}| Retained:{msg.retain}") all_messages.append(msg)mqtt_client_2 = mqtt.Client()mqtt_client_2.on_message = on_messagemqtt_client_2.connect("127.0.0.1", port=1883, keepalive=240)mqtt_client_2.subscribe("robotcell1/temperature", qos=0)mqtt_client_2.loop_start()

持久会话

默认情况下,当 MQTT 客户端断开连接时,它会丢失所有订阅。如果 clean_session=False,代理会记住:

客户端的订阅。

客户端错过的任何 QoS 1 或 2 消息。

mqtt_client_1= mqtt.Client(client_id="myClient1", clean_session=False)

结论

MQTT 是一种强大且轻量级的实时消息协议。通过利用发布者、订阅者、代理、QoS 级别和保留消息,您可以构建一个适用于物联网及其他领域的健壮消息系统。

原文地址:

https://medium.com/@loughliam/mastering-mqtt-a-guide-to-message-queuing-telemetry-transport-289c74b70777


路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 )

粤公网安备 44030702001224号

GMT+8, 2025-6-18 08:40 , Processed in 0.140400 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部