筆者相信大家對HTTP一定不能陌生喊衫。"HTTP協(xié)議的三次握手四次揮手"相信也略有耳聞跌造。HTTP協(xié)議的優(yōu)勢相信大家都明白。不然他不會(huì)這流行族购。然而這并不能忽略他的缺點(diǎn)。最大的特點(diǎn)就是無狀態(tài)陵珍。有沒有人做過推送的業(yè)務(wù)寝杖。這個(gè)時(shí)候用HTTP協(xié)議顯然是多么SB的事情。筆者有見過一款手機(jī)APP互纯。他即然是在客戶端那邊開起一個(gè)后臺(tái)線程然后每一段時(shí)間去請求一下服務(wù)器瑟幕,來更新客戶端的信息。不是說不行,可是你們不覺得這樣做太傷了嗎只盹?HTTP協(xié)議是請求/響應(yīng)的模式進(jìn)行的辣往。當(dāng)然這樣子很簡單,但優(yōu)缺點(diǎn)也很明顯殖卑。也許可能這就是出現(xiàn)很多通信協(xié)議——XMAP協(xié)議站削、MQTT協(xié)議、CoAP協(xié)議等孵稽。最近筆者因?yàn)楣救蝿?wù)不得不去了解一下MQTT協(xié)議许起。所以才會(huì)有了這一系列的出現(xiàn)。
如果讀者們在百娘上面查找MQTT的話菩鲜,就會(huì)出現(xiàn)很多關(guān)于MQTT的介紹园细。下面是筆者常用的幾個(gè)網(wǎng)站。
中文MQTT站點(diǎn):https://www.gitbook.com/book/mcxiaoke/mqtt-cn/details
英文MQTT站點(diǎn):http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect
博客MQTT站點(diǎn):http://www.steves-internet-guide.com/mqtt/
在這里筆者建議還是要去看英文的接校。中文的有一些解釋看起來蛋疼猛频。當(dāng)然也有一些中文的博客介紹的也不錯(cuò)。
在很多的資料中介紹MQTT協(xié)議用于低端的產(chǎn)品比較適合蛛勉。所以常常會(huì)看到他與物聯(lián)網(wǎng)一起出現(xiàn)伦乔。他是以發(fā)布/訂閱的模式進(jìn)行的。如圖下
從圖上我們可以對MQTT有一個(gè)大概的了解董习。原來MQTT有要三種角色的存在烈和。
Broker代理:很多人理解為中間件,當(dāng)然可以這樣子認(rèn)為皿淋。他就是一個(gè)中間件招刹。用于處理信息并發(fā)送到相應(yīng)的訂閱者。
發(fā)布者:用于發(fā)布信息到代理上面窝趣。注意:發(fā)布者也可以是訂閱者疯暑。
訂閱者:就是用于接受信息的客戶端。
事實(shí)上哑舒,在他們通信之間妇拯,還需要用一叫“主題”的概念。主題就是用于訂閱者需要什么信息洗鸵≡叫猓或是理解為訂閱者對哪種信息感興,然后就訂閱對應(yīng)的主題膘滨,這樣子訂閱者就能夠接受到相應(yīng)的主題信息甘凭。這樣子相信大家對MQTT就了一個(gè)很深的概念了。
MQTT協(xié)議和HTTP協(xié)議一樣子都是基于TCP/IP網(wǎng)絡(luò)協(xié)議上來進(jìn)行的火邓。同時(shí)在消息的傳輸上又做了三種模式的規(guī)定——分別為:最多一次丹弱、至少一次德撬、只有一次。即然是通信躲胳,那么通信包的設(shè)計(jì)是少不了的蜓洪。通信包是以二進(jìn)字流進(jìn)行的。
我們都知道HTTP協(xié)議里面一個(gè)請求就是有一個(gè)對應(yīng)的響應(yīng)回來坯苹。而MQTT也可以這樣子講隆檀,只是這里要換另一種說法——一個(gè)請求就要一個(gè)確定。這一點(diǎn)可以從他相關(guān)的命令就可以看出北滥。如圖下刚操。
我們可以看到連接(CONNECT),有一個(gè)連接確定(CONNACK)再芋。發(fā)布(PUBLISH)菊霜,有一個(gè)發(fā)布確定(PUBACK).只有最后的關(guān)閉(DISCONNECT)沒有對應(yīng)的確定。這個(gè)在協(xié)議里面已經(jīng)說明了济赎。當(dāng)客戶端發(fā)來一個(gè)關(guān)閉的請求的時(shí)候鉴逞,服務(wù)端不必要回應(yīng)一個(gè)確定給客戶端。讀者一定以為PINGGREQ也沒有司训。不要誤會(huì)构捡!PINGRESP事實(shí)上也是一種確定。PINGGREQ用于確定客戶端是不是還連接著壳猜。(注:ACK是Acknowledgement的縮寫)
MQTT從宏觀上來看的話勾徽,可以分為客戶端和服務(wù)器。筆者在學(xué)習(xí)的過程試過幾個(gè)统扳。也試著去查看他的源碼喘帚。只是可惜筆者只是對C#、JAVA比較在行咒钟。其他開發(fā)語言就不行了吹由。所以筆者這里只介紹自己看過并了解過的服務(wù)器。至于客戶端的話朱嘴,你們可以隨便找很多倾鲫。
mosquitto:是用C/C++開發(fā)語言編寫的。據(jù)說是目前最流行的MQTT代理萍嬉。(https://mosquitto.org/)
ActiveMQ:不好意思乌昔。這個(gè)不是專門為MQTT協(xié)議而寫的。是多個(gè)協(xié)議的帚湘。所以筆者不是很喜歡玫荣。同時(shí)有人說他是純JAVA編寫的。不要被騙了里面還是有SCALA語言的大诸。(http://activemq.apache.org/)
Apollo:這是ActiveMQ的子項(xiàng)目捅厂。聽說目前停止維護(hù)。筆者略看了一下代碼资柔。不好意思焙贷。又不是純JAVA大部分是SCALA。(http://activemq.apache.org/apollo/index.html)
HiveMQ:是商業(yè)的MQTT贿堰。為什么筆者要提他呢辙芍?主要他有很多可以參考的意義。(https://www.hivemq.com/mqtt/)
想要了解更多的信息可以去網(wǎng)站(https://github.com/mqtt/mqtt.github.io/wiki/servers)里面相關(guān)MQTT客戶端和服務(wù)端的開源介紹和說明羹与。
學(xué)習(xí)MQTT最好的方式就是代一個(gè)開源的項(xiàng)目故硅。不管是客戶端還是代理端的都要。然后一邊查看源碼一邊查看官方的協(xié)議文檔纵搁。當(dāng)然也有一些工具可以幫你略去寫客戶端的代碼吃衅。如MQTTLens就是筆者常的。他是一個(gè)GOOGLE插件腾誉。