簡單認識認識mqtt及mosquitto

語言: CN / TW / HK

這篇文章分享使用MQTT來作為程序間通訊的方式。

MQTT的一些介紹

以下介紹內容來自《[野火]《LwIP應用開發實戰指南》

MQTT 協議全稱是 Message Queuing Telemetry Transport,翻譯過來就是訊息佇列遙測傳輸協議,它是物聯網常用的應用層協議,執行在 TCP/IP 中的應用層中,依賴 TCP 協議,因此它具有非常高的可靠性,同時它是基於 TCP 協議的<客戶端-伺服器>模型釋出/訂閱主題訊息的輕量級協議。

1、MQTT通訊模型

001.jpg

MQTT協議是基於客戶端-伺服器模型,在協議中主要有三種身份:釋出者(Publisher)伺服器(Broker) 以及訂閱者(Subscriber)。 並且訊息釋出者可以同時是訂閱者 。

MQTT 訊息的釋出者和訂閱者都是客戶端,伺服器只是作為一箇中轉的存在,將釋出者釋出的訊息進行轉發給所有訂閱該主題的訂閱者。

MQTT 客戶端的功能:

  • 釋出訊息給其它相關的客戶端。
  • 訂閱主題請求接收相關的應用訊息。
  • 取消訂閱主題請求移除接收應用訊息。
  • 從服務端終止連線。

MQTT 伺服器常被稱為 Broker(訊息代理) 。它的功能有:

  • 接受來自客戶端的網路連線請求。

  • 接受客戶端釋出的應用訊息。

  • 處理客戶端的訂閱和取消訂閱請求。

  • 轉發應用訊息給符合條件的已訂閱客戶端(包括髮布者自身)。

2、MQTT訊息

MQTT所發的訊息包含:主題+內容,客戶端可以訂閱任意主題,若有其它客戶端釋出主題時符合所訂閱的主題,就會由閘道器傳送到客戶端。

什麼是主題?

MQTT 伺服器為每個連線的客戶端(訂閱者)新增一個標籤,該標籤與伺服器中的所有訂閱相匹配, 伺服器會將訊息轉發給與標籤相匹配的每個客戶端。這樣的一個標籤就是主題。

服務質量:

MQTT提供三種服務質量(Quality of Service,簡寫QoS),供開發者根據不同的情景選擇不同的服務級別:

  • QoS0:最多傳送一次訊息,在訊息傳送出去後,接收者不會發送回應,傳送者也不會重發訊息。

  • QoS1: 最少傳送一次訊息(訊息最少需要送達一次,也有可送達多次), QoS 1的 PUBLISH 報文的可變報頭中包含一個報文識別符號,需要 PUBACK 報文確認。

  • QoS2: 這是最高等級的服務質量,訊息丟失和重複都是不可接受的。只不過使用這個服務質量等級會有額外的開銷,這個等級常用於支付中,因為支付是必須有且僅有一次成功,總不能沒給錢或者給了多次錢吧。

mosquitto的使用

1、mosquitto簡介

mosquitto是一款開源的MQTT訊息代理(伺服器)軟體,提供輕量級的,支援可釋出/可訂閱的的訊息推送模式,使裝置對裝置之間的短訊息通訊變得簡單,比如現在應用廣泛的低功耗感測器,手機、嵌入式計算機、微型控制器等移動裝置。

mosquitto倉庫地址:

https://gitee.com/zhengnianli/mosquitto

https://github.com/eclipse/mosquitto

2、mosquitto實踐

從以上鍊接下載mosquitto原始碼,得到:

002.png

在mosquitto路徑下,依次輸入如下命令編譯:

shell mkdir build cd build cmake ../ make

003.png

004.png

若未安裝cmake則需要自行安裝。

若執行cmake ../指令時出現Could NOT find OpenSSL的問題:

005.png

可輸入如下命令安裝OpenSSL(Ubuntu下):

sudo apt-get install libssl-dev

執行make編譯完成後,我們可以看到build目錄下的clientsrc資料夾下會生成一些可執行檔案:

006.png

我們重點關注mosquitto_pubmosquitto_submosquitto這三個可執行檔案。其中mosquitto是伺服器軟體,mosquitto_pub是釋出者客戶端,mosquitto_sub訂閱者客戶端。

下面我們來簡單測試一下:

007.png

其中,mosquitto_pub對應的原始檔為mosquitto/client/pub_client.c,mosquitto_sub對應的原始檔為mosquitto/client/sub_client.c,感興趣的朋友可自行閱讀學習。

這個示例其實就是兩個程序間的通訊,前提是需要一個本地代理伺服器。如果需要應用於我們嵌入式Linux中的程序間通訊,需要使用交叉編譯器編譯出一個可執行在我們的arm板上的mosquitto伺服器。

以上就是本次的分享,下一篇我們再一起看更具體的例項。如有錯誤,歡迎指出,謝謝!