簡單認識認識mqtt及mosquitto
這篇文章分享使用MQTT來作為進程間通信的方式。
MQTT的一些介紹
以下介紹內容來自《[野火]《LwIP應用開發實戰指南》
MQTT 協議
全稱是 Message Queuing Telemetry Transport,翻譯過來就是消息隊列遙測傳輸協議
,它是物聯網常用的應用層協議
,運行在 TCP/IP 中的應用層中,依賴 TCP 協議
,因此它具有非常高的可靠性
,同時它是基於 TCP 協議的<客户端-服務器>模型發佈/訂閲主題消息的輕量級協議。
1、MQTT通信模型
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源碼,得到:
在mosquitto路徑下,依次輸入如下命令編譯:
shell
mkdir build
cd build
cmake ../
make
若未安裝cmake則需要自行安裝。
若執行cmake ../
指令時出現Could NOT find OpenSSL
的問題:
可輸入如下命令安裝OpenSSL(Ubuntu下):
sudo apt-get install libssl-dev
執行make編譯完成後,我們可以看到build目錄下的client
與src
文件夾下會生成一些可執行文件:
我們重點關注mosquitto_pub
、mosquitto_sub
、mosquitto
這三個可執行文件。其中mosquitto
是服務器軟件,mosquitto_pub
是發佈者客户端,mosquitto_sub
訂閲者客户端。
下面我們來簡單測試一下:
其中,mosquitto_pub對應的源文件為mosquitto/client/pub_client.c
,mosquitto_sub對應的源文件為mosquitto/client/sub_client.c
,感興趣的朋友可自行閲讀學習。
這個示例其實就是兩個進程間的通信,前提是需要一個本地代理服務器。如果需要應用於我們嵌入式Linux中的進程間通信,需要使用交叉編譯器編譯出一個可運行在我們的arm板上的mosquitto
服務器。
以上就是本次的分享,下一篇我們再一起看更具體的實例。如有錯誤,歡迎指出,謝謝!