使用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/zh-hk/n/334211.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LUDIG的頭像LUDIG
上一篇 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

發表回復

登錄後才能評論