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
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...