MQTT協議介紹

来源:https://www.cnblogs.com/heyongshen/archive/2023/03/31/17276654.html
-Advertisement-
Play Games

一:MQTT 1、MQTT協議說明 ( Message Queuing Telemetry Transport)消息隊列傳輸探測,一種基於==發佈/訂閱模式==的輕量級消息傳輸協議 2、MQTT協議來源 在1999年的時候,Andy Stanford-Clark和 Arlen Nipper需要一種通 ...


一:MQTT

1、MQTT協議說明

( Message Queuing Telemetry Transport)消息隊列傳輸探測,一種基於發佈/訂閱模式的輕量級消息傳輸協議

2、MQTT協議來源

在1999年的時候,Andy Stanford-Clark和 Arlen Nipper需要一種通過衛星連接原油管道數據採集監控系統的協議,以最大限度地減少電池損耗和帶寬。所以發明瞭MQTT協議。

3、MQTT協議使用場景

適用於低帶寬和不穩定網路環境的物聯網應用場景,在這樣的場景中,可以用極少的代碼為聯網設備提供實時可靠的消息服務。

MQTT 協議廣泛應用於物聯網、移動互聯網、智能硬體、車聯網、智慧城市、遠程醫療、電力、石油與能源等領域。

4、MQTT協議的特點

  • 易於實現

  • 輕量高效,節省帶寬,最小報文僅為 2 個位元組。

  • 使用TCP進行連接,實現穩定、可靠的網路連接

  • 基於發佈訂閱模型,支持雙工通信。

  • 靈活性、擴展性很強。

5、C/S和pub/sub的區別

C/S模式:客戶端能夠直接和伺服器進行通信

pub/sub:將發送消息的發佈者 publisher與接收消息的訂閱者 subscribers進行分離,publisher 與 subscribers 並不會直接通信,他們甚至都不清楚對方是否存在,他們之間的交流由第三方組件 broker 代理。
image

發佈-訂閱模式的優點:

消除了傳統c/s模式之間的直接通信,把通信這個操作交給了 broker 進行代理,併在空間、時間、同步三個維度上進行瞭解藕。

6、消息過濾

broker 能夠對消息進行過濾,使每個訂閱者只接收自己感興趣的消息。

過濾選項:

(1)基於主題的過濾:MQTT 是基於 subject 的消息過濾的,每條消息都會有一個 topic ,接收客戶端會向 borker 訂閱感興趣的 topic,訂閱後,broker 就會確保客戶端收到發佈到 topic 中的消息

(2)基於內容過濾:broker 會根據特定的內容過濾消息,接受客戶端會經過過濾他們感興趣的內容。

(3)基於類型過濾:使用面向對象的語言時,基於消息(事件)的類型過濾是一種比較常見的過濾方式。

7、MQTT和消息隊列區別

  • 消息隊列:一條消息只能被一個客戶端所消費
  • MQTT:每個訂閱者都會受到消息,每個訂閱者有相同的負載(數據信息)

8、MQTT Client

publisher 和 subscriber 都屬於 MQTT Client。之所以有發佈者和訂閱者這個概念,其實是一種相對的概念,就是指當前客戶端是在發佈消息還是在接收消息

MQTT 客戶端是指運行 MQTT 庫並通過網路連接到 MQTT broker 的任何設備,這些設備可以從微控制器到成熟的伺服器。

9、MQTT broker

  • broker 負責接收所有消息,過濾消息,確定是哪個 client 訂閱了每條消息,並將消息發送給對應的 client.
  • broker 還負責保存會話數據,這些數據包括訂閱的和錯過的消息。broker 還負責客戶端的身份驗證和授權。

10、MQTT連接

連接是client和broker之間的連接。 client 就會向 broker 發起 CONNECT 消息,代理會使用 CONNACK 消息和狀態碼進行響應。

一旦 client 和 broker 的連接建立後,broker 就會使客戶端的連接一直處於打開狀態,直到 client 發出斷開命令或者連接中斷。

image

11、消息類型說明

發佈消息

  • 當 MQTT client 在連接到 broker 之後就可以發送消息了,MQTT 使用的是基於 topic 主題的過濾。每條消息都應該包含一個 topic ,broker 可以使用 topic 將消息發送給感興趣的 client。
  • 每條消息還會包含一個負載(Payload),Payload 中包含要以位元組形式發送的數據。(數據格式由數據的發佈者確定)

訂閱消息

client 會向 broker 發送 SUBSCRIBE 消息來接收有關感興趣的 topic,這個 SUBSCRIBE 消息非常簡單,它包含了一個唯一的數據包標識和一個訂閱列表。

