五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 1-3 連接MQTT服務(wù)端

2020-11-15 14:24 作者:太極創(chuàng)客  | 我要投稿

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

如需閱讀本系列教程完整內(nèi)容,歡迎前往本教程配套專欄文章文集

https://member.bilibili.com/platform/text-read-list?id=337632

MQTT客戶端之間要想實(shí)現(xiàn)通訊,必須要通過MQTT服務(wù)端。因此MQTT客戶端無論是發(fā)布消息還是訂閱消息,首先都要連接MQTT服務(wù)端。下面我們看一下MQTT客戶端連接服務(wù)端的詳細(xì)過程。

MQTT客戶端連接服務(wù)端一共有兩步。

1 首先MQTT客戶端將會(huì)向服務(wù)端發(fā)送連接請(qǐng)求。該請(qǐng)求實(shí)際上是一個(gè)包含有連接請(qǐng)求信息的數(shù)據(jù)包。這個(gè)數(shù)據(jù)包的官方名稱為CONNECT。

2 MQTT服務(wù)端收到客戶端連接請(qǐng)求后,會(huì)向客戶端發(fā)送連接確認(rèn)。同樣的,該確認(rèn)也是一個(gè)數(shù)據(jù)包。這個(gè)數(shù)據(jù)包官方名稱為CONNACK。

以上就是MQTT客戶端在連接服務(wù)端的兩步操作。接下來,我們一起來了解一下客戶端在連接服務(wù)端時(shí)所發(fā)送的CONNECT報(bào)文內(nèi)容。

CONNECT – 連接服務(wù)端

在上面的描述中我們看到。MQTT客戶端要想連接服務(wù)端,首先要向服務(wù)端發(fā)送CONNECT報(bào)文。如果此CONNECT報(bào)文的格式或內(nèi)容不符合MQTT規(guī)范,則服務(wù)器會(huì)拒絕客戶端的連接請(qǐng)求。

下圖是CONNECT報(bào)文所包含的信息內(nèi)容。

MQTT CONNECT 報(bào)文內(nèi)容

在接下來的課程講解中我們將會(huì)頻繁接觸到兩個(gè)概念。第一個(gè)概念是報(bào)文,第二個(gè)概念是信息

所謂報(bào)文就是一個(gè)MQTT數(shù)據(jù)包。這個(gè)數(shù)據(jù)包中可能包含有多個(gè)信息。比如以上圖片就是描繪了一個(gè)CONNECT報(bào)文(數(shù)據(jù)包)的詳細(xì)內(nèi)容。

在這個(gè)CONNECT報(bào)文(數(shù)據(jù)包)中包含有多個(gè)信息。上圖左側(cè)欄中的內(nèi)容是CONNECT報(bào)文所包含的信息名稱。右側(cè)是信息的具體內(nèi)容。如上圖示例中,此CONNECT報(bào)文包含有名稱為clientId的信息,該信息的內(nèi)容是”client-1″。當(dāng)然,上圖只是一個(gè)示例,不是所有的CONNECT報(bào)文中的clientId信息內(nèi)容都是”client-1″。

另外也請(qǐng)注意,上圖中有些信息名稱旁邊標(biāo)注了“可選”字樣,而有些則沒有。那些沒有標(biāo)注“可選”字樣的信息是必須包含在CONNECT報(bào)文中的。而對(duì)于標(biāo)注了“可選”字樣的信息,CONNECT報(bào)文既可以包含它們也可以沒有它們。

考慮到我們剛剛開始接觸MQTT協(xié)議,目前我們先從最基礎(chǔ)的內(nèi)容開始學(xué)起。那么在本節(jié)課程里,我們只講解未標(biāo)注“可選”字樣的信息以及它們的功能。在后續(xù)的課程里,我們會(huì)詳細(xì)講解標(biāo)有“可選”字樣的信息。

clientId – 客戶端ID

