原理簡介_消息通信的利器MQTT協議簡介及協議原理

4302c5c8eda9db6a1bd6b51a63523db1.png

- 沒用過但是必須得知道系列 -

前言:

相比于 XMPP, MQTT 的簡單輕量受到了不少工程師的喜愛,從物聯網到傳統的消息服務,簡單可依賴的 MQTT 到底為何讓人如此著迷呢?

MQTT 協議-MQTT 協議簡介及協議原理

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基于發布/訂閱( publish/subscribe )模式的“輕量級”通訊協議,該協議構建于TCP/IP協議上,由IBM在1999年發布。MQTT最大優點在于,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。

1. MQTT協議特點

MQTT是一個基于客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。

MQTT協議當前版本為,2014年發布的MQTT v3.1.1。除標準版外,還有一個簡化版MQTT-SN,該協議主要針對嵌入式設備,這些設備一般工作于TCP/IP網絡,如:ZigBee。

MQTT協議運行在TCP/IP或其他網絡協議,提供有序、無損、雙向連接。其特點包括:

  1. 使用的發布/訂閱消息模式,它提供了一對多消息分發,以實現與應用程序的解耦。

  2. 對負載內容屏蔽的消息傳輸機制。

  3. 對傳輸消息有三種服務質量(QoS):

  • 最多一次,這一級別會發生消息丟失或重復,消息發布依賴于底層TCP/IP網絡。即:<=1

  • 至多一次,這一級別會確保消息到達,但消息可能會重復。即:>=1

  • 只有一次,確保消息只有一次到達。即:=1。在一些要求比較嚴格的計費系統中,可以使用此級別

  1. 數據傳輸和協議交換的最小化(協議頭部只有2字節),以減少網絡流量

  2. 通知機制,異常中斷時通知傳輸雙方

2. MQTT協議原理

2.1 MQTT協議實現方式

887273a9bb0984d9a8a47403a174b6b6.png

  • 實現MQTT協議需要:客戶端和服務器端

  • MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。

  • MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分

    • Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload)

    • payload,可以理解為消息的內容,是指訂閱者具體要使用的內容

2.2 網絡傳輸與應用消息

MQTT會構建底層網絡傳輸:它將建立客戶端到服務器的連接,提供兩者之間的一個有序的、無損的、基于字節流的雙向傳輸。

當應用數據通過MQTT網絡發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關聯。

2.3 MQTT客戶端

一個使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以:

  • 發布其他客戶端可能會訂閱的信息

  • 訂閱其它客戶端發布的消息

  • 退訂或刪除應用程序的消息

  • 斷開與服務器連接

2.4 MQTT服務器

MQTT服務器稱為“消息代理”(Broker),可以是一個應用程序或一臺設備。它是位于消息發布者和訂閱者之間,它可以:

  • 接受來自客戶的網絡連接

  • 接受客戶發布的應用信息

  • 處理來自客戶端的訂閱和退訂請求

  • 向訂閱的客戶轉發應用程序消息

2.5 MQTT協議中的訂閱、主題、會話

訂閱(Subscription)

訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。

會話(Session)

每個客戶端與服務器建立連接后就是一個會話,客戶端和服務器之間有狀態交互。會話存在于一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡連接。

主題名(Topic Name)

連接到一個應用程序消息的標簽,該標簽與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標簽的每個客戶端。

主題篩選器(Topic Filter)

一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。

負載(Payload)

消息訂閱者所具體接收的內容

2.6 MQTT協議中的方法

MQTT協議中定義了一些方法(也被稱為動作), 來表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態生成數據,這取決于服務器的實現。通常來說,資源指服務器上的文件或輸出。

Connect,等待與服務器建立連接

Disconnect,等待MQTT客戶端完成所做的工作,并與服務器斷開TCP/IP會話

Subscribe,等待完成訂閱

UnSubscribe,等待服務器取消客戶端的一個或多個topics訂閱

PublishMQTT客戶端發送消息請求,發送完成后返回應用程序線程

3.?MQTT數據結構

MQTT 數據包結構

  • 固定頭(Fixed header),存在于所有MQTT數據包中,表示數據包類型及數據包的分組類標識

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

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

3.1 MQTT固定頭

固定頭存在于所有MQTT數據包中,其結構如下:

Bit76543210
byte 1MQTT數據包類型不同類型MQTT數據包的具體標識
byte 2…剩余長度

3.1.1?MQTT數據包類型

位置:byte 1, bits 7-4。

相于一個4位的無符號值,類型如下:

名稱流方向描述
Reserved0不可用保留位
CONNECT1客戶端到服務器客戶端請求連接到服務器
CONNACK2服務器到客戶端連接確認
PUBLISH3雙向發布消息
PUBACK4雙向發布確認
PUBREC5雙向發布收到(保證第1部分到達)
PUBREL6雙向發布釋放(保證第2部分到達)
PUBCOMP7雙向發布完成(保證第3部分到達)
SUBSCRIBE8客戶端到服務器客戶端請求訂閱
SUBACK9服務器到客戶端訂閱確認
UNSUBSCRIBE10客戶端到服務器請求取消訂閱
UNSUBACK11服務器到客戶端取消訂閱確認
PINGREQ12客戶端到服務器PING請求
PINGRESP13服務器到客戶端PING應答
DISCONNECT14客戶端到服務器中斷連接
Reserved15不可用保留位

