乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MQTT協(xié)議

       godfloo 2017-07-17
        MQTT Protocol
        MQTT協(xié)議特性
        一句話總結(jié):MQTT是一個簡單,輕量的消息發(fā)布/訂閱協(xié)議。
        MQTT報(bào)文結(jié)構(gòu)
        一個MQTT報(bào)文主要由三部分組成:固定報(bào)頭(Fix Header),可變報(bào)頭(Variable Header)和Payload。所有的報(bào)文都必須要有固定報(bào)頭,而可變報(bào)頭和Payload只有特定的消息才有。
        Structure
        Fix Header
        Fix Header使用一個Byte來標(biāo)識,其中高四位用于控制報(bào)文類型。所以,MQTT最多能夠表示16中報(bào)文類型。就目前v3.1.1版本來說,這4位并沒有完全占用,還有兩個保留值,分別是0和15。所以,目前MQTT有14種報(bào)文類型,下邊會展開介紹。下邊表格展示了每種報(bào)文類型其固定報(bào)頭的值:
        Control Packets
        Fix Header中低四位是標(biāo)志位(Flags),標(biāo)志位沒啥好說的,而且它們也基本是固定的,我們大概看下不同的報(bào)文對應(yīng)的標(biāo)志位的值:
        Fix Header
        Variable Header
        除了固定報(bào)頭,MQTT還制定了可變報(bào)頭??勺儓?bào)頭只存在于部分報(bào)文中,并且不同的報(bào)文類型其可變報(bào)頭也不一樣。比如PUBLISH(QoS > 0時), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK, UNSUBSCIBE,UNSUBACK這些報(bào)文擁有一個兩個字節(jié)長度的Package Identifier;CONNECT有四個可變報(bào)頭:Protocol Name,Protocol Level,Connect Flags,Keep Alive。
        Payload
        在可變報(bào)頭后,緊接著就是Payload。Payload也是部分報(bào)文擁有。比如PUBLISH,用它來存儲推送的消息內(nèi)容;CONNECT消息可用它來存儲用戶名密碼,SUBSCRIBE可用它來存儲訂閱的主題名,等等。像PINGREQ,PINGRESP,PUBACK等這些消息就沒有PAYLOAD。下表展示了不同消息其Payload的情況:
        Payload
        剩余長度 Remaining Length
        剩余長度是除了Fix Header以及剩余長度本身之外的報(bào)文大小。即剩余長度=可變報(bào)頭長度 Payload長度。MQTT規(guī)定用1~4個字節(jié)記錄報(bào)文的剩余長度。其中每個字節(jié)的最高位用來標(biāo)識是否有更多的數(shù)據(jù),這樣一個字節(jié)最大能表示數(shù)值128。4個字節(jié)是最大能表示268435455,也就是256M。
        MQTT報(bào)文概覽
        MQTT共有14種報(bào)文類型,這節(jié)主要介紹一下這些報(bào)文的作用。成對出現(xiàn)的報(bào)文會放在同一小節(jié)。
        CONNECT & CONNECTACK
        CONNECT是客戶端第一個發(fā)送的消息??蛻舳撕头?wù)器端建立TCP鏈接之后,應(yīng)立即發(fā)送CONNECT消息。如果一段時間內(nèi)客戶端沒有向服務(wù)端發(fā)送CONNECT消息,那么服務(wù)端應(yīng)斷開這個鏈接。服務(wù)端在收到CONNECT消息之后,應(yīng)回復(fù)CONNECTACK消息。CONNECTACK消息包含了鏈接是否成功建立,或者為什么沒有建立成功。
        CONNECT指令相對復(fù)雜,下邊我們詳細(xì)介紹一下它包含的各部分內(nèi)容。
        固定報(bào)頭
        fix_header_connect.png
        可變報(bào)頭
        可變報(bào)頭內(nèi)容較多,包含了以下四個字段:協(xié)議名(Protocol Name),協(xié)議級別(Protocol Leven),鏈接標(biāo)志(Connect Flags),保持鏈接(Keep Alive)。
        協(xié)議名是固定的,是以utf-8編碼的MQTT,如果服務(wù)端發(fā)現(xiàn)協(xié)議名稱不對,可以斷開當(dāng)前的鏈接,也可以繼續(xù)處理,但是不能按照MQTT協(xié)議處理該報(bào)文。
        協(xié)議級別也是固定的,對于MQTT 3.1.1是0x04。如果服務(wù)端接受到的客戶端協(xié)議版本太低,則返回當(dāng)前服務(wù)端不支持的協(xié)議級別,并斷開當(dāng)前鏈接。
        Connect Flags
        Connect Flags也包含了多種信息:
        connect_flags_connect.png
        第0位是固定的保留位,服務(wù)端會檢查這位是否為0,如果不是則斷開鏈接。
        第1位Clean Session,如果值為1的話表示服務(wù)端不會為客戶端保留任何Session信息。所以也不存在客戶端鏈接是恢復(fù)原有Session這一說。當(dāng)Clean Session為0時,如果服務(wù)端有與當(dāng)前Client關(guān)聯(lián)的Session,則基于當(dāng)前Session進(jìn)行通信;如果沒有則創(chuàng)建新的Session。
        我們看一下session都包含什么信息:
        客戶端的會話狀態(tài)包括:
        已經(jīng)發(fā)送給服務(wù)端,但是還沒有完成確認(rèn)的QoS 1和QoS 2級別的消息。
        已從服務(wù)端接收,但是還沒有完成確認(rèn)的QoS 2級別的消息。
        服務(wù)端的會話狀態(tài)包括:
        會話是否存在,即使會話狀態(tài)的其它部分都是空。
        客戶端的訂閱信息。
        已經(jīng)發(fā)送給客戶端,但是還沒有完成確認(rèn)的QoS 1和QoS 2級別的消息。
        即將傳輸給客戶端的QoS 1和QoS 2級別的消息。
        已從客戶端接收,但是還沒有完成確認(rèn)的QoS 2級別的消息。
        可選,準(zhǔn)備發(fā)送給客戶端的QoS 0級別的消息。
        遺囑
        Will包含三部分:Will Flag是否在意外斷開時發(fā)布遺囑消息;Will Qos 消息的服務(wù)等級;Will Retain,是否保留。
        什么情況下會發(fā)布遺囑消息:
        服務(wù)端檢測到了一個I/O錯誤或者網(wǎng)絡(luò)故障。
        客戶端在保持連接( Keep Alive) 的時間內(nèi)未能通訊。
        客戶端沒有先發(fā)送DISCONNECT報(bào)文直接關(guān)閉了網(wǎng)絡(luò)連接。
        由于協(xié)議錯誤服務(wù)端關(guān)閉了網(wǎng)絡(luò)連接。
        遺囑消息都是發(fā)生在服務(wù)端認(rèn)為客戶端與自己斷開了鏈接。遺囑存在的意義就是能夠讓其它客戶端及時的知道當(dāng)前鏈接已經(jīng)下線。
        Password和User Name
        第6,7位是Password和User Name Flag。這些都比較簡單,如果有的話在Payload中填寫相應(yīng)的值即可。
        說完CONNECT報(bào)文,我們來看一下CONNECTACK,CONNECT我們主要說兩個知識點(diǎn):鏈接返回碼,會話。
        鏈接返回碼
        連接返回碼由可變報(bào)頭的第二個字節(jié)表示。
        return_code.png
        Session Present
        CONNECTACK的的一個字節(jié)是Connect Acknowledge Flags(鏈接確認(rèn)標(biāo)志)。鏈接確認(rèn)標(biāo)志的第0位是Session Present。如果CONNECT的CleanSession標(biāo)志設(shè)置為1,SessionPresent需設(shè)置為0。如果Clean Session設(shè)置為0,如果服務(wù)端有關(guān)于當(dāng)前Client的Session,則Session Present設(shè)置為1,否則設(shè)置為0。
        PUBLISH & PUBACK
        PUBLISH用于客戶端,服務(wù)端之間的消息推送。PUBACK是一方收到PUBLISH之后向另一方發(fā)送應(yīng)答消息。下面我們先解釋一下PUBLISH消息。
        固定報(bào)頭
        publish-fix-header
        然后publish是四個標(biāo)識位,由低到高分別是:Retain(消息是否保留),QoS(消息質(zhì)量等級),DUP(是否是舊報(bào)文重發(fā))。
        QoS
        QoS標(biāo)識消息的服務(wù)級別,MQTT規(guī)定了三種消息服務(wù)級別:
        QoS 0:Fire and Forgot;
        QoS 1:At Least Once;
        QoS 2:Exectly Once。其中QoS2是最級別的協(xié)議。它需要經(jīng)過兩次服務(wù)端與客戶端的通信才能完成: PUBLISH <-> PUBREC,PUBREL <-> PUBCOMP
        實(shí)際應(yīng)用中根據(jù)自己的應(yīng)用特點(diǎn)選擇不同的服務(wù)級別即可。
        Retain
        如果客戶端發(fā)送的retain標(biāo)識為1,則服務(wù)端必須保存該條消息以及它的QoS。以便這個topic有新的訂閱者訂閱時,服務(wù)端要把這個消息推送給它。使用Retain的好處就是新的訂閱者訂閱成功之后便能得到最近的一條消息,無需等到下次產(chǎn)生消息時。
        注意在協(xié)議文檔中說道:When a new subscription is established, the last retained message, if any, on each matching topic name MUST be sent to the subscriber.。所以,每個retain 消息都會覆蓋上一條,把這條消息最為最新保留消息。
        如果服務(wù)器收到發(fā)送retain為true,payload為空的消息,它會把這個topic保留的retain消息刪除。
        如果服務(wù)器收到的 QoS 0 消息的保留標(biāo)志設(shè)置為 1, 則它必須丟棄以前為該主題保留的任何消息。它應(yīng)該將新的 QoS 0 消息存儲為該主題的新保留消息, 但在任何時候都可以選擇丟棄它, 如果發(fā)生這種情況, 該主題將不會有保留消息。
        可變報(bào)頭
        報(bào)頭包含了Topic Name和Packet Identifier。當(dāng)QoS為1或2時Packaet Identifier才有,Packet Identifier可以重復(fù)利用,只要消息被確認(rèn)它的Packet Identifier便可被其他消息使用。Packet Identifier最大占用兩位,最大數(shù)值65536。
        PUBLISH & PUBREC & PUBREL & PUBLCOMP
        如果QoS等級為2的話客戶端和服務(wù)端要經(jīng)過兩個來回的通信過程:PUBLISH <-> PUBREC,PUBREL <-> PUBCOMP。這樣可以實(shí)消息Exactly Once推送。
        SUBSCRIBE & SUBACK
        SUBSCRIBE表示客戶端向服務(wù)端訂閱訂閱感興趣的一個或多個主題。服務(wù)端會維護(hù)主題和訂閱關(guān)系,如果多個客戶端訂閱了同一個主題,其中任何一個客戶端發(fā)送消息時,服務(wù)端需要把這個消息PUBLISH給其他訂閱客戶端。當(dāng)服務(wù)端收到SUBSCRIBE時它會立即回復(fù)SUBACK。
        UNSUBSCRIBE & UNSUBACK
        這兩個消息用于取消訂閱和取消訂閱確認(rèn)。
        PINGREQ & PINGRESP
        PINGREQ,PINGRESP是客戶端和服務(wù)端之間的心跳檢測。在CONNECT命令里,會設(shè)置keepalive時間,如果在keepalive 1.5倍時間內(nèi)服務(wù)端沒有收到任何客戶端消息則會把該客戶端強(qiáng)制斷開。因此如果客戶端在沒有其它消息向服務(wù)端發(fā)送時,應(yīng)該定時在合理的時間內(nèi)向服務(wù)器發(fā)送PINGREQ指令。服務(wù)端收到該指令后會回復(fù)PINGRESP。客戶端如果在合理的時間內(nèi)沒有收到響應(yīng)則應(yīng)關(guān)閉鏈接。
        DISCONNECT
        這是客戶端發(fā)送給服務(wù)端的最后一個命令。在發(fā)送了這個命令之后客戶端應(yīng)該立即斷開鏈接,并且不能通過這個鏈接再發(fā)送任何消息。服務(wù)端在收到這個消息之后,刪除與當(dāng)前鏈接關(guān)聯(lián)的未發(fā)布的遺囑消息,如果客戶端還沒斷開鏈接,服務(wù)端關(guān)閉鏈接。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多