最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 2-1 QoS 服務(wù)質(zhì)量等級(jí)

2020-12-05 18:21 作者:太極創(chuàng)客  | 我要投稿

為了幫助您學(xué)習(xí),我們專門為本教程制作了視頻。

什么是MQTT服務(wù)質(zhì)量?

在之前的課程里我們提到過,一個(gè)物聯(lián)網(wǎng)系統(tǒng)中有些信息非常重要,我們需要確保這類重要信息可以準(zhǔn)確無誤的發(fā)送和接收,而有些信息則相對(duì)不那么重要,這類信息如果在傳輸中丟失不會(huì)影響系統(tǒng)的運(yùn)行。

MQTT服務(wù)質(zhì)量(Quality of Service 縮寫 QoS)正是用于告知物聯(lián)網(wǎng)系統(tǒng),哪些信息是重要信息需要準(zhǔn)確無誤的傳輸,而哪些信息不那么重要,即使丟失也沒有問題。

MQTT協(xié)議有三種服務(wù)質(zhì)量級(jí)別:

QoS = 0 – 最多發(fā)一次
QoS = 1 – 最少發(fā)一次
QoS = 2 – 保證收一次

以上三種不同的服務(wù)質(zhì)量級(jí)別意味著不同的MQTT傳輸流程。對(duì)于較為重要的MQTT消息,我們通常會(huì)選擇QoS>0的服務(wù)級(jí)別(即QoS 為1或2)。

另外這里提到的“發(fā)”與“收”有兩種可能。一種是客戶端發(fā)布消息時(shí),將消息發(fā)送給服務(wù)端。一種是客戶端訂閱了某一主題消息后,服務(wù)端將消息發(fā)送給客戶端。因此發(fā)布消息和接收消息的可能是服務(wù)端也可能是客戶端。

為了避免為您造成混淆,我們?cè)诒竟?jié)教程后面的描述中將使用“發(fā)送端”來描述發(fā)送MQTT消息的設(shè)備,而使用“接收端”來描述接收MQTT消息的設(shè)備。

接下來我們仔細(xì)看一下這三種服務(wù)質(zhì)量級(jí)別的具體含義。



QoS = 0 – 最多發(fā)一次

0是服務(wù)質(zhì)量QoS的最低級(jí)別。當(dāng)QoS為0級(jí)時(shí),MQTT協(xié)議并不保證所有信息都能得以傳輸。也就是說,QoS=0的情況下,MQTT服務(wù)端和客戶端不會(huì)對(duì)消息傳輸是否成功進(jìn)行確認(rèn)和檢查。消息能否成功傳輸全看網(wǎng)絡(luò)環(huán)境是否穩(wěn)定。

也就是說,在QoS為0時(shí)。發(fā)送端一旦發(fā)送完消息后,就完成任務(wù)了。發(fā)送端不會(huì)檢查發(fā)出的消息能否被正確接收到。

在網(wǎng)絡(luò)環(huán)境穩(wěn)定的情況下,信息傳輸一般是不會(huì)出現(xiàn)問題的。但是在環(huán)境不穩(wěn)定的情況下,可能會(huì)在傳輸過程中出現(xiàn)MQTT消息丟失的情況。

QoS = 1 – 最少發(fā)一次

當(dāng)QoS級(jí)別為1時(shí),發(fā)送端在消息發(fā)送完成后,會(huì)檢查接收端是否已經(jīng)成功接收到了消息。但是發(fā)送端是如何實(shí)現(xiàn)這一檢查的呢?請(qǐng)看下圖:

發(fā)送端將消息發(fā)送給接收端后,會(huì)等待接收端的確認(rèn)。接收端成功接收消息后,會(huì)發(fā)送一條確認(rèn)報(bào)文PUBACK給發(fā)送端。如果發(fā)送端收到了這條PUBACK確認(rèn)報(bào)文,那么它就知道消息已經(jīng)成功接收。

PUBACK 報(bào)文

假如過了一段時(shí)間后,發(fā)送端沒有收到PUBACK報(bào)文,那么發(fā)送端會(huì)再次發(fā)送消息,然后再次等待接收端的PUBACK確認(rèn)報(bào)文。因此,當(dāng)QoS=1時(shí),發(fā)送端在沒有收到接收端的PUBACK確認(rèn)報(bào)文以前,會(huì)重復(fù)發(fā)送同一條消息。

所以QoS = 1時(shí),每一條消息都至少傳輸一次。

另外請(qǐng)您回憶一下PUBLISH報(bào)文的內(nèi)容。

MQTT PUBLISH 報(bào)文 dupFlag 設(shè)置為 true