ClientId是MQTT客戶端的標(biāo)識(shí)。MQTT服務(wù)端用該標(biāo)識(shí)來識(shí)別客戶端。因此ClientId必須是獨(dú)立的。如果兩個(gè)MQTT客戶端使用相同ClientId標(biāo)識(shí),服務(wù)端會(huì)把它們當(dāng)成同一個(gè)客戶端來處理。通常ClientId是由一串字符所構(gòu)成的,如上圖所示,此示例中的clientID是“client-1”。

cleanSession – 清除會(huì)話

所謂“清除會(huì)話”這一翻譯源自MQTT官方文檔中文版。要說明cleanSession的具體含義,首先要從MQTT網(wǎng)絡(luò)環(huán)境講起。

MQTT客戶端與服務(wù)端的連接可能不是非常穩(wěn)定,在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境下,要想保證所有信息傳輸都能夠做到準(zhǔn)確無誤,這是非常困難的。因此,我們就要根據(jù)客戶端對(duì)系統(tǒng)運(yùn)行的重要性來區(qū)別對(duì)待。

有些MQTT客戶端對(duì)整個(gè)系統(tǒng)運(yùn)行起著關(guān)鍵作用,這些客戶端一定要準(zhǔn)確無誤的收到服務(wù)端發(fā)來的報(bào)文。比如一輛自動(dòng)駕駛汽車的導(dǎo)航系統(tǒng)。假如這個(gè)導(dǎo)航系統(tǒng)錯(cuò)過了服務(wù)端發(fā)來的報(bào)文,可能會(huì)導(dǎo)致交通事故甚至人員傷亡。因此,即使網(wǎng)絡(luò)不是非常穩(wěn)定,我們?nèi)匀灰笃噷?dǎo)航系統(tǒng)一定要準(zhǔn)確無誤的收到服務(wù)端所發(fā)來的報(bào)文。

但是有些MQTT客戶端對(duì)整個(gè)系統(tǒng)運(yùn)行并不是很重要。比如同樣是這輛自動(dòng)駕駛汽車。它的音樂播放系統(tǒng)如果沒有及時(shí)收到服務(wù)端發(fā)來的音樂播放報(bào)文,這對(duì)駕駛系統(tǒng)來說影響不大。

以上所舉的兩個(gè)例子說明,MQTT通訊中有些客戶端必須準(zhǔn)確無誤的收到報(bào)文,有些則不需要。

為了保證重要的MQTT報(bào)文可以被客戶端準(zhǔn)確無誤的收到。在服務(wù)端向客戶端發(fā)送報(bào)文后,客戶端會(huì)向服務(wù)端返回一個(gè)確認(rèn)報(bào)文。如果服務(wù)端沒有收到客戶端返回的確認(rèn)報(bào)文,那么服務(wù)端就會(huì)認(rèn)為剛剛發(fā)送給客戶端的報(bào)文沒有被準(zhǔn)確無誤的送達(dá)。在這種情況下,服務(wù)端將會(huì)執(zhí)行以下兩個(gè)操作:

操作1:將尚未被客戶端確認(rèn)的報(bào)文保存起來

操作2:再次嘗試向客戶端發(fā)送報(bào)文,并且再次等待客戶端發(fā)來確認(rèn)信息。

講到這里就要看看cleanSession的作用了。

如果cleanSession 被設(shè)置為“true”。那么服務(wù)端不需要客戶端確認(rèn)收到報(bào)文,也不會(huì)保存任何報(bào)文。在這種情況下,即使客戶端錯(cuò)過了服務(wù)端發(fā)來的報(bào)文,也沒辦法讓服務(wù)端再次發(fā)送報(bào)文。其實(shí)我們從字面上也很容易理解。cleanSession 的第一個(gè)詞是clean。這個(gè)詞的意思是clean(干凈)的。服務(wù)端一旦發(fā)送完報(bào)文,就會(huì)把報(bào)文忘得“干干凈凈”了。

反過來,如果我們將cleanSession 設(shè)置為”false”。那么服務(wù)端就知道,后續(xù)通訊中,客戶端可能會(huì)要求我保存沒有收到的報(bào)文。

