//Logo Image
「世大智科/天才家居」-我們創業囉
PDF Version

第三章 MQTT通訊協議

3.1    MQTT通訊協議簡介

MQTT的全名為 Message Queuing Telemetry Transport,為IBMEurotech共同製定的通訊協議。如圖3-1MQTT官方網站對MQTT的描述,MQTT是為物聯網所設計的M2M通訊協定,網路頻寬與硬體需求非常少,是極為輕便的通訊協議。MQTT通訊協議已經在2014年經過制定電子商業標準協會(OASIS)程序,成為推薦的物聯網傳輸協議標準。MQTT通訊協議是基於TCP/IP連線,提供不同QoS(Quality of Service)層級的訊息傳遞,適用於網路連線不佳的環境、CPU較弱的嵌入式裝置,並且MQTT有極大的潛力成為標準的物聯網通訊協議。

3-1. MQTT官方網站對MQTT通訊協議的介紹

3.2    MQTT訊息傳遞原理

MQTT通訊為一對多的M2M傳輸,使用發佈(Publish)/訂閱(Subscribe)的訊息傳送機制,此機制中包含4個主要的元素,發佈者(Publisher)、訂閱者(Subscriber)、主題(Topic)、訊息中轉站(Broker)Publisher為訊息的來源,傳送夾帶有Topic資訊的訊息至Broker,訂閱者向Broker註冊想要接受到之訊息的Topic,例如有一Publisher發佈一則Topic”Test”的訊息,只要是有對Broker註冊Topic”Test”Subscriber都能接收到此訊息。

3-2. MQTT發佈(Publish)/訂閱(Subscribe)訊息傳送機制

除了發佈/訂閱的機制外,MQTT通訊協議有幾項特點:

(1)       使用TCP/IP作為基本的網路連線

(2)       提供三種訊息傳送服務的QoS

·             QoS0” At most once(最多一次),訊息可能被重複發送或遺失,適合使用於感測器的原始資料傳送,因為下一則訊息將馬上被送出。

·             QoS1” At least once(至少一次),保證訊息會被送達,但可能會發生重複發送的情形。

·             QoS2” Exactly once(確保一次),保證訊息只會被送達一次,適用於對高度謹慎之系統,如金流、計費系統。

(3)       訊息Header固定為2 Byte

減少封包傳送時的負擔,同時減少網路所需之頻寬

(4)       “Last Will and Testament(最後遺囑)機制

當異常斷線發生後,通知有訂閱此Will TopicSubscriber

(5)       主題萬用字元(Topic Wildcard Characters)

在訂閱主題時可以使用特殊字元一次訂閱多個主題,這些字元稱為萬用字元,此功能類似REST(Representational State Transfer),共分為主題層級分隔符號(Topic Level Separator)、多層級萬用字元(Multi-level Wildcard)、單一層級萬用字元(Single-level Wildcard)

主題層級分隔符號使用斜線符號”/”切割Topic的每個層級,如”/GRC/WhizMAT/M00001/Notify”,此Topic表示GRC老人福祉科技研究中心底下的產品WhizMAT,產品編號為M00001發出NotifyTopic。多層級萬用字元使用井字號”#”匹配任何層級的主題,例如使用多層級萬用字元訂閱”/GRC/WhizMAT/#”,此訂閱方式將會接收到所有WhizMAT裝置的訊息。單一層級萬用字元使用加號”+”匹配單一層級的主題,例如使用單一層級萬用字元訂閱”/GRC/WhizMAT/+”只能收到”/GRC/WhizMAT/M00001”的訊息,並不能接收”/GRC/WhizMAT/M00001/Notify”的訊息。

3.3    MQTT Message Type

MQTT通訊協議會依照Message Type完成相對應的工作,Message Type4 bit數字,意即0~1516位數,個數字代表之功能如表3-1

名稱

代表值

說明

Reserved

0

保留之後使用

CONNECT

