MQTT——入門介紹


筆者相信大家對HTTP一定不能陌生。"HTTP協議的三次握手四次揮手"相信也略有耳聞。HTTP協議的優勢相信大家都明白。不然他不會這流行。然而這並不能忽略他的缺點。最大的特點就是無狀態。有沒有人做過推送的業務。這個時候用HTTP協議顯然是多么SB的事情。筆者有見過一款手機APP。他即然是在客戶端那邊開起一個后台線程然后每一段時間去請求一下服務器,來更新客戶端的信息。不是說不行,可是你們不覺得這樣做太傷了嗎?HTTP協議是請求/響應的模式進行的。當然這樣子很簡單,但優缺點也很明顯。也許可能這就是出現很多通信協議——XMAP協議、MQTT協議、CoAP協議等。最近筆者因為公司任務不得不去了解一下MQTT協議。所以才會有了這一系列的出現。

如果讀者們在百娘上面查找MQTT的話,就會出現很多關於MQTT的介紹。下面是筆者常用的幾個網站。

中文MQTT站點:https://www.gitbook.com/book/mcxiaoke/mqtt-cn/details

英文MQTT站點:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

博客MQTT站點:http://www.steves-internet-guide.com/mqtt/

在這里筆者建議還是要去看英文的。中文的有一些解釋看起來蛋疼。當然也有一些中文的博客介紹的也不錯。

在很多的資料中介紹MQTT協議用於低端的產品比較適合。所以常常會看到他與物聯網一起出現。他是以發布/訂閱的模式進行的。如圖下

從圖上我們可以對MQTT有一個大概的了解。原來MQTT有要三種角色的存在。

Broker代理:很多人理解為中間件,當然可以這樣子認為。他就是一個中間件。用於處理信息並發送到相應的訂閱者。

發布者:用於發布信息到代理上面。注意:發布者也可以是訂閱者。

訂閱者:就是用於接受信息的客戶端。

事實上,在他們通信之間,還需要用一叫“主題”的概念。主題就是用於訂閱者需要什么信息。或是理解為訂閱者對哪種信息感興,然后就訂閱對應的主題,這樣子訂閱者就能夠接受到相應的主題信息。這樣子相信大家對MQTT就了一個很深的概念了。

MQTT協議和HTTP協議一樣子都是基於TCP/IP網絡協議上來進行的。同時在消息的傳輸上又做了三種模式的規定——分別為:最多一次、至少一次、只有一次。即然是通信,那么通信包的設計是少不了的。通信包是以二進字流進行的。

我們都知道HTTP協議里面一個請求就是有一個對應的響應回來。而MQTT也可以這樣子講,只是這里要換另一種說法——一個請求就要一個確定。這一點可以從他相關的命令就可以看出。如圖下。

我們可以看到連接(CONNECT),有一個連接確定(CONNACK)。發布(PUBLISH),有一個發布確定(PUBACK).只有最后的關閉(DISCONNECT)沒有對應的確定。這個在協議里面已經說明了。當客戶端發來一個關閉的請求的時候,服務端不必要回應一個確定給客戶端。讀者一定以為PINGGREQ也沒有。不要誤會!PINGRESP事實上也是一種確定。PINGGREQ用於確定客戶端是不是還連接着。(注:ACK是Acknowledgement的縮寫)

MQTT從宏觀上來看的話,可以分為客戶端和服務器。筆者在學習的過程試過幾個。也試着去查看他的源碼。只是可惜筆者只是對C#、JAVA比較在行。其他開發語言就不行了。所以筆者這里只介紹自己看過並了解過的服務器。至於客戶端的話,你們可以隨便找很多。

mosquitto:是用C/C++開發語言編寫的。據說是目前最流行的MQTT代理。(https://mosquitto.org/)

ActiveMQ:不好意思。這個不是專門為MQTT協議而寫的。是多個協議的。所以筆者不是很喜歡。同時有人說他是純JAVA編寫的。不要被騙了里面還是有SCALA語言的。(http://activemq.apache.org/)

Apollo:這是ActiveMQ的子項目。聽說目前停止維護。筆者略看了一下代碼。不好意思。又不是純JAVA大部分是SCALA。(http://activemq.apache.org/apollo/index.html)

HiveMQ:是商業的MQTT。為什么筆者要提他呢?主要他有很多可以參考的意義。(https://www.hivemq.com/mqtt/)

想要了解更多的信息可以去網站(https://github.com/mqtt/mqtt.github.io/wiki/servers)里面相關MQTT客戶端和服務端的開源介紹和說明。

 學習MQTT最好的方式就是代一個開源的項目。不管是客戶端還是代理端的都要。然后一邊查看源碼一邊查看官方的協議文檔。當然也有一些工具可以幫你略去寫客戶端的代碼。如MQTTLens就是筆者常的。他是一個GOOGLE插件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM