VitaBox AD

2024年3月2日 星期六

[MQTT]Mosquitto的簡介、安裝與本機連接測試

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的架構而言,本機的角色同時為發佈端(publisher)、中介端(broker)和訂閱端(subscriber),流程如下,同樣可參考影片操作。

a.在本機開啟一個終端機作為發佈端

mosquitto_pub -h localhost -t sensor_1 -m “25.3C”

b.在本機開啟另一個終端機作為訂閱端

mosquitto_sub -h localhost -t sensor_1 


當發佈端發佈數據時,訂閱端即會顯示內容。另外,關於訂閱和發佈端的完整命令行參數,可參考下列內容。

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:開啟調試模式,輸出更詳細的調試信息。

沒有留言:

張貼留言