MQTT協議(一)

1、MQTT簡介

MQTT協議(Message Queuing Telemetry Transport)(消息隊列遙測傳輸)是一種基於發佈/訂閱模式「輕量級」消息協議,是IBM公司於1999年提出的,由Andy Stanford-ClarkIBM)和Arlen NipperEurotech,現爲Cirrus Link)於1999年開發MQTT是一個基於TCP的發佈訂閱協議,設計的初始目的是爲了適用於極有限的內存設備和低帶寬的不可靠網絡通訊,很是適合物聯網通訊。MQTT 協議目前在 IoTInternet of things,物聯網)、小型設備應用、移動應用等方面有較普遍的應用。服務器

2、協議原理

HTTP及其請求/響應範例相比,MQTT協議使用發佈/訂閱體系結構。發佈/訂閱是事件驅動的,能夠將消息推送到客戶端。中央通訊點是MQTT代理,它負責調度發送者和合法接收者之間的全部消息。向代理髮布消息的每一個客戶端都在消息中包含一個主題。主題是代理的路由信息。每一個想要接收消息的客戶端都訂閱某個主題,而且代理將具備匹配主題的全部消息傳遞給客戶端。網絡

MQTT 協議提供一對多的消息發佈,能夠解除應用程序耦合,信息冗餘小。該協議須要客戶端和服務端,而協議中主要有三種身份:發佈者(Publisher)、代理(Broker,服務器)、訂閱者(Subscriber)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,而消息發佈者也能夠同時是訂閱者,實現了生產者與消費者的解耦。ui

3、協議格式

協議是通訊雙方的一個約定,即約定第1位傳輸什麼、第2位傳輸什麼。在MQTT協議中,一個MQTT數據包由:固定頭(Fixed header)、 可變頭(Variable header)、 消息體(payload)三部分構成。spa

3.1 MQTT 數據包結構

固定頭(Fixed header存在於全部MQTT數據包中,表示數據包類型及數據包的分組類標識設計

可變頭(Variable header存在於部分MQTT數據包中,數據包類型決定了可變頭是否存在及具體內容代理

消息體(Payload,存在於部分MQTT數據包中,表示客戶端收到的具體內容隊列

3.2 MQTT固定頭

固定頭存在於全部MQTT數據包中,其結構以下:事件

Bitip

7內存

6

5

4

3

2

1

0

byte 1

MQTT數據包類型

不一樣類型MQTT數據包的具體標識

byte 2…

剩餘長度

3.2.1 MQTT數據包類型

位置:byte 1, bits 7-4

相於一個4位的無符號值,類型以下:

名稱

流方向

描述

Reserved

0

不可用

保留位

CONNECT

1

客戶端到服務器

客戶端請求鏈接到服務器

CONNACK

2

服務器到客戶端

鏈接確認

PUBLISH

3

雙向

發佈消息

PUBACK

4

雙向

發佈確認

PUBREC

5

雙向

發佈收到(保證第1部分到達)

PUBREL

6

雙賂

發佈釋放(保證第2部分到達)

PUBCOMP

7

雙向

發佈完成(保證第3部分到達)

SUBSCRIBE

8

客戶端到服務器

客戶端請求訂閱

SUBACK

9

服務器到客戶端

訂閱確認

UNSUBSCRIBE

10

客戶端到服務器

請求取消訂閱

UNSUBACK

11

服務器到客戶端

取消訂閱確認

PINGREQ

12

客戶端到服務器

PING請求

PINGRESP

13

服務器到客戶端

PING應答

DISCONNECT

14

客戶端到服務器

中斷鏈接

Reserved

15

不可用

保留位

 

3.2.2 標識位

位置:byte 1, bits 3-0

在不使用標識位的消息類型中,標識位被作爲保留位。若是收到無效的標誌時,接收端必須關閉網絡鏈接:

數據包

標識位

Bit 3

Bit 2

Bit 1

Bit 0

CONNECT

保留位

0

0

0

0

CONNACK

保留位

0

0

0

0

PUBLISH

MQTT 3.1.1使用

DUP1

QoS2

QoS2

RETAIN3

PUBACK

保留位

0

0

0

0

PUBREC

保留位

0

0

0

0

PUBREL

保留位

0

0

0

0

PUBCOMP

保留位

0

0

0

0

SUBSCRIBE

保留位

0

0

0

0

SUBACK

保留位

0

0

0

0

UNSUBSCRIBE

保留位

0

0

0

0

UNSUBACK

保留位

0

0

0

0

PINGREQ

保留位

0

0

0

0

PINGRESP

保留位

0

0

0

0

DISCONNECT

保留位

0

0

0

0

DUP:發佈消息的副本。用來在保證消息的可靠傳輸,若是設置爲 1,則在下面的變長中增長MessageId,而且須要回覆確認,以保證消息傳輸完成,但不能用於檢測消息重複發送。

QoS:發佈消息的服務質量,即:保證消息傳遞的次數

00:最多一次,即:<=1

01:至少一次,即:>=1

10:一次,即:=1

11:預留

RETAIN 發佈保留標識,表示服務器要保留此次推送的信息,若是有新的訂閱者出現,就把這消息推送給它,若是設有那麼推送至當前訂閱者後釋放。

3.2.3 剩餘長度(Remaining Length

位置:byte 1

固定頭的第二字節用來保存變長頭部和消息體的總大小的,但不是直接保存的。這一字節是能夠擴展,其保存機制,前7位用於保存長度,後一部用作標識。當最後一位爲 1時,表示長度不足,須要使用二個字節繼續保存。 例如:計算出後面的大小爲0

3.3 MQTT可變頭

MQTT數據包中包含一個可變頭,它駐位於固定的頭和負載之間。可變頭的內容因數據包類型而不一樣,較常的應用是作爲包的標識:

Bit

7

6

5

4

3

2

1

0

byte 1

包標籤符(MSB

byte 2…

包標籤符(LSB

不少類型數據包中都包括一個2字節的數據包標識字段,這些類型的包有:PUBLISH (QoS > 0)PUBACKPUBRECPUBRELPUBCOMPSUBSCRIBESUBACKUNSUBSCRIBEUNSUBACK

3.4 Payload消息體

Payload消息體位MQTT數據包的第三部分,CONNECTSUBSCRIBESUBACKUNSUBSCRIBE四種類型的消息 有消息體:

CONNECT,消息體內容主要是:客戶端的ClientID、訂閱的TopicMessage以及用戶名和密碼。

SUBSCRIBE,消息體內容是一系列的要訂閱的主題以及QoS

SUBACK,消息體內容是服務器對於SUBSCRIBE所申請的主題及QoS進行確認和回覆。

UNSUBSCRIBE,消息體內容是要訂閱的主題。

相關文章
相關標籤/搜索