從以上的描述不難看出,如果某個(gè)客戶端用于收發(fā)非常重要的信息(比如前文示例中汽車自動(dòng)駕駛系統(tǒng)),那么該客戶端在連接服務(wù)端時(shí),應(yīng)該將cleanSession設(shè)置為”false”。這樣才能讓服務(wù)端保存那些沒有得到客戶端接收確認(rèn)的信息。以便服務(wù)端再次嘗試將這些重要信息再次發(fā)送給客戶端。

相反的,如果某個(gè)客戶端用于收發(fā)不重要的信息(比如前文示例中車載音樂系統(tǒng))那么該客戶端在連接服務(wù)端時(shí),應(yīng)該將cleanSession設(shè)置為”true”。

請(qǐng)注意,如果需要服務(wù)端保存重要報(bào)文,光設(shè)置cleanSession 為false是不夠的,還需要傳遞的MQTT信息QoS級(jí)別大于0。

關(guān)于QoS的概念,我們會(huì)在本教程后續(xù)課程中詳細(xì)講解。到目前請(qǐng)您務(wù)必牢記,如果想讓服務(wù)器記住重要報(bào)文,那么客戶端在連接服務(wù)端時(shí),需要把cleanSession中設(shè)置為false。這一點(diǎn)非常關(guān)鍵,請(qǐng)務(wù)必牢記。

keepAlive – 心跳時(shí)間間隔

MQTT服務(wù)端運(yùn)行過程中,當(dāng)有客戶端因?yàn)槟撤N原因斷開了與服務(wù)端的連接,服務(wù)端需要實(shí)時(shí)了解這一情況。KeepAlive (心跳時(shí)間間隔)正是用于服務(wù)端了解客戶端連接情況的。不過關(guān)于KeepAlive (心跳時(shí)間間隔)目前講解還為時(shí)過早,我們會(huì)在后續(xù)的課程中給您做詳細(xì)介紹。目前您只需要記住,KeepAlive用于服務(wù)端實(shí)時(shí)了解客戶端是否與其保持連接的情況。

以上就是CONNECT報(bào)文的主要內(nèi)容。關(guān)于CONNECT報(bào)文中的其它內(nèi)容,我們會(huì)在接下來的課程里給大家講解。下面我們?cè)倏纯碝QTT服務(wù)端接收到客戶端發(fā)來的連接請(qǐng)求后所回復(fù)的CONNACK報(bào)文詳細(xì)內(nèi)容。

CONNACK – 確認(rèn)連接請(qǐng)求

下圖是CONNACK報(bào)文所包含的信息內(nèi)容。

MQTT CONNACK 報(bào)文內(nèi)容

CONNACK報(bào)文包括兩個(gè)信息。一個(gè)是returnCode(連接返回碼),另一個(gè)是sessionPresent (當(dāng)前會(huì)話)。以下是這兩個(gè)信息的說明:

returnCode – 連接返回碼

當(dāng)服務(wù)端收到了客戶端的連接請(qǐng)求后,會(huì)向客戶端發(fā)送returnCode(連接返回碼),用以說明連接情況。如果客戶端與服務(wù)端成功連接,則返回?cái)?shù)字“0”。如果未能成功連接,連接返回碼將會(huì)是一個(gè)非零的數(shù)值,具體這個(gè)數(shù)值的含義,請(qǐng)見下列說明:

0 - 成功連接
1 - 連接被服務(wù)端拒絕,原因是不支持客戶端的MQTT協(xié)議版本
2 - 連接被服務(wù)端拒絕,原因是不支持客戶端標(biāo)識(shí)符的編碼。
3 - 連接被服務(wù)端拒絕,原因是服務(wù)端不可用。
4 - 連接被服務(wù)端拒絕,原因是用戶名或密碼無效。
5 - 連接被服務(wù)端拒絕,原因是客戶端未被授權(quán)連接到此服務(wù)端

sessionPresent – 當(dāng)前會(huì)話

要說明sessionPresent,首先我們要回顧一下CONNECT報(bào)文中的cleanSession – 清除會(huì)話。