1

發出連線請求

CONNACK

2

連線請求的ACK(確認符)

PUBLISH

3

發佈訊息

PUBACK

4

發佈訊息ACK(QoS 1)

PUBREC

5

已收到發佈訊息(QoS 2)

PUBREL

6

釋放發布訊息(QoS 2)

PUBCOMP

7

訊息發佈完成(QoS 2)

SUBSCRIBE

8

發出訂閱請求

SUBACK

9

請求訂閱的ACK

UNSUBSCRIBE

10

發出取消訂閱請求

UNSUBACK

11

請求取消訂閱的ACK

PINGREQ

12

Ping請求

PINGRESP

13

Ping回應

DISCONNECT

14

請求斷線

Reserved

15

保留之後使用

3-1. MQTT Message Type功能對照表

3.4    Message Format

如圖3-3MQTT的訊息格式包括Fix Header, Variable Header, Payload。每個類型的訊息都會有的資訊,至少為2 byteVariable Header為參數設置的部分,會根據不同類型的訊息有所不同,甚至有些訊息並沒有Variable HeaderPayload為訊息主要的內容,可以帶入字串訊息、圖片、影片等類型檔案。

3-3. MQTT Message Format

其中Fix Header的格式為固定的2 byte,如表3-2,第1byte內的第0bitRetainflag,此參數只在PUBLISH的訊息類別中使用;第12bitQoS層級,因為有三種QoS故需要2 bit儲存,只有在PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE用到;第3bitDUP Flag,此參數用以標記此訊息是否為重複訊息,只在PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE用到;第47bitMessage Type,因為Message Type16種,故須使用4bit儲存。第2byteRemaining Length,用以記錄當前訊息的總長度,此欄位是可變的最多可達4byte,且用特殊編碼存放此長度數值,最多可達256 MB

bit

7

6

5

4

3

2

1

0

byte 1

Message Type

DUP

QoS

Retain

byte 2

Remaining Length

3-2. Fix Header內容

3.5    各類型訊息傳遞流程

MQTT通訊協議針對不同類型訊息,有不同的工作流程,本節將介紹各類型訊息之工作流程。

(1)       CONNECT

Client(客戶端)Broker建立起TCP/IP socket連線時,需傳送Message TypeCONNECT的訊息,Broker端會回傳Message TypeCONNACK的確認訊息,其工作流程如表3-3

Client工作

Message Type

Broker工作

CONNECT à

·             根據Variable Header各項參數創建連線

ß CONNACK

 

3-3. CONNECT 工作流程

(2)       DISCONNECT

DISCONNECT訊息被傳送至Broker,表示需要關閉TCP/IP連線,若在連線時設置Clean SessionBroker清除此Client連線時所有的設定,包括訂閱的主題,其工作流程如表3-4

Client工作

Message Type

Broker工作

DISCONNECT à

·             若設置Clean Session,清除Client所有設定

3-4. DISCONNECT 工作流程

(3)       PUBLISH

Publish訊息會因為所使用的QoS有不同的工作流程。若QoS設置為0,訊息會透過底層的TCP/IP連線傳輸訊息,並不預期有任何的回應,也不會重新傳送,故訊息可能傳送至Broker 一次,或是沒有傳送成功,其工作流程如表3-5

Client工作

Message Type

Broker工作

·             QoS = 0

PUBLISH à

·             Publish訊息至Subscriber

3-5. PUBLISH(QoS 0) 工作流程

QoS設置為1,當PUBLISH資訊傳送至BrokerBroker回覆PUBACK訊息,如果連線中斷、裝置出現錯誤或在一特定時間內沒有收到PUBACK訊息,則重新發送訊息並設置DUP=1,保證訊息至少會傳送至Broker一次,其工作流程如表3-6

Client工作

Message Type

Broker工作

·             QoS = 1

·             Message ID = x

·             DUP = 0

·             儲存訊息

PUBLISH à

