使用paho.mqtt实现MQTT协议通信的最佳实践

MQTT(Message Queue Telemetry Transport)是一种基于发布/订阅模式的轻量级物联网通信协议,它在移动设备和物联网应用方面得到了广泛的应用。本文将介绍使用paho.mqtt实现MQTT协议通信的最佳实践,包括MQTT协议基础概念、MQTT客户端的连接建立、消息订阅和发布、QoS质量等级、TLS/SSL安全连接等。

一、MQTT协议基础概念

MQTT协议是一种基于TCP/IP协议的轻量级协议,具有以下特点:

1. 发布/订阅模式:MQTT协议采用发布-订阅(publish-subscribe)模式,允许多个客户端监听同一个主题(Topic),在主题发送消息时所有订阅该主题的客户端都会接收到消息。

2. 压缩消息:MQTT协议支持消息压缩,可以有效地减少网络传输的数据量。

3. QoS质量等级:MQTT协议支持三种服务质量等级,分别为At most once、At least once和Exactly once。

4. 低耗能:MQTT协议采用轻量级的二进制通信协议,协议开销小,适合在带宽较低、 CPU和内存资源有限的设备间通信。

二、MQTT客户端的连接建立

MQTT客户端的连接建立需要指定以下三个参数:

1. Broker地址:MQTT Broker是实现MQTT协议的服务端,用于处理客户端的连接、认证和消息路由等。客户端需要指定Broker的地址。

2. Client ID:客户端ID是组成客户端标识的字符串,客户端需要在连接Broker时指定Client ID,如果不指定,Broker会随机生成一个唯一的Client ID。

3. Will Message:客户端可以指定一个遗嘱消息,当客户端异常断开连接时,Broker会将遗嘱消息发布到指定的主题,通知其他客户端。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
WILL_MESSAGE = {"topic": "WillTopic", "payload": "Connection closed unexpectedly!", "qos": 2, "retain": False}

client = mqtt.Client(client_id=CLIENT_ID)
client.will_set(topic=WILL_MESSAGE["topic"], payload=WILL_MESSAGE["payload"], qos=WILL_MESSAGE["qos"], retain=WILL_MESSAGE["retain"])
client.connect(BROKER_ADDRESS)

三、消息订阅和发布

MQTT协议支持消息订阅和发布两种操作,客户端可以订阅指定的主题,也可以发布消息到指定的主题。

1. 消息订阅:客户端订阅一个主题后,当该主题有消息发布时,该消息就会被该客户端接收到。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
QOS = 2

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(TOPIC, QOS)

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client(client_id=CLIENT_ID)
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS)
client.loop_forever()

2. 消息发布:客户端可以向指定主题发布消息,其他订阅了该主题的客户端会接收到该消息。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
PAYLOAD = "Hello, MQTT!"
QOS = 2

def on_publish(client, userdata, mid):
    print("Message published.")

client = mqtt.Client(client_id=CLIENT_ID)
client.on_publish = on_publish
client.connect(BROKER_ADDRESS)
client.publish(TOPIC, PAYLOAD, QOS)
client.loop_forever()

四、QoS质量等级

MQTT协议支持三种服务质量等级,分别为At most once、At least once和Exactly once。

1. At most once:消息可能会丢失或重复发送,最多发送一次。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
PAYLOAD = "Hello, MQTT!"
QOS = 0

client = mqtt.Client(client_id=CLIENT_ID)
client.connect(BROKER_ADDRESS)
client.publish(TOPIC, PAYLOAD, QOS)
client.loop_forever()

2. At least once:消息至少会被处理一次,但可能会重复发送。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
PAYLOAD = "Hello, MQTT!"
QOS = 1

def on_publish(client, userdata, mid):
    print("Message published.")

client = mqtt.Client(client_id=CLIENT_ID)
client.on_publish = on_publish
client.connect(BROKER_ADDRESS)
client.publish(TOPIC, PAYLOAD, QOS)
client.loop_forever()