確認消息

client 在向 broker 發送 SUBSCRIBE 消息後,為了確認每個訂閱,broker 會向 client 發送 SUBACK 確認消息。
image

退訂消息:

取消訂閱也需要 broker 的確認,此時 broker 會向 client 發送一個 UNSUBACK 消息,這個 UNSUBACK 消息非常簡單,只有一個 packetId 數據標識符。

image

12、topic 相關概念

在 MQTT 中,Topic 是指 broker 為每個連接的 client 過濾消息的 UTF-8 字元串。Topic 是一種分層的結構,可以由一個或者多個 Topic 組成。每個 Topic 由 / 進行分割。

image

與傳統的消息隊列相比,MQTT Topic 非常輕量級,client 在發佈或訂閱之前不需要先創建所需要的 Topic,broker 在接收每個 Topic 前不用進行初始化操作。

13、topic的通配符

當客戶端訂閱 Topic 時,它可以訂閱已發佈消息的確切 Topic,也可以使用通配符來同時訂閱多個 Topic。通配符有兩種:單級和多級

單級通配符

單級通配符可以替換 Topic 的一個級別,+ 號代表 Topic 中的單級通配符。

image

多級通配符

多級通配符涵蓋多個 Topic,# 代表 Topic 中的多級通配符。為了讓 broker 能夠確定和哪些 Topic 匹配,多級通配符必須作為 Topic 中的最後一個字元放置,並以 / 開頭。

當 client 訂閱帶有多級通配符的 Topic 時,不論 Topic 有多長多深,它都會收到通配符之前 Topic 的所有消息。如果你只將 Topic 定義為 # 的話,那麼你將會收到所有的消息

二:MQTT客戶端工具

1、mosquitto

Mosquitto 是一種流行的MQTT代理和客戶端庫,它可以用於實現MQTT通信

mosquitto是一款實現了消息推送協議 MQTTv5.0, v3.1.1, v3.1 的開源消息代理軟體,提供輕量級的,支持可發佈/可訂閱的的消息推送模式,使設備對設備之間的短消息通信變得簡單,比如現在應用廣泛的低功耗感測器,手機、嵌入式電腦、微型控制器等移動設備。

Mosquitto 安裝之後預設提供了 mosquitto_pubmosquitto_sub兩個命令行 MQTT 客戶端工具。

# 下載地址
	https://github.com/eclipse/mosquitto
# 官網
	https://mosquitto.org/

mosquitto_pub:

用於向mqtt broker 發送消息

相關參數:

-h 	# 指定要連接mqtt broker的地址 預設為localhost
-p 	# 指定mqtt broker的埠號
-u 	# 指定在與代理進行身份驗證時要使用的用戶名
-P 	# 指定在與代理進行身份驗證時要使用的密碼
-m 	# 消息內容
-t 	# 指定發送消息的topic名稱
-i  # 用於為連接到MQTT代理的客戶端分配一個唯一的客戶端ID

例如:發佈消息

# 將連接到本地主機上運行的MQTT代理,併發布消息“Hello, MQTT”到主題“topic/test”上。

mosquitto_pub -h localhost -t "topic/test" -m "Hello, MQTT"

# 例如 向地址為10.0.0.33發送topic為/xyz,消息為"How are you to to to?"的消息
mosquitto_pub -h 10.0.0.33 -t "/xyz" -i "client3" -m "How are you to to to?" -u bruce -P lan1532

mosquitto_sub:

用於向mqtt broker 訂閱消息。

當一個MQTT客戶端發佈一個消息到一個特定的主題時,MQTT代理將把這個消息發送給所有訂閱了這個主題的MQTT客戶端。

-h 	# 指定要連接mqtt broker的地址 預設為localhost
-p 	# 指定mqtt broker的連接埠號
-u 	# 指定在與代理進行身份驗證時要使用的用戶名
-P 	# 指定在與代理進行身份驗證時要使用的密碼(大寫P)
-m 	# 消息內容
-t 	# 指定訂閱的topic名稱 
-i  # 用於為連接到MQTT代理的客戶端分配一個唯一的客戶端ID

# 為了確保MQTT broker正確地將消息傳遞給所有訂閱者,它需要對每個連接到它的客戶端進行唯一標識,這就是客戶端ID的作用。

例如:訂閱消息

# 連接到本地主機上運行的MQTT代理,並訂閱主題“topic/test”上的所有消息。
mosquitto_sub -h localhost -t "topic/test" 

# 例如:
mosquitto_sub -h localhost -t "/xyz" -i "client1"  -u bruce -P lan1532

配置文件說明:

