MQTT協(xié)議詳解非常易懂1_第1頁(yè)
MQTT協(xié)議詳解非常易懂1_第2頁(yè)
MQTT協(xié)議詳解非常易懂1_第3頁(yè)
MQTT協(xié)議詳解非常易懂1_第4頁(yè)
MQTT協(xié)議詳解非常易懂1_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第頁(yè)MQTT協(xié)議詳解,非常易懂http://blog.csdn/y281252548/article/details/506849852019協(xié)議地址:http://public.dhe.ibm/software/dw/webservices/ws-mqtt/mqtt-v3r1.html當(dāng)然也有PDF版的,百度一下,不過(guò)個(gè)人感覺(jué)不是官網(wǎng)上的字體和排版最舒服。那么這個(gè)協(xié)議是用做什么或有什么特色呢?下面是上的首段介紹:Itwasdesignedasanextremelylightweightpublish/subscribemessagingtransport.Itisusefulforconnectionswithremotelocationswhereasmallcodefootprintisrequiredand/ornetworkbandwidthisatapremium.Forexample,ithasbeenusedinsensorscommunicatingtoabrokerviasatellitelink,overoccasionaldial-upconnectionswithhealthcareproviders,andinarangeofhomeautomationandsmalldevicescenarios.Itisalsoidealformobileapplicationsbecauseofitssmallsize,lowpowerusage,minimiseddatapackets,andefficientdistributionofinformationtooneormanyreceiversMQTT是輕量級(jí)基于代理的發(fā)布/訂閱的消息傳輸協(xié)議,它可以通過(guò)很少的代碼和帶寬和遠(yuǎn)程設(shè)備連接。例如通過(guò)衛(wèi)星和代理連接,通過(guò)撥號(hào)和醫(yī)療保健提供者連接,以及在一些自動(dòng)化或小型設(shè)備上,而且由于小巧,省電,協(xié)議開(kāi)銷(xiāo)小和能高效的向一和多個(gè)接收者傳遞信息,故同樣適用于稱(chēng)動(dòng)應(yīng)用設(shè)備上。相信在想深入學(xué)習(xí)這協(xié)議必是奔著解決某個(gè)問(wèn)題而來(lái)的,上面給出了適用的場(chǎng)景,我之所以想深入的學(xué)習(xí)和了解這個(gè)協(xié)議,理由如下:1、可以實(shí)現(xiàn)手機(jī)消息推送(PUSH)2、協(xié)議簡(jiǎn)單,最小的頭部只需2個(gè)字節(jié),特別適合于嵌入式中。3、這是個(gè)了解什么是協(xié)議絕好的例子。相比于其它復(fù)雜的協(xié)議例如tcp,http協(xié)議,至少說(shuō)明文檔看的下去。在這里,我以推送為例子說(shuō)明,雖然現(xiàn)在現(xiàn)成的推送解決方案已經(jīng)比較成熟,但是這個(gè)RepeatReInventtheWhell還是要做一下,什么都是拿來(lái)主義,和搬運(yùn)工有什么區(qū)別。一、需要的環(huán)境:1、PHP+Apache或Nginx2、安裝開(kāi)源代理程序Mosquitto,這里用其做為代理服務(wù)器,負(fù)責(zé)連接和分發(fā)。安裝方法很簡(jiǎn)單,/files/binary是編譯好的,source是源碼安裝需要的(make&makeinstall就行)唯一要配置的就是在解壓后的config.mk,安裝完后設(shè)置文件是mosquitto.conf當(dāng)然主要是設(shè)置是否支持ssl,還有就是config.mk最下面的安裝位置的設(shè)定。這里一切默認(rèn)。默認(rèn)啟動(dòng)是綁定的IP是本地IP,端口是1883可以在mosquitto.conf里設(shè)置(要去掉前面的#字注釋?zhuān)?,linux中-c可以指定設(shè)置文件并運(yùn)行比如:mosquitto-c/etc/mosquitto.conf二、協(xié)議初解先說(shuō)一下整個(gè)協(xié)議的構(gòu)造,整體上協(xié)議可拆分為:固定頭部+可變頭部+消息體協(xié)議說(shuō)白了就是對(duì)于雙方通信的一個(gè)約定,比如傳過(guò)來(lái)一段字符流,第1個(gè)字節(jié)表示什么,第2個(gè)字節(jié)表示什么。。。。一個(gè)約定。所以在固定頭部的構(gòu)造如下:1、MessageType(0和15保留,共占4個(gè)字節(jié))[php]viewplaincopypublic$operations=array("MQTT_CONNECT"=>1,//請(qǐng)求連接"MQTT_CONNACK"=>2,//請(qǐng)求應(yīng)答"MQTT_PUBLISH"=>3,//發(fā)布消息"MQTT_PUBACK"=>4,//發(fā)布應(yīng)答"MQTT_PUBREC"=>5,//發(fā)布已接收,保證傳遞1"MQTT_PUBREL"=>6,//發(fā)布釋放,保證傳遞2"MQTT_PUBCOMP"=>7,//發(fā)布完成,保證傳遞3"MQTT_SUBSCRIBE"=>8,//訂閱請(qǐng)求"MQTT_SUBACK"=>9,//訂閱應(yīng)答"MQTT_UNSUBSCRIBE"=>10,//取消訂閱"MQTT_UNSUBACK"=>11,//取消訂閱應(yīng)答"MQTT_PINGREQ"=>12,//ping請(qǐng)求"MQTT_PINGRESP"=>13,//ping響應(yīng)"MQTT_DISCONNECT"=>14//斷開(kāi)連接);2、DUPflag其是用來(lái)在保證消息傳輸可靠的,如果設(shè)置為1,則在下面的變長(zhǎng)頭部里多加MessageId,并需要回復(fù)確認(rèn),保證消息傳輸完成,但不能用于檢測(cè)消息重復(fù)發(fā)送。3、Qos主要用于PUBLISH(發(fā)布態(tài))消息的,保證消息傳遞的次數(shù)。00表示最多一次即<=101表示至少一次即>=110表示一次,即==111保留后用4、Retain主要用于PUBLISH(發(fā)布態(tài))的消息,表示服務(wù)器要保留這次推送的信息,如果有新的訂閱者出現(xiàn),就把這消息推送給它。如果不設(shè)那么推送至當(dāng)前訂閱的就釋放了。5、固定頭部的byte2是用來(lái)保存接下去的變長(zhǎng)頭部+消息體的總大小的。但是不是并不是直接保存的,同樣也是可以擴(kuò)展的,其機(jī)制是,前7位用于保存長(zhǎng)度,后一部用做標(biāo)識(shí)。我舉個(gè)例了,即如果計(jì)算出后面的大小為0<length<=127的,正常保存如果是127<length<16383的,則需要二個(gè)字節(jié)保存了,將第一個(gè)字節(jié)的最大的一位置1,表示未完。然后第二個(gè)字節(jié)繼續(xù)存。拿130來(lái)說(shuō),第一個(gè)字節(jié)存10000011,第二個(gè)字節(jié)存000000001,也就是0x83,0x01,把兩個(gè)字節(jié)連起來(lái)看,第二個(gè)字節(jié)權(quán)重從2的8次開(kāi)始。同起可以加第3個(gè)字節(jié),最多可以加至第4個(gè)字節(jié)。故MQTT協(xié)議最多可以實(shí)現(xiàn)268435455(0xFF,0xFF,0xFF,0x7F)將近256M的數(shù)據(jù)。可謂能伸能縮。可變頭部這個(gè)是可變頭部的全貌。1、首先最上面的8個(gè)字節(jié)是ProtocolName(編碼名),UTF編碼的字符“MQIsdp”,頭兩個(gè)是編碼名提長(zhǎng)為6。這里多說(shuō)一些,接下去的協(xié)議多采用這種方式組合,即頭兩個(gè)字節(jié)表示下一部分的長(zhǎng),然后后面跟上內(nèi)容。這里頭兩個(gè)字節(jié)長(zhǎng)為6,下面跟6個(gè)字符“MQIsdp”。2、ProtocolVersion,協(xié)議版本號(hào),v3也是固定的。3、ConnectFlag,連接標(biāo)識(shí),有點(diǎn)像固定頭部的。8位分別代表不同的標(biāo)志。第1個(gè)字節(jié)保留。CleanSession,Willflag,WillQos,WillRetain都是相對(duì)于CONNECT消息來(lái)說(shuō)的。CleanSession:0表示如果訂閱的客戶(hù)機(jī)斷線了,那么要保存其要推送的消息,如果其重新連接時(shí),則將這些消息推送。1表示消除,表示客戶(hù)機(jī)是第一次連接,消息所以以前的連接信息。WillFlag,表示如果客戶(hù)機(jī)在不是在發(fā)送DISCONNECT消息中斷,比如IO錯(cuò)誤等,將些置為1,要求重傳。并且下且的WillQos和WillRetain也要設(shè)置,消息體中的Topic和MessageID也要設(shè)置,就是表示發(fā)生了錯(cuò)誤,要重傳。WillQos,在CONNECT非正常情況下設(shè)置,一般如果標(biāo)識(shí)了WillFlag,那么這個(gè)位置也要標(biāo)識(shí)。WillRETAIN:同樣在CONNECT中,如果標(biāo)識(shí)了WillFlag,那么些位也一定要標(biāo)識(shí)usenameflag和passwordflag,用來(lái)標(biāo)識(shí)是否在消息體中傳遞用戶(hù)和密碼,只有標(biāo)識(shí)了,消息體中的用戶(hù)名和密碼才用效,只標(biāo)記密碼而不標(biāo)記用戶(hù)名是不合法的。4、KeepAlive,表示響應(yīng)時(shí)間,如果這個(gè)時(shí)間內(nèi),連接或發(fā)送操作未完成,則斷開(kāi)tcp連接,表示離線。5、ConnectReturnCode即通常于CONNACK消息中,表示返回的連接情況,我可以通過(guò)此檢驗(yàn)連接情況。6、TopicName,訂閱消息標(biāo)識(shí),MQTT是基于訂閱/發(fā)布的消息,那么這個(gè)就是消息訂閱的標(biāo)識(shí),像新聞客戶(hù)端里的訂閱不同的欄目一樣。用于區(qū)別消息的推送類(lèi)別。主要用于PUBLISH和SUBSCRIBE中。最大可支持32767個(gè)字符,即4個(gè)字節(jié)。消息體(PayLoad)只有3種消息有消息體CONNECT,SUBSCRIBE,SUBACKCONNECT主要是客戶(hù)機(jī)的ClientID,訂閱的Topic和Message以及用戶(hù)名和密碼,其于變長(zhǎng)頭部中的will是對(duì)應(yīng)的。SUBSCRIBE是包含了一系列的要訂閱的主題以及QOS。SUBACK是用服務(wù)器對(duì)于SUBSCRIBE所申請(qǐng)的主題及QOS進(jìn)行確認(rèn)和回復(fù)。而PU

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論