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-tw/n/334211.html