caoporn国产,亚州激情图,和最长的鸡吧毛片视频,三级片中文字幕免费网站

MQTT協(xié)議的連接和心跳相關(guān)內(nèi)容介紹

  • 時(shí)間 :2021-06-04
  • 作者 :佰馬科技
  • 瀏覽數(shù) :7307

本文介紹MQTT的連接(CONNECT)、心跳(PINGREQ/PINGRESP)、確認(rèn)(CONNACK)、斷開連接(DISCONNECT)四部分內(nèi)容。


CONNECT

MQTT v3.1.1有關(guān)字符串部分采用的修改版的UTF-8編碼,CONNECT可變頭部中協(xié)議名稱、消息體都是采用修改版的UTF-8編碼。下面是一個(gè)較為完整的CONNECT消息結(jié)構(gòu):


mqtt connect消息結(jié)構(gòu).jpg


協(xié)議變化

在MQTT 3.1.1中:

1、CONNECT消息可變頭部協(xié)議名稱MQIsdp被改為MQTT。

2、所有字符串明確規(guī)定使用UTF-8編碼,包括客戶端標(biāo)識符(Client Identifier)。

3、針對客戶端標(biāo)識符( client identifier)限制由原來的23個(gè)字節(jié)上限改為65535個(gè)字節(jié)。

4、CONNECT消息可變頭部協(xié)議版本號,由0x03變成了0x04 QoS 0類型PUBLISH消息DUP標(biāo)記必須被設(shè)置為0。

5、MQTT Over WebSocket 被定義,互聯(lián)網(wǎng)地址編碼分配機(jī)構(gòu)(Internet Assigned Numbers Authority)分配標(biāo)識符為mqtt。雖在MQTT 3.1規(guī)范通篇沒有提到WebSocket,但因其二進(jìn)制屬性可以很容易的在WebSocket通道傳輸。


術(shù)語變化

●  MQTT代理(MQTT Broker) -> MQTT服務(wù)器(MQTT Server)

●  消息ID(Message ID) -> 包ID(Packet ID)

●  消息類型(Message Type) -> 包類型(Packet Type)

