對于MQTT的一張基本理解圖:

基本流程圖:

MQTT是一種鏈接協(xié)議,它指定了如何組織數(shù)據(jù)字節(jié)并通過TCP/IP網(wǎng)絡傳輸它們。但實際上,開發(fā)人員并不需要鏈接這個鏈接協(xié)議的具體細節(jié)。我們只需要知道,每條消息都有一個命令和數(shù)據(jù)有效負載。該命令定義消息類型(比如CONNECT消息或者SUB SCRIBE消息)。所有的MQTT庫和工具都提供了直接處理這些消息的基本方法,并且能自動填充一些必要的字段(在數(shù)據(jù)包的對應字節(jié)填充),比如消息和客戶端ID。
首先客戶端發(fā)送一條CONNECT消息來鏈接代理。CONNECT消息要求建立從客戶端到代理服務器的鏈接。
CONNECT命令的基本參數(shù)
- cleanSession:此標志指定是否是持久鏈接。持久會話會將所有的訂閱和可能丟失的消息(具體取決于QoS)都存儲在代理(服務器)中。
- username:鏈接代理服務器的用戶名。(對,代理服務器不是誰想連,想連就能連)
- password:鏈接代理服務器的密碼。(對,代理服務器不是誰想連,想連就能連)
- lasWillTopic:鏈接意外中斷,代理服務器會像某個主題發(fā)送一條last will消息。
- lastWillQos:last will消息的QoS。
- lastWillMessage:last will消息本身。
- KeepAlive:這是客戶端通過ping服務器來保持鏈接有效所需的時間間隔。
當客戶端向代理服務器發(fā)送一條CONNECT命令之后,服務器會調(diào)用CONNACK命令,告知服務鏈接的狀態(tài)。
CONNACK命令的基本參數(shù)
- sessionPresent:此參數(shù)表明鏈接是否已有一個持久會話。也就是說,連接了訂閱的主題,而且會接受丟失的消息。
- returnCode:0表示成功。otherwise失敗。
當客戶端和服務器建立連接之后,客戶端就可以向服務器訂閱某些主題的。(發(fā)送一條或多條SUBSCRIBE消息)。
表明當服務器接受到其他終端推送的此主題數(shù)據(jù)時,服務器會默認發(fā)送給它。
SUBSCRIBE參數(shù)列表
- QoS:服務質(zhì)量(quality of services)。一般有3個枚舉值。
- 0:表示不可靠服務,消息僅推送一次,如果當前客戶端在線,或者因為網(wǎng)絡原因,沒有收到就沒有收到。
- 1:消息至少傳遞1次。一次不成功,傳遞第二次,第N次??赡軙霈F(xiàn)重復數(shù)據(jù)的情況。
- 2:消息恰好傳遞1次。雙方通過4次握手,保證消息能準確的從服務器傳遞給客戶端,而且只傳一次。
QoS參數(shù)雖然在客戶端指定,但規(guī)定的是服務器傳遞數(shù)據(jù)的模式。所以,QOS是用來約束服務器,而不是客戶端本身。
一個主題可以有多個級別,級別之間用斜杠字符分隔。例如,”dw/demo”和”/ibm/bluemix/qmqt”都是有效主題。
當客戶端成功的向服務器訂閱某個主題之后,服務器會返回一條SUBACK的消息,其中包含一個或者多個returnCode參數(shù)。
SUBACK消息參數(shù)
- returnCode:值0-2,表示成功訂閱,并返回這個訂閱消息的QOS。值128:訂閱失敗。
既然客戶端可以向服務器訂閱某個主題,當然也可以取消訂閱。
與SUBSCRIBE訂閱命令相反的命令是UNSUBSCRIBE取消訂閱命令。
此命令非常簡單。只有一個topic(主題)參數(shù)。
- topic:此參數(shù)就是客戶端取消訂閱的主題。
上面講的是訂閱,訂閱是需要有消息從服務器發(fā)送過來的。但是服務器本身基本不產(chǎn)生數(shù)據(jù),那數(shù)據(jù)從何而來呢?
通過另外一個客戶端執(zhí)行PUBLISH命令,往代理服務器發(fā)送數(shù)據(jù)。并最終通過代理服務器將數(shù)據(jù)傳遞給訂閱了此服務的客戶端。
PUBLISH消息參數(shù)
- topicName:發(fā)布消息的相關主題。
- qos:消息傳遞的質(zhì)量水平。(約束服務器)
- retainFlag:此標志表明服務器是否保留該消息作為針對此主題的最后一條已知消息。
- payload:消息中的實際數(shù)據(jù)。它可以是文本字符串或者二進制大對象數(shù)據(jù)(圖片)
總結
- MQTT是一個輕量級,用于計算能力弱,網(wǎng)絡環(huán)境差的終端設備之間的數(shù)據(jù)傳輸。
- MQQ是基于一個發(fā)布/訂閱的基本模式。
- 每個終端都可以從服務器訂閱某些主題,也可以往代理服務器發(fā)布某些主題。
- 當服務器接受到了某些終端發(fā)送過來的數(shù)據(jù)之后,會向訂閱了這個服務的終端推送這些數(shù)據(jù)。