MQTT(Message Queuing Telemetry Transport)是基於發布/訂閱模式(Publish/Subscribe)的輕量級網絡通訊協議,專用於在低帶寬、不可靠的網絡環境中傳輸數據,關於工作原理和優點如下:
1.發布/訂閱模式(Publish/Subscribe)
發布者將消息發布特定的主題(topic)到中介伺服器(broker),而訂閱者可藉由訂閱主題而從中介伺服器接收對應的數據,同時發佈者和訂閱者可相互不認識。
2.中介伺服器(Broker)
中介伺服器接收來自發布者的消息並將其轉發給訂閱者。
3.主題(Topic)
主題類似一些RSS軟體的訂閱標籤,發佈者發佈一個主題,只要有訂閱者訂閱該主題,則訂閱者即可收到這個主題的所有數據。
4.質量服務(Quality of Service,QoS)
QoS指標對應網路環境狀態,MQTT 提供不同等級的 QoS,包括 0、1 和 2,用於提供不同程度的消息傳送保證和可靠性,條列如下:
QoS 0: 最多一次交付(At most once)
數據將以最快的速度發送,不保證數據的傳遞,也不保證數據的順序,由於不進行重試,可能會出現數據丟失的情況。此等級適用於對數據傳遞要求不高的應用場景,例如傳感器數據。
QoS 1: 至少一次交付(At least once)
保證消息至少被接收一次,確保消息不會丟失,但可能會收到多次重複的消息。發送端在收到 PUBACK(發佈確認)消息後,會重新發送消息直到接收到 PUBACK。此等級適用於要求消息傳遞的可靠性高,但可以容忍重複消息的應用場景,例如命令和控制應用。
QoS 2: 僅一次交付(Exactly once)
其通過使用需要進行兩次握手確認(PUBREC 和 PUBREL)確認來實現,確保消息僅被接收一次且不會出現重複,但可能會增加延遲和帶寬消耗。此等級適用於對消息傳遞的準確性和可靠性要求最高的場景,例如金融交易和重要報警通知。
安裝:
常見的MQTT broker有Mosquitto、HiveMQ和EMQ X等等。本文採用Mosquitto來安裝和連接測試,安裝過程也相當簡單,不論在虛擬機或樹莓派(Raspberrypi 4B)的Ubuntu 22.04 LTS的環境下,皆可順利安裝。
a.首先更新和安裝本機的軟體安裝庫
sudo apt update
sudo apt upgrade
b.安裝mosquitto中介伺服器(mosquitto)和客戶端(mosquitto-clients)
sudo apt install mosquitto mosquitto-clients
c.查看mosquitto中介伺服器(mosquitto)狀態
sudo systemctl status mosquitto
若為active,表示mosquitto broker已順利啟動。若為inactive,則可輸入下列指令重啟broker。
sudo systemctl restart mosquitto
完成安裝並啟動broker後,可先行查看Mosquitto的日誌,日誌一般置放在/var/log/mosquitto/mosquitto.log路徑,並可用tail來查看最新log內容,結果類似圖一。
sudo tail -f /var/log/mosquitto/mosquitto.log
另外,為了讓易於解讀log中的時間訊息,可將log中的時間戳(timestamp)轉成日期/時間格式,其需將下列內容新增於/etc/mosquitto/mosquitto.conf,亦可參考影片內容操作。
# For time format
log_timestamp true
log_timestamp_format %Y-%m-%d %H:%M:%S
完成後,記得重新啟動mosquitto broker,即可顯示易於解讀的日期/時間格式
[MQTT I Mosquitto]How to Convert Timestamp to Datetime in Mosquitto log
本機連接測試:
接著為了確保發佈和訂閱是否正常運作,可在本機先行測試,以MQTT的架構而言,本機的角色同時為發佈端(publisher)、中介端(broker)和訂閱端(subscriber),流程如下,同樣可參考影片操作。
a.在本機開啟一個終端機作為發佈端
mosquitto_pub -h localhost -t sensor_1 -m “25.3C”
b.在本機開啟另一個終端機作為訂閱端
mosquitto_sub -h localhost -t sensor_1
[MQTT I Mosquitto]How to Publish and Subscribe on Localhost
當發佈端發佈數據時,訂閱端即會顯示內容。另外,關於訂閱和發佈端的完整命令行參數,可參考下列內容。
mosquitto_pub:
-h <host>:指定 MQTT broker 的主機名或 IP 地址。
-p <port>:指定 MQTT broker 的端口號。
-t <topic>:指定要發佈的 MQTT 主題。
-m <message>:指定要發佈的消息內容。
-q <qos>:指定消息的 QoS(0、1 或 2)。
-r:指定消息是否要求保留(retain)。
-u <username>:指定用戶名(如果 broker 設置了身份驗證)。
-P <password>:指定密碼(如果 broker 設置了身份驗證)。
-i <clientid>:指定客戶端識別符。
-d:開啟調試模式,輸出更詳細的調試信息。
mosquitto_sub:
-h <host>:指定 MQTT broker 的主機名或 IP 地址。
-p <port>:指定 MQTT broker 的端口號。
-t <topic>:指定要訂閱的 MQTT 主題。
-q <qos>:指定訂閱的 QoS(0、1 或 2)。
-u <username>:指定用戶名(如果 broker 設置了身份驗證)。
-P <password>:指定密碼(如果 broker 設置了身份驗證)。
-i <clientid>:指定客戶端識別符。
-v:開啟冗長模式,顯示訂閱的消息及其相關信息。
-d:開啟調試模式,輸出更詳細的調試信息。