·             儲存訊息

·             Publish訊息至Subscriber

·             刪除訊息

·             取消儲存的訊息

ßPUBACK

3-6. PUBLISH(QoS 1) 工作流程

QoS設置為2,工作流程如表3-7,基於QoS 1將儲存訊息跟發送訊息分開為兩個指令,其中若連線發生錯誤或訊息傳遞逾時,則會重最後沒有回應的訊息嘗試重新傳送,透過此方法確保訊息只會被傳送至Subscriber一次。

Client工作

Message Type

Broker工作

·             QoS = 2

·             DUP = 0

·             Message ID = x

·             儲存訊息

PUBLISH à

·             儲存訊息

ß PUBREC

·             回傳Message ID = x

·             Message = x

PUBREL à

·             Publish訊息至Subscriber

·             刪除訊息

·             取消儲存的訊息

ß PUBCOMP

·             回傳Message ID = x

3-7. PUBLISH(QoS 2) 工作流程

(4)       SUBSCRIBE

SUBSCRIBE訊息提功ClientBroker上的一個或多個Topic進行註冊,並可設置接收訊息的QoS,但此QoS會以PublishQoS層級為主,如PublishQoS層級高過Subscribe會將QoS降級至SubscribeQoS傳送,若PublishQoS層級較Subscribe高,則會以PublishQoS傳送至,意即Publisher有決定此則訊息最大的QoS層級,其工作流程如表3-8

Client工作

Message Type

Broker工作

·             QoS = x

SUBSCRIBE à

·             QoS = x註冊Topic

ß SUBACK

3-8. SUBSCRIBE工作流程

(5)       PING

TCP/IP的連線中會在一固定時間傳送一心跳值確保其連線的暢通,MQTT通訊協議中以PINGREQ訊息傳送至Broker確保連線狀態,Broker回傳PINGRESP訊息回覆Client此連線是否正常,其工作流程如表3-9

Client工作

Message Type

Broker工作

PINGREQ à

ß PINGRESP

3-9. PING工作流程

3.6    各類型訊息封包內容

此節將詳述CONNECT, PUBLISH, SUBSCRIBE, PINGREQ各訊息中所含有的內容,包括Fix Header, Variable Header, Payload

(1)          CONNECT

如表3-10CONNCECT訊息的Fix Header僅使用Message TypeRemaining Length兩個資訊。

bit

7

6

5

4

3

2

1

0

byte 1

Message Type

DUP

QoS

Retain

0

0

0

1

X

X

X

X

byte 2

Remaining Length

3-10. CONNECT訊息的Fix Header

如表3-11CONNECT訊息的Variable Header分為三個部分,前9byte用來描述通訊協議的資訊,第10byte為此次連線的特性設定,第1112為連線逾時的時間設定。

通訊協議資訊包括協議的名稱與版本號碼,在此舉例名稱為MQlsdp,版本號碼為3(0x03)

連線特性設定包括Clean Session, Will Flag, Will Topic, Will QoS, Will Retain, User Name Flag, Password FlagClean Session若為0,當Client斷線時,Broker必須將此Client訂閱的主題紀錄,並在Client斷線期間若有QoS 1    QoS 2的訊息被發佈,Broker必須將訊息儲存下來,等待Client恢復連線後再一一傳送;若Clean Session1,當Client斷線後,Broker將會把此Client的所有設定清除。

Will Flag, Will QoS, Will Retain Flag為最後遺囑機制所使用,當Client建立連線時,會將遺囑的Topic, QoS設置,當Client在不正常的情形下斷線,Broker將會針對此主題發送一訊息,啟動此機制的方法為將Will Flag設置為1,最後可以透過Will Retain Flag設定此則遺囑是否要保留在Broker上。

User Name FlagPassword Flag說明此連線是否包含帳號與密碼,若此設定被打開,需要在Payload裡傳遞帳號與密碼。