當(dāng)發(fā)送端重復(fù)發(fā)送一條消息時(shí),PUBLISH報(bào)文中的dupFlag會(huì)被設(shè)置為True(如上圖黑色橫線所標(biāo)注的部分)。這是為了告訴接收端,此消息為重復(fù)發(fā)送的消息。

QoS = 2 – 保證收一次

MQTT服務(wù)質(zhì)量最高級(jí)是2級(jí),即QoS = 2。當(dāng)MQTT服務(wù)質(zhì)量為2級(jí)時(shí),MQTT協(xié)議可以確保接收端只接收一次消息。

如下圖所示,QoS=2的收發(fā)相對(duì)更加復(fù)雜。發(fā)送端需要接收端進(jìn)行兩次消息確認(rèn)。因此,2級(jí)MQTT服務(wù)質(zhì)量是最安全的服務(wù)級(jí)別,也是最慢的服務(wù)級(jí)別。

下面我們來分步看一下Q0S=2時(shí)的消息發(fā)送和接收基本流程。

MQTT QoS2 PUBLISH
MQTT QoS2 PUBREC

接收端收到QoS為2的消息后,會(huì)返回PUBREC報(bào)文作為應(yīng)答。

MQTT QoS2 PUBREL

發(fā)送端收到PUBREC報(bào)文后,會(huì)把此報(bào)文進(jìn)行存儲(chǔ),并且返回PUBREL報(bào)文作為應(yīng)答。

MQTT QoS2 PUBCOMP

當(dāng)接收端收到PUBREL報(bào)文后,會(huì)應(yīng)答發(fā)送端一條PUBCOMP報(bào)文。至此,一次QoS2的MQTT消息傳輸就結(jié)束了。

以上是QoS=2時(shí)的MQTT通訊基本過程。這里我們只給您列出了基本流程,而沒有過多的講解MQTT協(xié)議是如何控制接收端只接收一次消息。這么做是因?yàn)楸窘坛痰闹攸c(diǎn)是MQTT應(yīng)用。關(guān)于QoS=2的MQTT服務(wù)端內(nèi)部控制機(jī)制,我們?cè)趯?shí)際開發(fā)MQTT物聯(lián)網(wǎng)的過程中是不會(huì)涉及到的。

所以您只需要牢記一點(diǎn),那就是QoS=2可以保證接收端只收一次消息。

設(shè)置QoS

了解了QoS的含義后,我們?cè)撊绾卧贛QTT通訊中設(shè)置QoS呢?下面我們來分別講解客戶端在發(fā)布消息和訂閱消息時(shí)如何設(shè)置QoS。

發(fā)布消息

如下圖所示,客戶端發(fā)布信息時(shí),PUBLISH數(shù)據(jù)包中專有一個(gè)信息為qos。該信息正是用于設(shè)置客戶端發(fā)布MQTT消息的QoS等級(jí)。

MQTT Publish QoS

訂閱消息

同樣的,在客戶端訂閱MQTT主題時(shí),SUBSCRIBE數(shù)據(jù)包中也同樣有一個(gè)信息用于設(shè)置訂閱主題的QoS級(jí)別。客戶端正是通過該主題來設(shè)置訂閱主題的QoS級(jí)別的。

換句話說,無論是發(fā)布(PUBLISH)還是訂閱(SUBSCRIBE),都可以使用數(shù)據(jù)包中的qos消息設(shè)置服務(wù)質(zhì)量級(jí)別。

接收端連接服務(wù)端

另外,要想實(shí)現(xiàn)QoS>0的MQTT通訊,客戶端在連接服務(wù)端時(shí)必須要將cleanSession設(shè)置為false。如果這一步?jīng)]有實(shí)現(xiàn),那么客戶端是無法實(shí)現(xiàn)QoS>0的MQTT通訊。這一點(diǎn)非常關(guān)鍵,請(qǐng)您務(wù)必要留意。

MQTT-QoS-cleanSession-false


服務(wù)質(zhì)量降級(jí)

講到這里,不知道有沒有朋友會(huì)感到好奇。假如客戶端在發(fā)布和訂閱信息時(shí)使用不同級(jí)別的QoS,將會(huì)發(fā)生什么情況呢。如下圖所示,假如客戶端A發(fā)布到主題1的消息是采用QoS = 2,然而客戶端B訂閱主題1采用QoS = 1。那么服務(wù)端該如何來應(yīng)對(duì)這一情況呢?

MQTT-QoS-設(shè)置-1

在這種情況下,服務(wù)端會(huì)使用較低級(jí)別來提供服務(wù)。如下圖所示,雖然A發(fā)送到主題1的消息采用QoS為2,但是服務(wù)端發(fā)送主題1的消息給B時(shí),采用的QoS為1。這是因?yàn)锽在訂閱主題1時(shí)采用的QoS為1。

