mqtt協議是基於Tcp/ip 的一種通訊協議,是創建在可靠的傳輸協議之上的,比起基於UDP協議就會想到mqtt協議的強大之處了吧。mqtt協議使用很普遍,如:通過對移動端應用的瞭解,像極光推送十有八九都是使用這個協議做爲底層進行封裝的。因此mqtt協議可使用在各聊天中,可是咱們不必去從新造輪子,何況搭建一個推送協議不是一個小工程。mqtt不只僅使用在推送協議中,如今的物聯網這麼發達,好多工程的實現都是使用mqtt協議做爲通訊協議,知道mqtt的強大之處了吧。編程
1.發佈和訂閱消息提供一對多的模式,具體就是:發佈能夠是一個終端,能夠又多個終端訂閱。也能夠一個終端訂閱多個發佈終端。能夠達到下降應用程序之間的耦合度。
2.當消息內容又載體時,協議會進行屏蔽。
3.使用TCP/IP提供網絡鏈接。
4.有三種消息發佈質量,分別是:
(1)最多一次發佈,以就是當消息發佈徹底是依賴於底層TCP/IP網絡協議的,由於TCP/IP是可靠性傳輸的,當數據丟失了以後就會重傳,因此這樣的傳輸是可能會發生消息的重複。
(2)最少一次傳輸:這樣的傳輸模式目的是可以確保消息可以到達,因此會出現屢次傳輸,消息會出現重複。
(3)只有一次的發佈:確保消息到達一次,這不能讓消息重複,這種狀況出現再計費系統中,不會出現重複的消息。這種模式不許消息丟失或者重複。
5.小型傳輸,開銷小,可以下降網絡流量。
6還有一特色就是使用Last will和Testament特性通知各客戶端異常中斷的機制。安全
首先MQTT的消息格式中的頭部佔2個字節,第一個字節中的七、六、五、位是表示消息類型的,故能夠表示16種消息類型,下面是對16種消息類型的解釋;
Reserved 0(轉化成二進制是0000) 表示是保留位
CONNECT 1(轉化成二進制是0001 ) 表示請求鏈接服務器
CONNACK 2 (轉化成二進制是0010 ) 表示鏈接確認
PUBLISH 3 (轉化成二進制是0011 ) 表示發佈消息
PUBACK 4 (轉化成二進制是0100 ) 表示發佈確認
PUBREC 5 (轉化成二進制是0101 ) 表示發佈了(保證交付第1部分)
PUBREL 6(轉化成二進制是0110 )發佈版本(保證交付第2部分)
PUBCOMP 7 (轉化成二進制是0111 )發佈完成(保證交付第3部分)
SUBSCRIBE 8 (轉化成二進制是1000 )客戶端訂閱請求
SUBACK 9 (轉化成二進制是1001) 訂閱確認
UNSUBSCRIBE 10(轉化成二進制是1010)客戶端取消訂閱請求
UNSUBACK 11 (轉化成二進制是1011)取消訂閱確認
PINGREQ 12 (轉化成二進制是1100) ping請求
PINGRESP 13 (轉化成二進制是1101)ping響應
DISCONNECT 14(轉化成二進制是1110)客戶端斷開
Reserved 15 (轉化成二進制是1111)保留位
flag標記位是第3位:第三位用0或者1來表示,1表示收到的消息已收到過,0表示沒有收到過。
QoS level 佔2位,那麼表示四種類型:
0(00)表示最多一次模式
1(01)表示最少一次模式
2(10)表示確保一次模式
3(11)保留,不表明任何意思
最後一位表示保留位
最後一個字節是表示剩餘消息的長度是多少。
且記錄長度不能超過4個字節,那麼可以存儲256MB的長度。
在使用MQTT協議時,最須要考慮的是安全性問題,由於MQTT協議是運行再Tcp上的,那麼可使用TLS來進行加密。服務器
MQTT採用代理的發佈/訂閱模式實現了發佈者和訂閱者的解耦(decouple),所以,在MQTT協議中有三種角色:代理服務器、發佈者客戶端以及訂閱者客戶端,其中發佈者和訂閱者互不干擾,也就是說發佈者和訂閱者互不知道對方的存在,它們只知道代理服務器,代理服務器負責未來自發布者的消息進行存儲處理並將這些消息發送到正確的訂閱者中去。這種解耦體如今如下3個方面上:
·空間解耦:發佈者和訂閱者沒必要知道對方的存在,例如對方的IP地址或者端口;
·時間解耦:發佈者和訂閱者沒必要同時創建鏈接;
·同步解耦:發佈者和訂閱者在發佈消息或接收消息的時候不須要同步。網絡
要想使用mqtt協議進行編程,咱們得使用大公司封裝好的協議進行編碼,還得搭建代理服務器,使其各個客戶端進行鏈接,能達到通訊效果。學習