●  主題路徑(Topic Paths) -> 主題名稱(Topic names

●  以前在固定頭部,現(xiàn)在在包類型中

●  0字節(jié)保留信息需要清除


可變頭部

協(xié)議名稱和協(xié)議版本都是固定的。


連接標(biāo)志(Connect Flags)

一個(gè)字節(jié)表示,除了第1位是保留未使用,其它7位都具有不同含義。業(yè)務(wù)上很重要,對消息總體流程影響很大,需要牢記。


Clean Session

0,表示如果訂閱的客戶機(jī)斷線了,要保存為其要推送的消息(QoS為1和QoS為2),若其重新連接時(shí),需將這些消息推送(若客戶端長時(shí)間不連接,需要設(shè)置一個(gè)過期值)。

1,斷線服務(wù)器即清理相關(guān)信息,重新連接上來之后,會再次訂閱。


Will Flag

定義了客戶端(沒有主動發(fā)送DISCONNECT消息)出現(xiàn)網(wǎng)絡(luò)異常導(dǎo)致連接中斷的情況下,服務(wù)器需要做的一些措施。

  簡而言之,就是客戶端預(yù)先定義好,在自己異常斷開的情況下,所留下的最后遺愿(Last Will),也稱之為遺囑(Testament)。 這個(gè)遺囑就是一個(gè)由客戶端預(yù)先定義好的主題和對應(yīng)消息,附加在CONNECT的可變頭部中,在客戶端連接出現(xiàn)異常的情況下,由服務(wù)器主動發(fā)布此消息。

  只有在Will Flag位為1時(shí),Will Qos和Will Retain才會被讀取,此時(shí)消息體payload中要出現(xiàn)Will Topic和Will Message具體內(nèi)容,否則,Will QoS和Will Retain值會被忽略掉。


Will Qos

兩位表示,和PUBLISH消息固定頭部的QoS level含義一樣。這里先略過,到PUBLISH消息再回過頭來看看,會更明白些。若標(biāo)識了Will Flag值為1,那么Will QoS就會生效,否則會被忽略掉。


Will Retain

如果設(shè)置Will Flag,Will Retain標(biāo)志就是有效的,否則它將被忽略。當(dāng)客戶端意外斷開服務(wù)器發(fā)布其Will Message之后,服務(wù)器是否應(yīng)該繼續(xù)保存。這個(gè)屬性和PUBLISH固定頭部的RETAIN標(biāo)志含義一樣,這里先略過。


User name 和 password Flag

用于授權(quán),兩者要么為0要么為1,否則都是無效。都為0,表示客戶端可自由連接/訂閱,都為1,表示連接/訂閱需要授權(quán)。


Payload/消息體

消息體定義的消息順序(如上表所示),約定俗成,不得更改,否則將可能引起混亂。

  若Will Flag值為0,那么在payload中,Client Identifer后面就不會存在Will Topic和Will Message內(nèi)容。

  若User Name和Password都為0,意味著Payload/消息體中,找不到User Name和password的值,就算有,也是無效。標(biāo)志決定著是否讀取與否。


心跳時(shí)間(Keep Alive timer)

以秒為單位,定義服務(wù)器端從客戶端接收消息的最大時(shí)間間隔。一般應(yīng)用服務(wù)會在業(yè)務(wù)層次檢測客戶端網(wǎng)絡(luò)是否連接,不是TCP/IP協(xié)議層面的心跳機(jī)制(比如開啟SOCKET的SO_KEEPALIVE選項(xiàng))。 一般來講,在一個(gè)心跳間隔內(nèi),客戶端發(fā)送一個(gè)PINGREQ消息到服務(wù)器,服務(wù)器返回PINGRESP消息,完成一次心跳交互,繼而等待下一輪。若客戶端沒有收到心跳反饋,會關(guān)閉掉TCP/IP端口連接,離線。 16位兩個(gè)字節(jié),可看做一個(gè)無符號的short類型值。最大值,2^16-1 = 65535秒 = 18小時(shí)。最小值可以為0,表示客戶端不斷開。一般設(shè)為幾分鐘,比如微信心跳周期為300秒。


Will Message編碼

Will Message在CONNECT Payload/息體中,使用UTF-8編碼。假設(shè)內(nèi)容為“abcd”,大概如下:


mqtt connect will message.jpg

注:PUBLISH的Payload/消息體中以二進(jìn)制編碼保存


在某一時(shí)間點(diǎn)客戶端異常關(guān)閉會觸發(fā)服務(wù)器PUBLISH此消息。那么服務(wù)器會直接把byte3-byte6之間字符取出,保存為二進(jìn)制,附加到PUBLISH消息體中,大概存儲如下:


mqtt publish will message.jpg


連接異常中斷通知機(jī)制

CONNECT消息一旦設(shè)置在可變頭部設(shè)置了Will flag標(biāo)記,那就啟用了Last-Will-And-Testament特性,此特性很贊。

  一旦客戶端出現(xiàn)異常中斷,便會觸發(fā)服務(wù)器發(fā)布Will Message消息到Will Topic主題上去,通知Will Topic訂閱者,對方因異常退出。



CONNACK

收到CONNECT消息之后,服務(wù)器應(yīng)該返回一個(gè)CONNACK消息作為響應(yīng):


若客戶端繞過CONNECT消息直接發(fā)送其它類型消息,服務(wù)器應(yīng)關(guān)閉此非法連接 若客戶端發(fā)送CONNECT之后未收到CONNACT,需要關(guān)閉當(dāng)前連接,然后重新連接


相同Client ID客戶端已連接到服務(wù)器,先前客戶端必須斷開連接后,服務(wù)器才能完成新的客戶端CONNECT連接 客戶端發(fā)送無效非法CONNECT消息,服務(wù)器需要關(guān)閉。


  一個(gè)完整的CONNACK消息大致如下:


connack.jpg


  可變頭部第一個(gè)字節(jié)為保留,無甚用處。第二個(gè)字節(jié)為連接握手返回碼:


connack response code.jpg


  只有0-5目前被使用到,其他值有待日后使用。一般返回值為0x00,表示連接建立。非法的請求,需要返回相應(yīng)的數(shù)值。


  從上面看出,一個(gè)CONNACK,四個(gè)字節(jié)表示。一個(gè)正常的CONNACK消息實(shí)際內(nèi)容可能如下:


0x20 0x02 0x00 0x00 

  

若是在私有協(xié)議中,兩個(gè)字節(jié)就足夠了。很多時(shí)候,客戶端和服務(wù)器端在沒有消息傳遞時(shí),會一直保持著連接。雖然不能依靠TCP心跳機(jī)制(比如SO_KEEPALIVE選項(xiàng)),業(yè)務(wù)層面定義心跳機(jī)制,會讓連接狀態(tài)檢測、控制更為直觀。



PINGREQ

由客戶端發(fā)送到服務(wù)器端,證明自己還在一直連接著呢。兩個(gè)字節(jié),固定值。


PINGREQ.jpg


  客戶端會在一個(gè)心跳周期內(nèi)發(fā)送一條PINGREQ消息到服務(wù)器端。心跳頻率在CONNECT可變頭部“Keep Alive Timer”中定義時(shí)間,單位為秒,無符號16位short表示。



PINGRESP

服務(wù)器收到PINGREQ請求之后,會立即響應(yīng)一個(gè)兩個(gè)字節(jié)固定格式的PINGRESP消息。


PINGRESP.jpg


  服務(wù)器一般若在1.5倍的心跳周期內(nèi)接收不到客戶端發(fā)送的PINGREQ,可考慮關(guān)閉客戶端的連接描述符。此時(shí)的關(guān)閉連接的行為和接收到客戶端發(fā)送DISCONNECT消息的處理行為一致,但對客戶端的訂閱不會產(chǎn)生影響(不會清除客戶端訂閱數(shù)據(jù)),這個(gè)需要牢記。


  若客戶端發(fā)送PINGREQ之后的一個(gè)心跳周期內(nèi)接收不到PINGRESP消息,可考慮關(guān)閉TCP/IP套接字連接。



DISCONNECT

客戶端主動發(fā)送到服務(wù)器端,表明即將關(guān)閉TCP/IP連接。此時(shí)要求服務(wù)器要完整、干凈的進(jìn)行斷開處理,不能僅僅類似于關(guān)閉連接描述符類似草草處理之。 需要兩個(gè)字節(jié),值固定。


DISCONNECT.jpg


  服務(wù)器要根據(jù)先前此客戶端在發(fā)送CONNECT消息可變頭部Connect flag中的“Clean session flag”所設(shè)置值。復(fù)習(xí)一下:


值為0,服務(wù)器必須在客戶端斷開之后繼續(xù)存儲/保持客戶端的訂閱狀態(tài)。這些狀態(tài)包括:

●  存儲訂閱的消息QoS1和QoS2消息

●  正在發(fā)送消息期間連接丟失導(dǎo)致發(fā)送失敗的消息。

●  以便當(dāng)客戶端重新連接時(shí)以上消息可以被重新傳遞。

●  值為1,服務(wù)器需要立刻清理連接狀態(tài)數(shù)據(jù)。


注意:服務(wù)器在接收到客戶端發(fā)送的DISCONNECT消息之后,需要主動關(guān)閉TCP/IP連接。


聯(lián)系我們
聯(lián)系我們

佰馬Baimatech,集M2M產(chǎn)品研發(fā)、IoT平臺服務(wù)、國際化運(yùn)營于一體,讓我們聯(lián)接,共創(chuàng)未來

国内精品久久久久久久久电影网| 好男人资源在线www免费| 欧美一区二区三区放荡人妇| 换着玩人妻hd中文字幕| 午夜福利久久久| 少妇高潮惨叫久久久久久| 五月天丁香| 亚洲插插插| 欧美一级免费黄片| 欧美禽狂配大交3d怪物| 日韩av高清在线| 色婷婷18禁| 国产欧美一区二区精品久久久| 男女xxoo| 色综合一区二区| 久久情| 日韩不卡一区| 久久久久亚洲av成人网热| 全部免费a级毛片| 综合激情五月综合激情五月激情1| 天堂草原影院电视剧在线| 午夜福利精品导航凹凸| 成人久久精品一区二区三区| 欧美黑人XXXX又粗又长| 久久66热人妻偷产精品| 国产午夜精品久久久久免费视| 无码色AV一二区在线播放| 亚洲成人中文字幕| 国产av人人夜夜澡人人爽麻豆| 99热| 久久久亚洲AV波多野结衣| 色悠久久久久综合网香蕉| 女人被狂躁的高潮免费视频| 免费网站看V片在线18禁无码| 亚洲精品色在线网站| 特大巨黑吊性xxxx| 欧美日本日韩AⅤ在线视频| yy6080久久亚洲精品| 鲁丝一区二区二区四区| 色婷婷亚洲婷婷七月中文字幕| 亚洲精品第一|