MQTT-QoS-設(shè)置-2

下面我們?cè)賮砜匆环N情況。

如下圖所示,假如客戶端A發(fā)布主題1消息時(shí)使用QoS為0,而客戶端B訂閱主題1消息時(shí)使用QoS為1。

MQTT-QoS-設(shè)置

在這種情況下,雖然客戶端B訂閱主題1消息時(shí)QoS為1,但是由于客戶端A發(fā)送主題1消息時(shí)QoS為0,所以服務(wù)端發(fā)送消息給B的QoS為0。

MQTT-QoS-設(shè)置

通過以上兩個(gè)示例我們可以看到。對(duì)于發(fā)布和訂閱消息的客戶端,服務(wù)端會(huì)主動(dòng)采用較低級(jí)別的QoS來實(shí)現(xiàn)消息傳輸。

QoS=1通訊時(shí)的注意事項(xiàng)

如想在MQTT通訊中實(shí)現(xiàn)服務(wù)質(zhì)量等級(jí)為1級(jí)(QoS=1),我們要分別對(duì)消息的發(fā)布端課接收端進(jìn)行相應(yīng)的設(shè)置。以下列表中的內(nèi)容是具體需要采取的措施。

  • 接收端連接服務(wù)端時(shí)cleanSession設(shè)置為false

  • 接收端訂閱主題時(shí)QoS=1

  • 發(fā)布端發(fā)布消息時(shí)QoS=1

QoS=2通訊時(shí)的注意事項(xiàng)

如想在MQTT通訊中實(shí)現(xiàn)服務(wù)質(zhì)量等級(jí)為2級(jí)(QoS=2),我們要分別對(duì)消息的發(fā)布端和接收端進(jìn)行相應(yīng)的設(shè)置。以下列表中的內(nèi)容是具體需要采取的措施。

  • 接收端連接服務(wù)端時(shí)cleanSession設(shè)置為false

  • 接收端訂閱主題時(shí)QoS=2

  • 發(fā)布端發(fā)布消息時(shí)QoS=2

小結(jié)

  • 若想實(shí)現(xiàn)QoS>0,訂閱端連接服務(wù)端時(shí)cleanSession需要設(shè)置為false,訂閱端訂閱主題時(shí)QoS>0,發(fā)布端發(fā)布消息時(shí)的QoS>0。

  • 服務(wù)端會(huì)選擇發(fā)布消息和訂閱消息中較低的QoS來實(shí)現(xiàn)消息傳輸,這也被稱作“服務(wù)降級(jí)”。

  • QoS = 0, 占用的網(wǎng)絡(luò)資源最低,但是接收端可能會(huì)出現(xiàn)無法接收消息的情況,所以適用于傳輸重要性較低的信息。

  • QoS = 1,? MQTT會(huì)確保接收端能夠接收到消息,但是有可能出現(xiàn)接收端反復(fù)接收同一消息的情況。

  • QoS = 2, MQTT會(huì)確保接收端只接收到一次消息。但是QoS為2時(shí)消息傳輸最慢,另外消息傳輸需要多次確認(rèn),因此所占用的網(wǎng)絡(luò)資源也是最多的。此類服務(wù)等級(jí)適用于重要消息傳輸。

  • 由于QoS1和QoS2都能確??蛻舳私邮盏较?,但是QoS1所占用的資源較QoS2占用資源更小。因此建議使用QoS1來實(shí)現(xiàn)網(wǎng)絡(luò)資源較為珍貴的環(huán)境下傳輸重要信息。

假如您也喜歡太極創(chuàng)客,希望您將本文“分享”給更多的人,讓更多朋友認(rèn)識(shí)我們。您的每一份點(diǎn)贊與投幣,都是對(duì)我們最溫暖的鼓勵(lì)與支持。

本文編輯制作:CYNO朔 (https://space.bilibili.com/415252426/)

【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 2-1 QoS 服務(wù)質(zhì)量等級(jí)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
廉江市| 长寿区| 农安县| 巴林左旗| 星子县| 民权县| 驻马店市| 平和县| 牡丹江市| 晋州市| 广平县| 大石桥市| 灌南县| 河北区| 迁西县| 香港| 丹棱县| 玉溪市| 贡嘎县| 噶尔县| 太白县| 南部县| 韶山市| 永济市| 汽车| 岑巩县| 南丹县| 桦川县| 拉萨市| 延安市| 昭平县| 益阳市| 元朗区| 绥化市| 兴山县| 云南省| 枣庄市| 武隆县| 文成县| 乐平市| 柘城县|