什么是MQTT
MQTT是Message Queuing Telemetry Transport的縮寫,它是一個基于發(fā)布/訂閱模式的輕量級消息中間件協(xié)議,IBM公司的Andy Stanford-Clark 和Cirrus Link公司的Arlen Nipper在1999年設(shè)計了MQTT協(xié)議,最初用于石油管道的遠(yuǎn)程遙監(jiān)系統(tǒng)。2010年MQTT發(fā)布免費版本,2014年MQTT成為OASIS標(biāo)準(zhǔn),現(xiàn)在被廣泛應(yīng)用于物聯(lián)網(wǎng),移動互聯(lián)網(wǎng)等領(lǐng)域的數(shù)據(jù)傳輸。
MQTT之所以變得流行,是因為它具備以下特點,而這些特點在其它消息傳輸協(xié)議中很難(全部)滿足:
- 輕量級,協(xié)議簡單,容易實現(xiàn),并且具有很快的傳輸速度。
- 節(jié)省帶寬,MQTT協(xié)議頭只有兩個字節(jié),包含數(shù)據(jù)包類型和一些輔助信息字段,傳輸效率高,占用帶寬少。
- 低功耗, 降低了對設(shè)備的硬件要求,不需要很好的CPU,不需要很大的內(nèi)存,同時省電,這使得MQTT可以運行在大多數(shù)的物聯(lián)網(wǎng)設(shè)備(如樹莓派)上。
- 實時,MQTT基于TCP/IP進(jìn)行數(shù)據(jù)傳輸,消息傳輸延遲低。
- 可靠,MQTT協(xié)議中定義了消息傳輸?shù)腝oS(Quality of Service),可以保證消息的可靠傳輸。即使在網(wǎng)絡(luò)環(huán)境惡劣的情況下(如設(shè)備進(jìn)入地鐵,隧道或無信號區(qū)域),也能保證消息不丟失。
MQTT協(xié)議版本
MQTT協(xié)議有兩個主要的版本,MQTT 3和MQTT 5,MQTT 3是當(dāng)前主要使用的協(xié)議版本,大多數(shù)MQTT實現(xiàn)都支持該版本。MQTT 5在2018年6月發(fā)布,帶來了許多令人興奮的新特性,因為版本比較新,所以對其支持有限,但是相信這種狀況將來會慢慢改變。你可以點擊MQTT 3和MQTT 5分別下載這兩個協(xié)議的版本。
MQTT 核心概念
MQTT通過以下方式進(jìn)行數(shù)據(jù)交互。

