關於MQTT的學習

MQTT發佈/訂閱

發佈/訂閱模式(pub/sub)是傳統客戶端-服務器模型的一個替代模式。在傳統的客戶機-服務器模型中,客戶端直接與端點進行通訊。可是,Pub/Sub模式解耦了發送消息的客戶端(發佈者)與其它接收消息的客戶端(訂閱者)。這意味着發佈者和訂閱者並不知道彼此的存在。有一個發佈者和訂閱者都知道的第三方,稱做代理者,它過濾全部傳入的消息並進行相應的分發。安全

如前所述,發佈/訂閱的重點是發佈者和接收者間的解耦,這能夠在多個緯度上進行區分:服務器

  • 空間解耦:發佈者和訂閱者不須要互相瞭解(例如經過ip地址和端口)網絡

  • 時間解耦:發佈者和訂閱者不須要同時運行。編碼

  • 同步解耦:在發佈或接收過程當中,兩個組件的操做都不會中止。加密

總之,發佈/訂閱解耦了消息的發佈者和接收者,經過消息過濾,可讓客戶端接只收特定的消息。 解耦有三個維度:空間、時間、同步。spa

MQTT協議具備如下幾個特色:

1.發佈和訂閱消息提供一對多的模式,具體就是:發佈能夠是一個終端,能夠又多個終端訂閱。也能夠一個終端訂閱多個發佈終端。能夠達到下降應用程序之間的耦合度。
2.當消息內容又載體時,協議會進行屏蔽。
3.使用TCP/IP提供網絡鏈接。
4.有三種消息發佈質量,分別是:
(1)最多一次發佈,以就是當消息發佈徹底是依賴於底層TCP/IP網絡協議的,由於TCP/IP是可靠性傳輸的,當數據丟失了以後就會重傳,因此這樣的傳輸是可能會發生消息的重複。
(2)最少一次傳輸:這樣的傳輸模式目的是可以確保消息可以到達,因此會出現屢次傳輸,消息會出現重複。
(3)只有一次的發佈:確保消息到達一次,這不能讓消息重複,這種狀況出現再計費系統中,不會出現重複的消息。這種模式不許消息丟失或者重複。
5.小型傳輸,開銷小,可以下降網絡流量。
6還有一特色就是使用Last will和Testament特性通知各客戶端異常中斷的機制。代理

MQTT協議的消息格式

首先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的消息發佈還有更多特性:

主題名稱ip

它是一個簡單的字符串,使用分層結構,而且用左斜槓做爲分隔符。例如:myhome/livingroom/temp字符串

服務質量(QoS)

即消息的服務質量(QoS:Quality of Service Level)。級別(0、1或2)決定了消息到達另外一端(客戶端或代理)時的質量保證。

保持標誌(Retain-Flag)

該標誌肯定代理是否持久保存某個特定主題的消息。訂閱該主題的新客戶端將在訂閱後當即收到該主題的最後保留消息。

有效載荷(Payload)
這是消息的實際內容。MQTT是徹底數據未知的,發送的有多是圖片、任何編碼的文本、加密的數據,但實際上每一個數據都是二進制的形式。

包標識符(Packet Identifier)
包標識符是客戶端和代理之間的惟一標識符,用於標識消息流中的消息。它只與大於零的服務質量有關。設置此MQTT內部標識符是客戶端庫和/或代理的責任。

重複標誌(DUP flag) 該重複標誌表示,此消息是重複的,是由於另外一端沒有識別原始消息而重發的。這只是和大於0時的QoS有關,發送/複製機制的實現細節一般由MQTT客戶端庫或代理處理。

相關文章
相關標籤/搜索