連線逾時設定指的是當Broker多久沒有收到Client發送的訊息下要判斷此連線已經斷線,透過此設定可以讓Broker不需等待時間較長的TCP/IP逾時來得知此連線狀態。

 

Description

7

6

5

4

3

2

1

0

通訊協議資訊

byte 1~8

Protocol Name (MQlsdp)

byte 9

Version (3)

連線特性設定

byte 10

·             User Name Flag (1)

·             Password Flag (1)

·             Will Retain (0)

·             Will QoS (01)

·             Will Flag (1)

·             Clean Session (1)

1

1

0

0

1

1

1

X

連線逾時設定

byte 11

Keep Alive MSB (0)

0

0

0

0

0

0

0

0

byte 12

Keep Alive LSB (10)

0

0

0

0

1

0

1

0

3-11. CONNECT訊息的Variable Header

CONNECT訊息的Payload裡帶有三項資訊,包括Client Identifier, Will Topic and Will Message, User Name and PasswordClient IdentifierClient的唯一識別碼,此識別會在QoS 12時被用到,是別碼長度限制為23byteWill Topic and Will Message是當Variable HeaderWill Flag設置為1時,需帶入此最後遺囑的TopicMessageUser Name and Password是當Variable HeaderUser Name FlagPassword Flag被設置為1時,需帶入的帳號與密碼。

(2)          PUBLISH

PUBLISH是發佈訊息時會被使用的訊息類型,會被使用於Publisher發佈一訊息至BrokerBroker發佈訊息至Subscriber。如表3-12PUBLISHFix Header會使用到Message Type, DUP, QoS, Retain四個參數,DUP參數預設為0,但在QoS 12時,若需重新傳送訊息需將此參數設置為1Retain參數可以決定此訊息是否保留在Broker上,若設置為1Broker必須將此訊息發佈後並儲存。

bit

7

6

5

4

3

2

1

0

byte 1

Message Type

DUP

QoS

Retain

0

0

1

1

0

0

1

0

byte 2

Remaining Length

3-12. PUBLISH訊息的Fix Header

PUBLISH訊息的Variable Header帶有兩樣資訊,分別為Topic NameMessage IDTopic Name為一UTF編碼的字串,必須是一個明確的主題定義,不能為單一萬用字元;Message ID16 bit無符號的整數,使用在QoS 12的訊息上,代表訊息的唯一值,每個Client都必須維護自己的Client ID列表,Client ID列表不能為0,否則會被視為無效的Message ID

PUBLISH訊息的Payload會包含要發佈訊息的主要內容,此內容可以為字串、照片、影片等檔案,Payload訊息的長度可為0

(3)          SUBSCRIBE

如表3-13SUBSCRIBE訊息的Fix Header包括Message Type, DUP, QoS,此處的QoS是用來定義SUBSCRIBE訊息的回應訊息以哪個QoS的層級回覆,建議使用QoS 1

bit

7

6

5

4

3

2

1

0

byte 1

Message Type

DUP

QoS

Retain

1

0

0

0

0

0

1

X

byte 2

Remaining Length

3-13. SUBSCRIBE訊息的Fix Header

由於SUBSCRIBE訊息的QoS1,故其Variable Header包含Message ID,用來確保訊息能夠正確的被傳送至BrokerSUBSCRIBE訊息的Payload會因為註冊的Topic數量而有不同,SUBSCRIBE訊息允許同時夾帶多筆TopicQoSBroker進行註冊,此處的Topic可以使用萬用字符。

(4)          PINGREQ

PINGREQ訊息是用來向Broker發送TCP/IP連線的心跳值,如表3-14Fix Header僅有Message Type資訊,且不需要Variable HeaderPayload

bit

7

6

5

4

3

2

1

0

byte 1

Message Type

DUP

QoS

Retain

1

1

0

0

X

X

X

X

byte 2

Remaining Length

3-14. PINGREQ訊息的Fix Header