MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。
介紹
MQTT最大優點在於,可以以極少的代碼和有限的帶寬,爲連接遠程設備提供實時可靠的消息服務。官網鏈接
MQTT是爲硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發佈/訂閱型消息協議,爲此,它需要一個消息中間件,以解決當前繁重的資料傳輸協議,如:HTTP。
MQTT作爲一種低開銷、低帶寬佔用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
特性
- 使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程序耦合。
- 對負載內容屏蔽的消息傳輸。
- 使用TCP/IP提供網絡連接。
- 有三種消息發佈服務質量:
“至多一次”,消息發佈完全依賴底層TCP/IP網絡。會發生消息丟失或重複。
“至少一次”,確保消息到達,但消息重複可能會發生。
“只有一次”,確保消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。 - 小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。
- 使用Last Will和Testament特性通知有關各方客戶端異常中斷的機制。
Last Will:即遺言機制,用於通知同一主題下的其他設備發送遺言的設備已經斷開了連接。
Testament:遺囑機制,功能類似於Last Will。
實現方式
實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發佈者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。
其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,消息發佈者可以同時是訂閱者。
MQTT傳輸的消息分爲:主題(Topic)和負載(payload)兩部分:
- Topic,可以理解爲消息的類型,訂閱者訂閱(Subscribe)後,就會收到該主題的消息內容(payload);
- payload,可以理解爲消息的內容,是指訂閱者具體要使用的內容。
客戶端可以建立與服務器的連接,訂閱主題、接受消息、發佈消息等
服務器可以是一個應用程序或一臺設備。用於接受來自客戶端的網絡連接,接受發佈的消息、轉發訂閱相關主題的客戶端的消息、等
應用
應用首先需要 MQTT服務器,其次需要客戶端
然後要客戶端跟服務器進行連接
連接之後就可以 訂閱主題 收到該主題發佈的信息 ,向特定主題發佈信息
MQTT服務器安裝
EMQ 是國人開發的 也挺好用的,能夠支持連接量比較大的服務
mosquitto 是一個輕量級的服務器 比較小,但是學習也足夠了
mqtt服務器 EMQ
(開源物聯網 MQTT消息服務器)
EMQ提供了一個後端Web控制檯,用戶可通過 Web 控制檯,查看服務器運行狀態、統計數據、客戶端(Client)、會話(Session)、主題(Topic)、訂閱(Subscription)、插件(Plugin)。
鏈接
EMQ服務器在Windows搭建
到官網下載好相應版本 然後解壓
使用命令行進入到解壓路徑下 輸入
bin\emqttd.cmd start
然後在瀏覽器中輸入 http://127.0.0.1:18083 即可打開 (默認用戶名admin 密碼 public)
在安裝好服務器端之後,我們使用MQTT的客戶端對MQTT服務器的基本功能進行相關的測試。MQTT客戶端有不少,比如mosquito提供了命令行,通過命令行工具可以方便地進行測試;最簡單的方式可能還是通過可視化的界面對其進行測試,比如MQTTBox
mqtt服務器 mosquitto
一款實現了消息推送協議 MQTT v3.1 的開源消息代理軟件,提供輕量級的,支持可發佈/可訂閱的的消息推送模式
下載地址 http://mosquitto.org/download/
選擇win64 版本
安裝好之後再安裝目錄下 打開命令行輸入
mosquitto.exe -v 開始運行
訂閱主題 新建命令行窗口 輸入命令
mosquitto_sub -v -t topicTest #-t後面是主題名稱
發佈信息 新建命令行窗口 輸入命令
mosquitto_pub -t topicTest -m TEset # -m 後面是消息內容 -t 後面是發往的主題名
當發佈信息後 訂閱的主題將能夠顯示出來發佈的內容
如果關閉最先打開的窗口 則無法發佈消息
Ubuntu端 安裝使用mosquitto
打開mosquitto服務 sudo service mosquitto start
停止服務 sudo service mosquitto stop
本地的mqtt服務 訂閱主題 mosquitto_sub -h localhost -t “mqtt” -v
發佈消息 mosquitto_pub -h localhost -t “mqtt” -m “Hello2 MQTT”
公網的mqtt服務 如 test.mosquitto.org
訂閱主題 mosquitto_sub -h test.mosquitto.org -t “msg_only_from_me” -v
發佈消息到這個主題 mosquitto_pub -h test.mosquitto.org -t “msg_only_from_me” -m “My cat is Luna”
局域網內的mqtt服務器 (設備在同一WiFi下也是在同一局域網 Windows查ip命令 ipconfig Ubuntu查ip命令 ifconfig 可以使用ping ip的方法查看是否在同一局域網)
訂閱主題 mosquitto_sub -h 192.168.43.211 -t ‘mqtt’ -v
發佈消息 mosquitto_pub -h 192.168.43.211 -t ‘mqtt’ -m ‘hellddo’
(同一局域網內 通過ip加端口可以訪問到 該ip設備的服務)
客戶端MQTTBox
打開之後如果沒有創建主題 會有一個create MQTT Client按鈕
指定連接相關信息,包括連接名稱(可以隨意輸入)、協議(選擇mqtt/tcp)和主機地址(安裝在本地,MQTT缺省端口爲1883,所以輸入127.0.0.1:1883)沒有設置用戶名密碼 可以不填,然後單擊“Save”保存
下面就可以來測試消息發佈和訂閱了
相應的服務器端也會發生變化
如果使用的不是本地服務器 在host輸入服務器的地址
如果服務器需要用戶名密碼 就在username輸入用戶名 password輸入密碼
參考代碼鏈接
更多學習教程
ESP開發學習基礎知識
基礎知識包括對esp模塊的認識與瞭解 mqtt協議的瞭解,arduino IDE運用代碼編寫等等。
- arduino基礎學習
- esp系列模塊的介紹
- mqtt協議的介紹與使用
- 利用mqtt esp模塊 基於arduino IDE開發方法
- esp模塊的AT指令 刷固件
- esp模塊睡眠模式使用
- esp8266-01s介紹與使用
- esp8266-12f介紹與使用
- NodeMcu介紹與使用
esp開發IOT應用
基於esp8266的模塊以及其他模塊根據實際的應用場景與需求製作的物聯網應用