MQTT入門篇

来源:http://www.cnblogs.com/houziwty/archive/2017/08/10/7339731.html
-Advertisement-
Play Games

物聯網(Internet of Things,IoT)最近曝光率越來越高。雖然HTTP是網頁的事實標準,不過機器之間(Machine-to-Machine,M2M)的大規模溝通需要不同的模式:之前的請求/回答(Request/Response)模式不再合適,取而代之的是發佈/訂閱(Publish/S ...


物聯網(Internet of Things,IoT)最近曝光率越來越高。雖然HTTP是網頁的事實標準,不過機器之間(Machine-to-Machine,M2M)的大規模溝通需要不同的模式:之前的請求/回答(Request/Response)模式不再合適,取而代之的是發佈/訂閱(Publish/Subscribe)模式。這就是輕量級、可擴展的MQTT(Message Queuing Telemetry Transport)可以施展拳腳的舞臺。

MQTT簡介

MQTT是基於二進位消息的發佈/訂閱編程模式的消息協議,最早由IBM提出的,如今已經成為OASIS規範。由於規範很簡單,非常適合需要低功耗和網路帶寬有限的IoT場景,比如:

  • 遙感數據
  • 汽車
  • 智能家居
  • 智慧城市
  • 醫療醫護

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

  1. 精簡,不添加可有可無的功能。
  2. 發佈/訂閱(Pub/Sub)模式,方便消息在感測器之間傳遞。
  3. 允許用戶動態創建主題,零運維成本。
  4. 把傳輸量降到最低以提高傳輸效率。
  5. 把低帶寬、高延遲、不穩定的網路等因素考慮在內。
  6. 支持連續的會話控制。
  7. 理解客戶端計算能力可能很低。
  8. 提供服務質量管理。
  9. 假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。

運用MQTT協議,設備可以很方便地連接到物聯網雲服務,管理設備並處理數據,最後應用到各種業務場景,如下圖所示:

iot-mqtt-tutorial-01

發佈/訂閱模式

與請求/回答這種同步模式不同,發佈/訂閱模式解耦了發佈消息的客戶(發佈者)與訂閱消息的客戶(訂閱者)之間的關係,這意味著發佈者和訂閱者之間並不需要直接建立聯繫。打個比方,你打電話給朋友,一直要等到朋友接電話了才能夠開始交流,是一個典型的同步請求/回答的場景;而給一個好友郵件列表發電子郵件就不一樣,你發好電子郵件該幹嘛幹嘛,好友們到有空了去查看郵件就是了,是一個典型的非同步發佈/訂閱的場景。

熟悉編程的同學一定非常熟悉這種設計模式了,因為它帶來了這些好處:

  • 發佈者與訂閱者不必瞭解彼此,只要認識同一個消息代理即可。
  • 發佈者和訂閱者不需要交互,發佈者無需等待訂閱者確認而導致鎖定。
  • 發佈者和訂閱者不需要同時線上,可以自由選擇時間來消費消息。

主題

MQTT是通過主題對消息進行分類的,本質上就是一個UTF-8的字元串,不過可以通過反斜杠表示多個層級關係。主題並不需要創建,直接使用就是了。

主題還可以通過通配符進行過濾。其中,+可以過濾一個層級,而#只能出現在主題最後表示過濾任意級別的層級。

舉個例子:

  • building-b/floor-5:代表B樓5層的設備。
  • +/floor-5:代表任何一個樓的5層的設備。
  • building-b/#:代表B樓所有的設備。

註意,MQTT允許使用通配符訂閱主題,但是並不允許使用通配符廣播。

服務質量

為了滿足不同的場景,MQTT支持三種不同級別的服務質量(Quality of Service,QoS)為不同場景提供消息可靠性:

  • 級別0:儘力而為。消息發送者會想盡辦法發送消息,但是遇到意外並不會重試。
  • 級別1:至少一次。消息接收者如果沒有知會或者知會本身丟失,消息發送者會再次發送以保證消息接收者至少會收到一次,當然可能造成重覆消息。
  • 級別2:恰好一次。保證這種語義肯定會減少併發或者增加延時,不過丟失或者重覆消息是不可接受的時候,級別2是最合適的。

服務質量是個老話題了。級別2所提供的不重不丟很多情況下是最理想的,不過往返多次的確認一定對併發和延遲帶來影響。級別1提供的至少一次語義在日誌處理這種場景下是完全OK的,所以像Kafka這類的系統利用這一特點減少確認從而大大提高了併發。級別0適合雞肋數據場景,食之無味棄之可惜,就這麼著吧。

消息類型

MQTT擁有14種不同的消息類型:

  1. CONNECT:客戶端連接到MQTT代理
  2. CONNACK:連接確認
  3. PUBLISH:新發佈消息
  4. PUBACK:新發佈消息確認,是QoS 1給PUBLISH消息的回覆
  5. PUBREC:QoS 2消息流的第一部分,表示消息發佈已記錄
  6. PUBREL:QoS 2消息流的第二部分,表示消息發佈已釋放
  7. PUBCOMP:QoS 2消息流的第三部分,表示消息發佈完成
  8. SUBSCRIBE:客戶端訂閱某個主題
  9. SUBACK:對於SUBSCRIBE消息的確認
  10. UNSUBSCRIBE:客戶端終止訂閱的消息
  11. UNSUBACK:對於UNSUBSCRIBE消息的確認
  12. PINGREQ:心跳
  13. PINGRESP:確認心跳
  14. DISCONNECT:客戶端終止連接前優雅地通知MQTT代理

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Description 高一一班的座位表是個n*m的矩陣,經過一個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為電腦競賽教練的scp大老闆,想知道如何分 ...
  • 關於GIT GIT 是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。是目前世界上最先進的分散式版本控制系統. 什麼是版本控制 版本控制(Revision control)是維護工程藍圖的標準 ...
  • 一切皆對象! 預習: #仿照正方形類寫一個圓形類 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): '面積' return self.leng ...
  • [TOC] 1. 創建並聲明一個切麵 1. 首先,創建一個類,添加 註解使其添加到IoC容器 2. 然後,添加 註解,使其成為一個切麵 3. 最後,在配置文件裡面,使用``來使其生效 2. 使用切麵的通知 切麵總共有 6 個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知 ...
  • spring.io官方提供的例子Building a RESTful Web Service提供了用Maven、Gradle、STS構建一個RESTFul Web Service,實際上採用STS構建會更加的便捷。 STS安裝參考。 目標 在瀏覽器中輸入url: 訪問後得到結果: 可以在url中帶上 ...
  • 1, OutOfMemoryError異常 除了程式計數器外,虛擬機記憶體的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能, java Heap 溢出 一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess java堆用 ...
  • 直接上代碼,相信以後會用到的 ...
  • 服務端代碼: 客戶端代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...