亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MQTT的介紹及使用

發布時間:2021-07-09 09:10:06 來源:億速云 閱讀:210 作者:chen 欄目:編程語言

這篇文章主要介紹“MQTT的介紹及使用”,在日常操作中,相信很多人在MQTT的介紹及使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MQTT的介紹及使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1 簡述

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

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

MQTT的介紹及使用

2 設計規范

由于物聯網的環境是非常特別的,所以MQTT遵循以下設計原則:

  • 精簡,不添加可有可無的功能;

  • 發布/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞;

  • 允許用戶動態創建主題,零運維成本;

  • 把傳輸量降到最低以提高傳輸效率;

  • 把低帶寬、高延遲、不穩定的網絡等因素考慮在內;

  • 支持連續的會話控制;

  • 理解客戶端計算能力可能很低;

  • 提供服務質量管理;

  • 假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。

3 主要特性

MQTT協議工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:

  • 使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合。這一點很類似于XMPP,但是MQTT的信息冗余遠小于XMPP,因為XMPP使用XML格式文本來傳遞數據。

  • 對負載內容屏蔽的消息傳輸。

  • 使用TCP/IP提供網絡連接。主流的MQTT是基于TCP連接進行數據推送的,但是同樣有基于UDP的版本,叫做MQTT-SN。這兩種版本由于基于不同的連接方式,優缺點自然也就各有不同了。

  • 有三種消息發布服務質量QoS (Quality of Service):

    • At Most Once 至多一次,消息發布完全依賴底層TCP/IP網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。這一種方式主要普通APP的推送,倘若你的智能設備在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。

    • At Least Once 至少一次,確保消息到達,但消息重復可能會發生。

    • Exactly Once 有且僅有一次,確保消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。在計費系統中,消息重復或丟失會導致不正確的結果。這種最高質量的消息發布服務還可以用于即時通訊類的APP的推送,確保用戶收到且只會收到一次。

  • 小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。這就是為什么在介紹里說它非常適合"在物聯網領域,傳感器與服務器的通信,信息的收集",要知道嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了。

  • 使用Last Will和Testament特性通知有關各方客戶端異常中斷的機制。

    • Last Will:即遺言機制,用于通知同一主題下的其他設備發送遺言的設備已經斷開了連接。

    • Testament:遺囑機制,功能類似于Last Will。

4 MQTT協議原理

4.1 MQTT協議實現方式

實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。

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

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

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

4.2 網絡傳輸與應用消息

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

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

4.3 MQTT客戶端

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

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

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

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

  • 斷開與服務器連接。

4.4 MQTT服務器

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

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

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

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

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

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

4.5.1 訂閱(Subscription)

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

4.5.2 會話(Session)

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

4.5.3 主題名(Topic Name)

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

4.5.4 主題篩選器(Topic Filter)

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

4.5.5 負載(Payload)

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

4.6 MQTT協議中的方法

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

  • Connect:等待與服務器建立連接。

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

  • Subscribe:等待完成訂閱。

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

  • Publish:MQTT客戶端發送消息請求,發送完成后返回應用程序線程。

5 MQTT協議數據包結構

在MQTT協議中,一個MQTT數據包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構成。

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

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

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

5.1 MQTT固定頭

固定頭存在于所有MQTT數據包中,包含兩部分內容:首字節(Byte 1) 和 剩余消息報文長度(1-4字節)

  • Byte 1 首字節:

    • Bit 7 6 5 4  高四位無符號值,用于表示MQTT消息的報文類型(MQTT Control Packet type),總共可以表示2^4=16種協議類型。

    • Bit 3 2 1 0 低四位無符號值,用作某些報文的特殊標記(Flags specific to each MQTT Control Packet type)。

  • Byte 2… Remaining Length 剩余消息報文長度

5.1.1 MQTT數據包類型 MQTT Control Packet type

位于 首字節的高四位,即Byte 1中的 bits 7-4,相于一個4位的無符號值。用于確定報文類型。共有2^4=16種,其中0000和1111是保留字段。具體如下:

報文類型字段值數據方向描述
保留0禁用保留
CONNECT1Client -> Server客戶端連接到服務器
CONNACK2Server -> Client連接確認
PUBLISH 3Client <-> Server發布消息
PUBACK4Client <-> Server發布確認
PUBREC5Client <-> Server消息已接收(QoS2第一階段)
PUBREL6Client <-> Server消息釋放(QoS2第二階段)
PUBCOMP7Client <-> Server發布結束(QoS2第三階段)
SUBSCRIBE8Client -> Server客戶端訂閱請求
SUBACK9Server -> Client服務端訂閱確認
UNSUBACRIBE10Client -> Server客戶端取消訂閱
UNSUBACK11Server -> Client服務端取消訂閱確認
PINGREQ12Client -> Server客戶端發送心跳
PINGRESP13Server -> Client服務端回復心跳
DISCONNECT14Client -> Server客戶端斷開連接請求
保留15禁用保留
5.1.2 標識位 Flags specific to each MQTT Control Packet type

位于首字節的低四位,即Byte 1中bits 3-0。表示某些報文類型的控制字段,實際上只有少數報文類型有控制位。

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

  • DUP:發布消息的副本。用來在保證消息的可靠傳輸,如果設置為1,則在下面的變長中增加MessageId,并且需要回復確認,以保證消息傳輸完成,但不能用于檢測消息重復發送。

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

?00:最多一次,即:<=1?01:至少一次,即:>=1?10:一次,即:=1?11:預留
  • RETAIN: 發布保留標識,表示服務器要保留這次推送的信息,如果有新的訂閱者出現,就把這消息推送給它,如果設有那么推送至當前訂閱者后釋放。

5.1.3 剩余長度(Remaining Length)

用來保存變長頭部(Variable Header)和消息體(Payload)的總大小。從第二字節(Byte 2)開始,最長可達4字節,所以剩余長度范圍是Byte[2-5]。那么怎樣確定其長度到底是1字節還是4字節呢?它先用從低位Bit 0到Bit 6來存儲,當發現不夠時,則將 最高位Bit 7(默認都是高字節在前)置為 1,表示長度不足,需要使用下一個字節繼續保存,就繼續計算字節長度;如果是0,那么就不再計算字節長度。

消息長度可以簡單理解為128進制的數據,4位長度最大可以表示128, 128128*128Byte=256MB。但是這個長度的計算有些特別,就是低位在前,高位在后(因為正常的表示方法是高位在前,低位在后),字節最高位Bit7用于標記是否需要繼續計算消息長度。以下是消息長度的長度范圍:

字節數長度最小值長度最大值
10(0x00)127(0x7F)
2128 (0x80, 0x01)16 383 (0xFF, 0x7F)
316 384 (0x80, 0x80, 0x01)2 097 151 (0xFF, 0xFF, 0x7F)
42 097 152 (0x80, 0x80, 0x80, 0x01)268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)

5.2 MQTT可變頭

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

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

5.3 Payload消息體

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

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

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

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

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

到此,關于“MQTT的介紹及使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜昌市| 杭锦后旗| 临海市| 尼玛县| 罗江县| 曲阜市| 泽库县| 竹溪县| 屏东县| 旌德县| 犍为县| 宽城| 怀安县| 京山县| 海丰县| 望谟县| 新乐市| 嘉义县| 岳普湖县| 张家口市| 焦作市| 河池市| 宾阳县| 三穗县| 萍乡市| 江阴市| 岗巴县| 龙山县| 天长市| 土默特右旗| 新乐市| 甘孜县| 海安县| 类乌齐县| 余干县| 镇巴县| 红安县| 昌黎县| 平顶山市| 通辽市| 丹棱县|