工作前其實完全沒有聽過 MQTT,後來用到才開始了解他,今天來用最簡單的方式,介紹一下什麼是 MQTT !
MQTT is a lightweight, publish-subscribe, machine to machine network protocol for message queue/message queuing service.
MQTT 是一個輕量且可靠的二進位通訊協定,專門為需要節省網路資源的應用場景所設計。它和 HTTP 一樣,底層都是 TCP/IP,只是訊息的格式不太一樣。
它採用發布-訂閱(Pub-Sub)模式。這個模式不需要發送者與接收者直接連接,所有的訊息都透過**中央的 Broker **來管理。由於網路資源需求較低、高效率的特性,MQTT 成為物聯網(IoT)設備間常用的協議。
雖然常用於 IOT 但在需要低延遲的產品上也能使用,如 Facebook Messenger 這樣的即時通訊的軟體,因為它能在大規模的使用者基礎上提供低延遲的通訊,並且有效減少網路資源的消耗。所以也使用 MQTT。
MQTT 採用的架構是 Client(客戶端)和 Broker(代理服務器)。客戶端負責發佈或訂閱訊息,Broker 負責接收和發布的訊息。
圖片來源
每個 MQTT 訊息都會有一個主題,可以透過訂閱/發布主題,來進行訊息的交流。
主題可以有不同的階層架構,如檔案路徑一般用 /
來做階層的區隔。
/vehicle/car/wheel #交通工具/汽車/輪子
/university/department #大學/系所
QoS 0:最多傳一次(At most once)
QoS 1:至少傳一次(At least once)
QoS 2:確實傳一次(Exactly once)
當網路資源有限時,QoS 0 可能是最佳選擇;而當通訊不穩定但資源較充足時,QoS 2 是最理想的選擇。
保留訊息(Retained Messages):保留訊息會保存最後 PUBLISH 的訊息,如果使用者斷線或有新的訂閱者就可以立即接收到最新的消息。
簡單用 Python 建立一個 MQTT
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe("sensor/temperature")
def on_message(client, userdata, msg):
print(f"{msg.topic} {msg.payload.decode()}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("mqtt-broker.example.com", 1883, 60) #port 預設 1883
client.loop_forever()