3.1.2?標識位

位置:byte 1, bits 3-0。

在不使用標識位的消息類型中,標識位被作為保留位。如果收到無效的標志時,接收端必須關閉網絡連接:

數據包標識位Bit 3Bit 2Bit 1Bit 0
CONNECT保留位0000
CONNACK保留位0000
PUBLISHMQTT 3.1.1使用DUP1QoS2QoS2RETAIN3
PUBACK保留位0000
PUBREC保留位0000
PUBREL保留位0000
PUBCOMP保留位0000
SUBSCRIBE保留位0000
SUBACK保留位0000
UNSUBSCRIBE保留位0000
UNSUBACK保留位0000
PINGREQ保留位0000
PINGRESP保留位0000
DISCONNECT保留位0000
  • DUP:發布消息的副本。用來在保證消息的可靠傳輸,如果設置為 1,則在下面的變長中增加MessageId,并且需要回復確認,以保證消息傳輸完成,但不能用于檢測消息重復發送。

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

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

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

    • 10:一次,即:=1

    • 11:預留

  • RETAIN:發布保留標識,表示服務器要保留這次推送的信息,如果有新的訂閱者出現,就把這消息推送給它,如果設有那么推送至當前訂閱者后釋放。

3.1.3?剩余長度(Remaining Length)

位置:byte 1。

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

3. 2 MQTT可變頭

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

Bit76543210
byte 1包標簽符(MSB)
byte 2…包標簽符(LSB)

很多類型數據包中都包括一個2字節的數據包標識字段,這些類型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

3. 3 Payload 消息體

Payload 消息體位于 MQTT 數據包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體:

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

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

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

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


更多請查看

MQTT 3.1.1 規范?http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.htmlMQTT 3.1.1 規范中文版?https://mcxiaoke.gitbooks.io/mqtt-cn/content/

223f5d3c17e00f49ec0186bec392cfb7.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378973.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stl vector 函數_vector :: pop_back()函數以及C ++ STL中的示例

stl vector 函數C vector :: pop_back()函數 (C vector::pop_back() function) vector::pop_back() is a library function of "vector" header, it is used to deletes an element from the end of the vector, it deletes the element from the back and returns …

rtmp協議分析(Message 消息,Chunk分塊)

RTMP詳細分析&#xff08;三次握手&#xff09; librtmp分析&#xff08;發送數據包處理&#xff09; librtmp分析&#xff08;接收數據包處理&#xff09; 目錄1、Message(消息)2、Chunking(Message 分塊)2.1、 Basic Header(基本的頭信息)2.1.1、Basic Header為1個字節時2.1.…

【文摘】 雪念——作者:藍色妖姬

引用原文地址&#xff1a;點我 我本是惆悵之人&#xff0c;擁有不了所謂的快樂&#xff0c;筆尖譜寫不出唯美的風花雪月&#xff0c;只是流露這淡淡的疼痛&#xff0c;淡淡的哀傷。——藍色妖姬。 喜歡雪&#xff0c;喜歡佇立在雪地里&#xff0c;凝視著片片雪花從眼前飄落。 心…

將Sharepoint Server 2010部署到WINDOWS 7

首先祝CNBLOGS上的筒子們新年快樂。Sharepoint 2010 BETA版發布已經有段時間了&#xff0c;總是感覺MS的步伐要比我們這些追逐他的人快很多&#xff0c;不過確實他的每一次革新總給我們帶來了驚喜。 前幾天報名參加了SHAREPOINT 2010 DAY 活動(詳情)&#xff0c;等待著1月16日體…

嵌入式實訓-day1

完全復制一個文件的內容到另外一個文件 思路解析&#xff1a; 首先我這里使用了三個.c文件&#xff0c;分別是&#xff1a;yanyu.c、yanyu_old.c、yanyu_now.c 其中yanyu.c負責將yanyu_old.c中的內容讀入到buff緩沖區中&#xff0c;然后再從buff緩沖區中將數據寫入到yanyu_no…

stl中copy()函數_std :: rotate_copy()函數以及C ++ STL中的示例

stl中copy()函數C STL std :: rotate_copy()函數 (C STL std::rotate_copy() function) rotate_copy() function is a library function of algorithm header, it is used to rotate left the elements of a sequence within a given range and copy the rotating elements to…

計量經濟學建模_淺談統計學模型(兼計量經濟學模型)