我們還用自動(dòng)駕駛汽車為例。對(duì)于自動(dòng)駕駛汽車來說,自動(dòng)導(dǎo)航系統(tǒng)屬于非常重要的MQTT客戶端。服務(wù)端發(fā)送給導(dǎo)航系統(tǒng)的報(bào)文必須要準(zhǔn)確無誤的送達(dá)。相反,音樂播放系統(tǒng)就不那么重要了。即使音樂播放系統(tǒng)錯(cuò)過服務(wù)端發(fā)送的報(bào)文也沒有關(guān)系。

對(duì)于不重要的MQTT客戶端,它們?cè)谙蚍?wù)器發(fā)送連接請(qǐng)求時(shí),CONNECT報(bào)文中的cleanSession通常設(shè)置為true。原因是這類不重要的MQTT客戶端即使丟失信息也不會(huì)影響整體系統(tǒng)運(yùn)行。因此服務(wù)端在看到客戶端的cleanSession為true時(shí),就不會(huì)保存發(fā)送給它們的信息。

然而對(duì)于汽車導(dǎo)航系統(tǒng)這類重要的MQTT客戶端來說。當(dāng)它在連接服務(wù)端時(shí),cleanSession肯定時(shí)設(shè)置為false。原因是重要客戶端需要服務(wù)端確保信息發(fā)送準(zhǔn)確無誤。如果服務(wù)端發(fā)現(xiàn)發(fā)送給重要客戶端的信息沒有得到確認(rèn),會(huì)將報(bào)文進(jìn)行保存。

當(dāng)重要客戶端連接服務(wù)端時(shí),服務(wù)端可能保存著沒有得到確認(rèn)的報(bào)文。如果是這樣的話,那么客戶端在連接服務(wù)端時(shí),就會(huì)通過sessionPresent來了解服務(wù)端是否有之前未能確認(rèn)的信息。

下面我們分幾種情況來講述sessionPresent的作用。

首先,當(dāng)客戶端發(fā)送的CONNECT報(bào)文中的cleanSession設(shè)置為true。在這種情況下,客戶端是不需要服務(wù)端保存任何報(bào)文的。那么服務(wù)端發(fā)送的確認(rèn)連接CONNACK報(bào)文中,sessionPresent肯定是false,也就是說,服務(wù)端沒有保存任何報(bào)文。

當(dāng)客戶端發(fā)送的CONNECT報(bào)文中的cleanSession設(shè)置為false時(shí),客戶端是要求服務(wù)端保存報(bào)文的。在這種情況下,如果服務(wù)端的確保存了沒有收到客戶端接收確認(rèn)的報(bào)文信息,那么cleanSession為true,否則為false。

簡(jiǎn)言之,CONNACK報(bào)文的sessionPresent與CONNECT報(bào)文的cleanSession相互配合。其作用是客戶端發(fā)送連接請(qǐng)求時(shí),服務(wù)端告知客戶端有沒有保存報(bào)文信息。這個(gè)被服務(wù)端保存的報(bào)文信息是來自于上一次客戶端連接時(shí),服務(wù)端曾經(jīng)發(fā)送此報(bào)文給客戶端,但是發(fā)送后沒有收到客戶端接收確認(rèn)。

本教程為 太極創(chuàng)客團(tuán)隊(duì) 制作的《零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng)》系列教程第二篇- MQTT篇。假如您學(xué)習(xí)本教程感到有些吃力,那么您可能還沒有觀看本系列教程 第一篇 - 基礎(chǔ)知識(shí)篇。您可以通過以下鏈接前往本教程的第一篇 - 基礎(chǔ)知識(shí)篇 教程頁面。

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

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

【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 1-3 連接MQTT服務(wù)端的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
隆化县| 讷河市| 务川| 安岳县| 清苑县| 乐都县| 大冶市| 青阳县| 阜城县| 云阳县| 额济纳旗| 鄂尔多斯市| 楚雄市| 大城县| 汤阴县| 修文县| 阳山县| 阜平县| 班玛县| 虞城县| 玉门市| 西城区| 丹巴县| 阿巴嘎旗| 新野县| 黑山县| 张掖市| 临沂市| 沁水县| 和林格尔县| 榕江县| 保山市| 浦城县| 满城县| 澎湖县| 安庆市| 南涧| 海口市| 尼勒克县| 苍南县| 皮山县|