簡單認識認識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服務器。

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