簡單認識認識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
伺服器。
以上就是本次的分享,下一篇我們再一起看更具體的例項。如有錯誤,歡迎指出,謝謝!