pid_file /var/run/mosquitto.pid

# 消息持久存儲
persistence true
persistence_location /var/lib/mosquitto/

# 日誌文件存放位置
log_dest file /var/log/mosquitto/mosquitto.log

# 存放子配置文件位置
include_dir /etc/mosquitto/conf.d

# 指定埠號
port 1883

# 指定協議為MQTT協議 如果需要外網可以訪問,就必須指定mqtt協議
protocol mqtt

# 設置最大連接數
max_connections -1

# 禁止匿名訪問 預設是允許匿名用戶訪問的
allow_anonymous false

mqtt broker 賬號密碼的創建:

如果關閉了匿名用戶訪問,需要mqtt broker指定的賬號密碼才能發佈或者訂閱消息。

mosquitto_passwd:用於Mosquitto用戶認證配置

# 格式
mosquitto_passwd [ -H hash ] [ -c | -D ] passwordfile username
# 選項
    -c  # 是創建一個新的文件,只保存一個用戶
    -b  # 在文件中新增一個用戶在最後
    -D  # 從文件中刪除指定用戶
    -H  # 指定密碼加密方式  

配置要點:

# 1. 配置文件中加入一下配置    
password_file /mosquitto/pwdfile  #  認證配置
acl_file /mosquitto/aclfile       #  許可權配置

# 2. #創建用戶和密碼  mosquitto_passwd -c /mosquitto/pwdfile username
root@ubuntu1804:~# mkdir /mosquitto

root@ubuntu1804:~# mosquitto_passwd -c /mosquitto/pwdfile tom
Password: 
Reenter password: 

# 3. 許可權配置
vim /mosquitto/aclfile

例如:配置mqtt broker的非匿名模式

# 1. 修改配置文件
root@ubuntu1804:~# vim /etc/mosquitto/mosquitto.conf 
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
password_file /mosquitto/pwdfile
acl_file /mosquitto/aclfile
port 1883
protocol mqtt

# 2. 添加mqtt broker的用戶名和許可權
root@ubuntu1804:~# mosquitto_passwd -c /mosquitto/pwdfile tom
Password: 
Reenter password: 

root@ubuntu1804:~# vim /mosquitto/aclfile 
user tom
topic write  /#
topic read  /#

# 3. 重啟mqtt
root@ubuntu1804:~# systemctl restart mosquitto.service 

# 4. 發起監聽
root@ubuntu1804:~# mosquitto_sub -h localhost -t "/xyz" -p 1883   -u tom -P redhat

# 5. 發送消息
root@ubuntu1804:~# mosquitto_pub -h 10.0.0.33 -t "/xyz" -i "client3" -m "How are you to tom ?" -u tom -P redhat -p 1883

監聽特定的topic:

image

發佈消息:

image

2、MQTTX 工具

EMQX:一款應用廣泛的大規模分散式物聯網 MQTT 伺服器。自 2013 年在 GitHub 發佈開源版本以來,目前全球下載量已超千萬,累計連接物聯網關鍵設備超過 1 億台。

MQTT X :一款開源的跨平臺桌面客戶端,它簡單易用且提供全面的 MQTT 5.0 功能、特性測試,可運行在macOS, Linux 和 Windows 上。

# emqx官網: https://www.emqx.io/zh/downloads?os=Windows
# 項目地址: https://github.com/emqx/MQTTX
# 下載地址: https://github.com/emqx/MQTTX/releases
# 官網:     https://mqttx.app/zh。

鏈接:

https://www.cnblogs.com/qumogu/p/16007609.html

https://segmentfault.com/a/1190000021106683

https://segmentfault.com/a/1190000040216396


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

-Advertisement-
Play Games
更多相關文章
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 這篇主要介紹對於SOP8,SOP10,SOP16封裝的PY32F002A/PY32F003, 沒有BOOT0的情況如何修改Option Bytes, 以及如何在物理管腳上使用不同的PIN ...
  • Redhat/CentOS Linux 系統進入單用戶模式 以 CentOS 7.9 和 Redhat 8.2 為例進行操作,因為CentOS是Redhat的發行版,所以同版本號界面和操作是一樣的。 CentOS 7.9 開機在 grub 引導界面時,按下 e 鍵進入編輯模式: 找到 linux16 ...
  • 環境準備: 1.至少倆台linux主機,一臺是控制節點,一臺是受控節點 2.控制節點和受控節點都需要安裝Python36 3.控制節點需要安裝ansible 4.控制節點需要獲得受控節點的普通用戶或root用戶的許可權,控制節點需要ssh客戶端,受控節點需要ssh服務端 5.控制節點和受控節點之間網路 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...