計量經濟學模型是從統計學模型中衍生出來的&#xff0c;故將它們一并放在此處進行說明。實際上&#xff0c;很多人在很久之前就督促我寫一篇統計學和計量經濟學模型的文章&#xff0c;但我太懶惰&#xff0c;一直拖到現在&#xff0c;也是十分汗顏。先講一些統計學上的基礎故事…

linux文件存儲、inode、硬鏈接、軟鏈接

目錄介紹inode的內容inode的大小inode號碼目錄文件硬鏈接軟鏈接介紹 文件儲存在硬盤上&#xff0c;硬盤的最小存儲單位叫做"扇區"&#xff08;Sector&#xff09;。每個扇區儲存512字節&#xff08;相當于0.5KB&#xff09;。操作系統讀取硬盤的時候&#xff0c;不會…

OSPF路由器建立全毗鄰關系的狀態轉換過程

1&#xff09;Down狀態&#xff1a;路由器不與其他任何路由器交換任何OSPF消息&#xff1b;2&#xff09;Init狀態&#xff1a;接收方路由器已經接收到對端路由器的hello包&#xff0c;但是沒有從對端路由器的hello包中發現自己的router-id.。此時通信是單向的&#xff1b;3&am…

JavaScript打包與解包工具

JavaScript Packer&#xff1a; http://packer.skiyo.cn/ JavaScript UnPacker&#xff1a; http://packer.skiyo.cn/unpacker.html 轉載于:https://www.cnblogs.com/springmvc-hibernate/archive/2010/09/17/2484233.html

工具欄的打印圖標不見了_顯示屏下方的工具欄里的小圖標不見了怎么弄回來

優質回答 回答者&#xff1a;昂天大笑出門去一般右下角那些小圖標都是與系統同步啟動的一些功能&#xff0c;有的是沒必要讓它們同步啟動的&#xff0c;啟動的東西越多&#xff0c;系統反應就越慢。你說的工具欄里的小圖標沒了&#xff0c;可能是那些工具不能和系統同步啟動了&…

使用sshfs掛載linux遠程服務器目錄到windows

目錄下載winfsp 和 sshfs-win使用方式1、添加連接2、連接3、其他操作修改&#xff1a;刪除&#xff1a;下載winfsp 和 sshfs-win 前往 github 對應項目的 release 中下載最新版本&#xff1a; sshfs-win&#xff1a;https://github.com/billziss-gh/sshfs-win/releases winfs…

法學學士學位的完整形式是什么?

LL.B&#xff1a;拉丁文的Legum Baccalaureus(俗稱法學學士) (LL.B: Legum Baccalaureus in Latin (commonly known as Bachelor of Laws)) LL.B is an abbreviation of Legum Baccalaureus in Latin which is generally known as Bachelor of Laws. It is a bachelors degree …

Qt創建工程及導入資源圖片

一、打開軟件 二、 三、 四、 五、 六、 七、 導入其他文件資源&#xff0c;比如圖片資源&#xff1a; 一、 二、 三、 四、 五、 六、導入圖片 七、 八、 該圖片導入項目里面了

linux date命令設置時間

linux date命令設置時間其實很簡單 # date -s 20060925 # date -s 21:19:50 第一行設置日期&#xff0c;第二行設置時間。 轉載于:https://www.cnblogs.com/takeaction/archive/2013/01/21/2869107.html

protect 繼承_(轉)public、protect、private繼承方式 C++

C里面的結構體內的成員不受任何機制保護&#xff0c;直接能用&#xff0c;比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();而c則不同&#xff0c;c的類像強化型的結構體public公有繼承protected保護繼承private私有繼承我們知道類的private和protected成員,在類外是不可以…

原型模型| 軟件工程

A prototype means a preliminary model of anything which gives us a rough idea about the basic functionalities that the real model would have. The prototyping model follows the same strategy. 原型意味著任何事物的初步模型&#xff0c;這使我們對真實模型具有的基…

librtmp分析(發送數據包處理)

RTMP詳細分析&#xff08;三次握手&#xff09; RTMP詳細分析(Message 消息&#xff0c;Chunk分塊) librtmp分析&#xff08;接收數據包處理&#xff09; rtmp協議中的message的發送涉及有message 分chunk、base header長度的變化、message header長度的變化&#xff0c;只查看…

愛博圖--微博圖片批量下載小工具

2010/10/10 13:21 更新支持新浪博客相冊。 例如&#xff1a; http://photo.blog.sina.com.cn/category/u/1245856511/s/275046新浪的微博用戶在發微博的時候&#xff0c;一般都會附加一張與相關的圖片。例如&#xff1a;歐美街拍xoxo這位博主就是單純的發圖片。因此可以說新浪微…

FusionCharts圖表標題的參數設置

FusionCharts 允許你為chart配置標題、子標題、x軸標題和y軸標題&#xff0c;可以為它們指定字體、樣式和動畫效果等。那么Chart的主標題、子標題、X軸標題和Y軸標題的參數應該怎樣設置呢&#xff1f; Chart主標題 Chart的caption屬性設置主標題。代碼如下&#xff1a; <cha…