mqtt協(xié)議學(xué)習(xí)與使用
一.先簡單介紹一下mqtt協(xié)議
mqtt協(xié)議是基于Tcp/ip 的一種通信協(xié)議,是建立在可靠的傳輸協(xié)議之上的,比起基于UDP協(xié)議就會想到mqtt協(xié)議的強(qiáng)大之處了吧。mqtt協(xié)議使用很廣泛,如:經(jīng)過對移動端應(yīng)用的了解,像極光推送十有八九都是使用這個協(xié)議作為底層進(jìn)行封裝的。所以mqtt協(xié)議可以使用在各聊天中,但是我們沒必要去重新造輪子,況且搭建一個推送協(xié)議不是一個小工程。mqtt不僅僅使用在推送協(xié)議中,現(xiàn)在的物聯(lián)網(wǎng)這么發(fā)達(dá),好多工程的實(shí)現(xiàn)都是使用mqtt協(xié)議作為通信協(xié)議,知道m(xù)qtt的強(qiáng)大之處了吧。
二.MQTT協(xié)議具有以下幾個特點(diǎn):
1.發(fā)布和訂閱消息提供一對多的模式,具體就是:發(fā)布可以是一個終端,可以又多個終端訂閱。也可以一個終端訂閱多個發(fā)布終端。可以達(dá)到降低應(yīng)用程序之間的耦合度。
2.當(dāng)消息內(nèi)容又載體時,協(xié)議會進(jìn)行屏蔽。
3.使用TCP/IP提供網(wǎng)絡(luò)連接。
4.有三種消息發(fā)布質(zhì)量,分別是:
(1)最多一次發(fā)布,以就是當(dāng)消息發(fā)布完全是依賴于底層TCP/IP網(wǎng)絡(luò)協(xié)議的,因?yàn)門CP/IP是可靠性傳輸?shù)?,?dāng)數(shù)據(jù)丟失了之后就會重傳,所以這樣的傳輸是可能會發(fā)生消息的重復(fù)。
(2)最少一次傳輸:這樣的傳輸模式目的是能夠確保消息能夠到達(dá),所以會出現(xiàn)多次傳輸,消息會出現(xiàn)重復(fù)。
(3)只有一次的發(fā)布:確保消息到達(dá)一次,這不能讓消息重復(fù),這種情況出現(xiàn)再計費(fèi)系統(tǒng)中,不會出現(xiàn)重復(fù)的消息。這種模式不準(zhǔn)消息丟失或者重復(fù)。
5.小型傳輸,開銷小,能夠降低網(wǎng)絡(luò)流量。
6還有一特點(diǎn)就是使用Last will和Testament特性通知各客戶端異常中斷的機(jī)制。
三、MQTT協(xié)議的消息格式
首先MQTT的消息格式中的頭部占2個字節(jié),第一個字節(jié)中的7、6、5、位是表示消息類型的,故可以表示16種消息類型,下面是對16種消息類型的解釋;
Reserved 0(轉(zhuǎn)化成二進(jìn)制是0000) 表示是保留位
CONNECT 1(轉(zhuǎn)化成二進(jìn)制是0001 ) 表示請求連接服務(wù)器
CONNACK 2 (轉(zhuǎn)化成二進(jìn)制是0010 ) 表示連接確認(rèn)
PUBLISH 3 (轉(zhuǎn)化成二進(jìn)制是0011 ) 表示發(fā)布消息
PUBACK 4 (轉(zhuǎn)化成二進(jìn)制是0100 ) 表示發(fā)布確認(rèn)
PUBREC 5 (轉(zhuǎn)化成二進(jìn)制是0101 ) 表示發(fā)布了(保證交付第1部分)
PUBREL 6(轉(zhuǎn)化成二進(jìn)制是0110 )發(fā)布版本(保證交付第2部分)
PUBCOMP 7 (轉(zhuǎn)化成二進(jìn)制是0111 )發(fā)布完成(保證交付第3部分)
SUBSCRIBE 8 (轉(zhuǎn)化成二進(jìn)制是1000 )客戶端訂閱請求
SUBACK 9 (轉(zhuǎn)化成二進(jìn)制是1001) 訂閱確認(rèn)
UNSUBSCRIBE 10(轉(zhuǎn)化成二進(jìn)制是1010)客戶端取消訂閱請求
UNSUBACK 11 (轉(zhuǎn)化成二進(jìn)制是1011)取消訂閱確認(rèn)
PINGREQ 12 (轉(zhuǎn)化成二進(jìn)制是1100) ping請求
PINGRESP 13 (轉(zhuǎn)化成二進(jìn)制是1101)ping響應(yīng)
DISCONNECT 14(轉(zhuǎn)化成二進(jìn)制是1110)客戶端斷開
Reserved 15 (轉(zhuǎn)化成二進(jìn)制是1111)保留位
flag標(biāo)記位是第3位:第三位用0或者1來表示,1表示收到的消息已收到過,0表示沒有收到過。
QoS level 占2位,那么表示四種類型:
0(00)表示最多一次模式
1(01)表示最少一次模式
2(10)表示確保一次模式
3(11)保留,不代表任何意思
最后一位表示保留位
最后一個字節(jié)是表示剩余消息的長度是多少。
且記錄長度不能超過4個字節(jié),那么能夠存儲256MB的長度。
在使用MQTT協(xié)議時,最需要考慮的是安全性問題,因?yàn)镸QTT協(xié)議是運(yùn)行再Tcp上的,那么可以使用TLS來進(jìn)行加密。
mqtt協(xié)議使用模式
MQTT采用代理的發(fā)布/訂閱模式實(shí)現(xiàn)了發(fā)布者和訂閱者的解耦(decouple),因此,在MQTT協(xié)議中有三種角色:代理服務(wù)器、發(fā)布者客戶端以及訂閱者客戶端,其中發(fā)布者和訂閱者互不干擾,也就是說發(fā)布者和訂閱者互不知道對方的存在,它們只知道代理服務(wù)器,代理服務(wù)器負(fù)責(zé)將來自發(fā)布者的消息進(jìn)行存儲處理并將這些消息發(fā)送到正確的訂閱者中去。這種解耦體現(xiàn)在以下3個方面上:
·空間解耦:發(fā)布者和訂閱者不必知道對方的存在,例如對方的IP地址或者端口;
·時間解耦:發(fā)布者和訂閱者不必同時建立連接;
·同步解耦:發(fā)布者和訂閱者在發(fā)布消息或接收消息的時候不需要同步。
結(jié)語
要想使用mqtt協(xié)議進(jìn)行編程,我們得使用大公司封裝好的協(xié)議進(jìn)行編碼,還得搭建代理服務(wù)器,使其各個客戶端進(jìn)行連接,能達(dá)到通信效果。