一、什么是MQTT
MQTT的全稱是“ Message Queuing Telemetry Transport”,即消息隊列遙測傳輸,是一種基於訂閱/發布模式的應用層協議,而http是一種基於restful風格的一種應用層協議。
MQTT協議是一種輕量級協議,作為一種低開銷、低帶寬占用的即時通訊協議,常被應用於物聯網項目。同樣基於訂閱/發布模式的中間件有ActiveMQ,Kafka等消息中間件,歸根結底實現的都是消息的傳輸。
二、如何理解MQTT
MQTT的是一種應用層協議,每一種協議都有其適用場景,而MQTT常被應用於消息推送,消息采集。例如溫度檢測儀器定時上傳溫度、檢測礦洞氧氣濃度等。
MQTT是基於TCP/IP的一種應用層協議,TCP/IP本身已實現了在不可靠的網絡環境提供可靠的網絡傳輸的功能,而MQTT協議也有其保障消息可靠傳輸的策略。
MQTT推送的消息有三種消息質量
1.至多一次,即消息只推送一次,至於消息有沒有推送成功
2.至少一次,需要確認消息到達,可能會導致收到重復數據(注:MQTT定義的重發機制與tcp的重復機制是不同的,tcp的重復機制是在限定時間內如果沒有收到對應序號的響應報文,則會重新推送該序列號對應的報文,而MQTT的重發機制是在客戶端重新建立連接時,
補發之前沒有對應響應報文的數據包,當然客戶端可以選擇是否要接收這些之前沒有傳輸成功的數據包。最開始使用netty實現MQTT服務器的時候就理解錯了,以為MQTT的重復機制與tcp的重復機制一樣)
3.只有一次,確認消息只到達一次,常用於對數據要求嚴格的場景,例如計費場景,訂單場景
三、如何使用MQTT
MQTT的客戶端和服務端目前已有成熟的開源產品,例如服務端有emqx,客戶端有Eclipse Paho Mqtt(Java),都可以方面的引入相應的庫快速的實現推送功能(具體可根據需求查看對應的API)。
本質上來將是客戶端與服務端建立一個Socket,然后根據MQTT協議規定發送響應的報,例如建立socket后發送connet報文去建立連接,然后服務器會解析該連接報文,並保存該連接的相關信息。
我們可以把MQTT協議的規定當成是我們實現web項目中所實現的業務邏輯。
四、MQTT協議的相關的名詞解析
1.訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
2.、會話(Session)
每個客戶端與服務器建立連接后就是一個會話,客戶端和服務器之間有狀態交互。會話存在於一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡連接。
3.主題名(Topic Name)
連接到一個應用程序消息的標簽,該標簽與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標簽的每個客戶端。
4.主題篩選器(Topic Filter)
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
5.負載(Payload)
消息訂閱者所具體接收的內容。