MQTT協(xié)議通信模型
Client/Server架構(gòu)
? ? ? ? ?完整的MQTT協(xié)議包括兩部分,MQTT Client和MQTT Server,其中MQTT Server 也就是Broker用于接收來自客戶端的消息并轉(zhuǎn)發(fā)至目標(biāo)客戶端。???????????????????????????????????????????
1.MQTT Client
? ? ? ? ?只要設(shè)備基于MQTT協(xié)議連接了MQTT Broker ,就認(rèn)為這個(gè)設(shè)備是MQTT Client, MQTT Client 可以單獨(dú)作為發(fā)布者和訂閱者,也可以同時(shí)是發(fā)布者和訂閱者。
2.MQTT Broker
? ? ? ? ?MQTT Broker 是MQTT協(xié)議的核心,主要作用是接收發(fā)布者的消息,然后轉(zhuǎn)發(fā)給對(duì)應(yīng)的訂閱者。Broker可以對(duì)Clinet接入進(jìn)行授權(quán),并對(duì)Client進(jìn)行權(quán)限控制。
發(fā)布/訂閱模式
? ? ? ? ?MQTT是通過發(fā)布/訂閱模式實(shí)現(xiàn),由于發(fā)布方和訂閱方?jīng)]有直接聯(lián)系,所以需要一個(gè)中間方對(duì)消息進(jìn)行發(fā)布和存儲(chǔ),我們稱這個(gè)中間方為Broker,Broker 簡(jiǎn)單來說就是基于mqtt協(xié)議的server實(shí)現(xiàn)(github 上有很多開源實(shí)現(xiàn)),連接到Broker的發(fā)布方和訂閱方作為Client;
? ? ? ? ?信息的傳輸是通過主題(topic)管理的。發(fā)布者有需要分發(fā)的數(shù)據(jù)時(shí),其向連接的消息代理發(fā)送攜帶有數(shù)據(jù)的控制消息。代理會(huì)向訂閱此主題的客戶端分發(fā)此數(shù)據(jù)。發(fā)布者不需要知道訂閱者的數(shù)據(jù)和具體位置;同樣,訂閱者不需要配置發(fā)布者的相關(guān)信息。
? ? ? ? ?如果消息代理接受到某個(gè)主題上的消息,且這個(gè)主題沒有任何訂閱,那么代理就會(huì)丟棄之,除非發(fā)布者將其標(biāo)記為保留消息(retained message)。
? ? ? ? ?? ? ? ? ?發(fā)布方和訂閱方都建立了到Broker的TCP連接;
? ? ? ? ?? ? ? ? ?訂閱方告知Broker它要訂閱的Topic;
? ? ? ? ?? ? ? ? ?發(fā)布方將消息發(fā)送到Broker,并指定消息主題(Topic);
? ? ? ? ?? ? ? ? ?Broker接收到消息后,檢測(cè)哪些訂閱方訂閱了對(duì)應(yīng)的Topic,然后將消息發(fā)送到訂閱方;
? ? ? ? ?? ? ? ? ?訂閱方從Broker獲取消息;
? ? ? ? ?如果某個(gè)訂閱方處于離線狀態(tài),Broker可以先保存對(duì)應(yīng)的消息,當(dāng)訂閱方下次連接到Broker的時(shí)候,再將之前的消息發(fā)送給訂閱方;
? ? ? ? ?發(fā)布/訂閱模式解耦了發(fā)布消息的客戶(發(fā)布者)與訂閱消息的客戶(訂閱者)之間的關(guān)系,這意味著發(fā)布者和訂閱者之間并不需要直接建立聯(lián)系。?
這個(gè)模式有以下好處:
? ? ? ? ?? ? ? ? ?·?發(fā)布者與訂閱者只需要知道同一個(gè)消息代理即可;
? ? ? ? ?? ? ? ? ?·?發(fā)布者和訂閱者不需要直接交互;
? ? ? ? ?? ? ? ? ?·?發(fā)布者和訂閱者不需要同時(shí)在線。
? ? ? ? ?由于采用了發(fā)布/訂閱實(shí)現(xiàn),MQTT可以雙向通信。也就是說MQTT支持服務(wù)端反向控制設(shè)備,設(shè)備可以訂閱某個(gè)主題,然后發(fā)布者對(duì)該主題發(fā)布消息,設(shè)備收到消息后即可進(jìn)行一系列操作。