一: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
代理。
發佈-訂閱模式的優點:
消除了傳統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 發出斷開命令或者連接中斷。
11、消息類型說明
發佈消息
- 當 MQTT client 在連接到 broker 之後就可以發送消息了,MQTT 使用的是基於 topic 主題的過濾。每條消息都應該包含一個 topic ,broker 可以使用 topic 將消息發送給感興趣的 client。
- 每條消息還會包含一個
負載(Payload)
,Payload 中包含要以位元組形式發送的數據。(數據格式由數據的發佈者確定)
訂閱消息
client 會向 broker 發送 SUBSCRIBE 消息來接收有關感興趣的 topic,這個 SUBSCRIBE 消息非常簡單,它包含了一個唯一的數據包標識和一個訂閱列表。
確認消息
client 在向 broker 發送 SUBSCRIBE 消息後,為了確認每個訂閱,broker 會向 client 發送 SUBACK 確認消息。
退訂消息:
取消訂閱也需要 broker 的確認,此時 broker 會向 client 發送一個 UNSUBACK
消息,這個 UNSUBACK 消息非常簡單,只有一個 packetId 數據標識符。
12、topic 相關概念
在 MQTT 中,Topic 是指 broker 為每個連接的 client 過濾消息的 UTF-8
字元串。Topic 是一種分層的結構,可以由一個或者多個 Topic 組成。每個 Topic 由 /
進行分割。
與傳統的消息隊列相比,MQTT Topic 非常輕量級,client 在發佈或訂閱之前不需要先創建所需要的 Topic,broker 在接收每個 Topic 前不用進行初始化操作。
13、topic的通配符
當客戶端訂閱 Topic 時,它可以訂閱已發佈消息的確切 Topic,也可以使用通配符來同時訂閱多個 Topic。通配符有兩種:單級和多級。
單級通配符
單級通配符可以替換 Topic 的一個級別,+
號代表 Topic 中的單級通配符。
多級通配符
多級通配符涵蓋多個 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_pub
和mosquitto_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:
發佈消息:
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