3. Exactly once:消息确保仅被处理一次。

import paho.mqtt.client as mqtt

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
PAYLOAD = "Hello, MQTT!"
QOS = 2

def on_publish(client, userdata, mid):
    print("Message published.")

client = mqtt.Client(client_id=CLIENT_ID)
client.on_publish = on_publish
client.connect(BROKER_ADDRESS)
client.publish(TOPIC, PAYLOAD, QOS)
client.loop_forever()

五、TLS/SSL安全连接

MQTT协议支持使用TLS/SSL协议进行安全连接,提供端到端的数据加密和身份认证。

import paho.mqtt.client as mqtt
import ssl

BROKER_ADDRESS = "broker.emqx.io"
CLIENT_ID = "paho-mqtt-client"
TOPIC = "test/topic"
PAYLOAD = "Hello, MQTT!"
QOS = 2

def on_publish(client, userdata, mid):
    print("Message published.")

client = mqtt.Client(client_id=CLIENT_ID)
client.on_publish = on_publish
client.tls_set(ca_certs="ca.pem", certfile="client.crt", keyfile="client.key",
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
client.connect(BROKER_ADDRESS, port=8883)
client.publish(TOPIC, PAYLOAD, QOS)
client.loop_forever()

以上是使用paho.mqtt实现MQTT协议通信的最佳实践,在实际应用中可以根据实际需求进行调整和优化。

原创文章,作者:LUDIG,如若转载,请注明出处:https://www.506064.com/n/334211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LUDIGLUDIG
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相关推荐

  • MQTT使用教程

    MQTT是一种轻量级的消息传输协议,适用于物联网领域中的设备与云端、设备与设备之间的数据传输。本文将介绍使用MQTT实现设备与云端数据传输的方法和注意事项。 一、准备工作 在使用M…

    编程 2025-04-29
  • 机智云gagent属于哪个协议?

    机智云gagent主要是基于MQTT协议,同时支持TCP、TLS、WebSocket等多种协议。 一、MQTT协议介绍 MQTT全称Message Queuing Telemetr…

    编程 2025-04-29
  • 使用Netzob进行网络协议分析

    Netzob是一款开源的网络协议分析工具。它提供了一套完整的协议分析框架,可以支持多种数据格式的解析和可视化,方便用户对协议数据进行分析和定制。本文将从多个方面对Netzob进行详…

    编程 2025-04-29
  • 如何取消火车票自动抢票协议

    火车票自动抢票协议,是一种利用技术手段在系统繁忙的情况下,自动刷取并抢购火车票的行为。虽然在某些情况下能够提高购票成功率,但是也会影响其他乘客的购票权益。因此,取消火车票自动抢票协…

    编程 2025-04-29
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27
  • USB协议栈

    USB(Universal Serial Bus)是一种常见的计算机外部接口,它已经被广泛使用在各种设备中,例如打印机、键盘、鼠标等。在实现USB通信的过程中,USB协议栈起着非常…

    编程 2025-04-27
  • DR & BDR:OSPF协议中的两个重要角色

    一、什么是DR & BDR? 在OSPF协议中,DR(Designated Router)和BDR(Backup Designated Router)是两个非常重要的角色。…

    编程 2025-04-25
  • ROS通信

    一、概述 ROS是机器人操作系统,是一个开源的、灵活的、分布式的软件平台,可以帮助我们快速开发机器人应用程序。ROS中的通信是机器人应用程序开发中最重要的部分之一,它是实现多模块协…

    编程 2025-04-25
  • YModem协议在上位机中的应用

    一、YModem协议概述 YModem协议是一种常用于串口通信中的文件传输协议。它支持数据校验和数据重传功能,使得数据传输更加稳定可靠。YModem协议有多种不同的实现方式,其中最…

    编程 2025-04-25

发表回复

登录后才能评论