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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...