客戶端Publisher發(fā)送一條消息message給MQTT Broker,發(fā)送消息時需要關(guān)聯(lián)一個topic和QoS(Quality of Service)。topic指定了消息要發(fā)送給哪個主題,QoS指定了消息可靠性等級(這個在后邊會講到)。假設(shè)當(dāng)前消息發(fā)給主題topic1,并且有兩個客戶端Subscriber分別訂閱了topic1。MQTT Broker收到消息后,發(fā)現(xiàn)消息是發(fā)送給topic1的,于是將這份消息分別轉(zhuǎn)發(fā)給它的兩個訂閱者。
MQTT的核心概念包括:
Broker,又稱Server,是MQTT的服務(wù)端,負(fù)責(zé)與客戶端建立連接,接收并轉(zhuǎn)發(fā)消息,接收訂閱和取消訂閱請求等。
Client,使用MQTT協(xié)議的程序或設(shè)備,負(fù)責(zé)與Broker建立連接,發(fā)送或者接收數(shù)據(jù),訂閱主題或取消訂閱。
Message,在MQTT協(xié)議中傳輸?shù)臄?shù)據(jù),當(dāng)消息被傳輸時,通常和一個主題名稱(topic name)以及一個QoS(服務(wù)質(zhì)量)關(guān)聯(lián)起來。
Topic,主題有兩層含義,在發(fā)布消息時,主題會和消息關(guān)聯(lián)起來,告訴Broker這條消息要發(fā)給哪個主題。在訂閱消息時,客戶端需要告訴Broker自己對哪個主題感興趣,一旦有消息發(fā)給這個主題,Broker會將消息發(fā)給主題的訂閱者。主題支持統(tǒng)配符,對于使用通配符的主題,我們成為Topic Filter。
Publish,客戶端發(fā)送消息給Broker的過程。發(fā)送消息時需要指定topic和QoS。Broker會將消息轉(zhuǎn)發(fā)給訂閱了該topic的其它客戶端。
Subscribe,客戶端訂閱主題的過程。客戶端告訴Broker,自己對某個topic感興趣,當(dāng)有其它客戶端發(fā)送消息給這個topic時,Broker會轉(zhuǎn)發(fā)該消息給自己。客戶端可以取消訂閱,這個過程稱作Unsubscribe,取消訂閱后,Broker不會再轉(zhuǎn)發(fā)消息給當(dāng)前客戶端。
QoS,Quality of Service。消息可靠性傳遞的參數(shù),有3個值,分別是:
- 0,消息只發(fā)送一次,不保證發(fā)送成功。
- 1,消息最少發(fā)送一次,保證發(fā)送成功。因為可能發(fā)送多次,因此接收方可能收到重復(fù)消息。
- 2,消息只發(fā)送一次,保證成功。接收方不會接到重復(fù)消息。
發(fā)送消息時,可以指定QoS,如果QoS>0,那么消息一定會發(fā)到Broker。訂閱主題時,也可以指定QoS,如果QoS>0,那么Broker一定會將消息發(fā)給訂閱者,不會丟失。這里要要注意,消息從發(fā)布者到訂閱者,是分兩步走的,第一步有發(fā)布者發(fā)布到MQTT Broker,第二步是MQTT Broker轉(zhuǎn)發(fā)消息到訂閱者。所以只有當(dāng)發(fā)布消息時,指定QoS>0,并且訂閱主題時,QoS>0,消息才能可靠的從發(fā)布客戶端發(fā)送到訂閱客戶端端。
MQTT Server, Client & Tools
MQTT只是一套數(shù)據(jù)傳輸協(xié)議,要完成數(shù)據(jù)傳輸,還需要應(yīng)用程序來實現(xiàn)它。MQTT實現(xiàn)分為服務(wù)端和客戶端。MQTT 有很多服務(wù)端實現(xiàn)版本,具體請參見MQTT Server/Brokers,除了收費的版本,用得比較多的應(yīng)該是Mosquitto和EQM了。
MQTT 也有很多客戶端實現(xiàn)版本,大多數(shù)編程語言都有MQTT客戶端實現(xiàn),具體請查看MQTT Libraries。這里邊比較有名的是Eclipse開發(fā)的Eclipse Paho,Spring Boot中Mqtt默認(rèn)實現(xiàn)就是使用Paho。
MQTT也提供了一些工具,方便開發(fā)測試,具體請參見MQTT Tools,這里推薦幾個比較好用的并且跨平臺的工具。
MQTT-spy,Java版本的客戶端工具,提供可視化界面,要求安裝JRE/JDK 8u60 以上版本。
MQTT Lens,Chrome插件,方便使用。
Mosquitto,是MQTT的完整實現(xiàn),包含了服務(wù)端和客戶端,它非常輕量級,并且使用簡單,所以適合初學(xué)者,也有很多公司在產(chǎn)品環(huán)境中使用它,不過產(chǎn)品環(huán)境的使用配置要多很多。它是基于命令行的,在Linux環(huán)境下也很方便使用。
到現(xiàn)在為止,應(yīng)該對MQTT有一個大致的了解了,下一節(jié)我們將體驗一下使用MQTT進(jìn)行數(shù)據(jù)的發(fā)布和訂閱。請參見MQTT快速入門。