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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...