MQTT.md

簡介

用於 IOT 裝置的消息傳送協議,可在不穩定的網路下運作

Publish Subscribe

Publisher 向一個 topic 發布消息, Subscriber 從訂閱的 topic 中接收消息,在同一個 topic 中 Publisher 和 Subscriber 都可以有多個客戶端同時使用

Topic

  • UTF-8 string
  • Germany/Bavaria/car/2382340923453/latitude/ 表示層級
  • 訂閱時可以使用通配符,+ 選取同一層級,# 選取同一層級及往下所有層級,如# 表示機器上所有的 topic, Topic 區分大小寫
  • 客戶端在發布或訂閱主題之前不需要建立所需的主題。代理接受每個有效主題,無需任何事先初始化。
  • 前綴 $SYS/ 表示 broker 內部狀態,不會被 # 選取
  • 雖然可以,但不建議斜線開頭

QOS

  • 0 只傳送一次,射後不理
  • 1 自少傳送一次,訊息可能會重複
  • 2 一定只傳送一次 QOS 會引響 broker 與客戶端的封包發送量 QOS,封包數 0,1 1,2 2,4 Publisher 和 Subscriber 可以使用不同的 QOS

持久化

  • broker 會記住 Subscriber 的訂閱,當同一個 ClientId 重新連線時
  • 當 QOS 為 1 和 2 時維持尚未確認消息
  • ClientId 應特定於每個客戶和經紀商。如果代理不需要維護任何狀態,則 MQTT 3.1.1 允許使用空 ClientId。但是,此連線必須將 clean_session 標誌設為 true,否則代理將拒絕該連線。
  • clean_session 為 True 時表示不需要持久化

Retain

原則上,broker 不會保留 Publish 的訊息,訊息要不被傳送給 Subscriber 要不被拋棄,Publish 的 Retain 選項會讓 broker 保留最後一則訊息

Paho Mqtt

eclipse 寫的純 python 庫 client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, clean_session=True)clean_session 必須要是 True 否則行為很怪

Last Will and Testament

連線時設定,在客戶端未使用 DISCONNECT 斷開連線時由 broker 發送,跟一般的消息結構一致

Tool

MqttTool

Public MQTT Broker

Ref

MQTT Essentials Guide and eBook