go語(yǔ)言mqtt心跳包 go mqtt

Android MQTT 通信

??MQTT 協(xié)議 是基于發(fā)布/訂閱模式的物聯(lián)網(wǎng)通信協(xié)議,憑借簡(jiǎn)單易實(shí)現(xiàn)、支持 QoS、報(bào)文小等特點(diǎn),占據(jù)了物聯(lián)網(wǎng)協(xié)議的半壁江山。

為大城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及大城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、大城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

??常用于 IOT 物聯(lián)網(wǎng)和一些需要服務(wù)端主動(dòng)通知客戶端的場(chǎng)景。

1. 導(dǎo)入依賴

2. 創(chuàng)建 MqttHelper 輔助類,設(shè)置回調(diào)監(jiān)聽(tīng)

3. 連接 MQTT

??連接成功或失敗,以及中途的連接掉線,會(huì)觸發(fā) OnMqttStatusChangeListener 回調(diào)

4. MQTT 連接狀態(tài)監(jiān)聽(tīng)

5. MQTT 收發(fā)消息監(jiān)聽(tīng)

??onSubMessage 訂閱的消息回調(diào),因?yàn)榇嬖谟嗛喍鄠€(gè) topic 的情況,所以回調(diào)能知道是來(lái)自哪個(gè) Topic 的消息;

??onPubMessage 發(fā)布的消息回調(diào),用于確認(rèn)發(fā)布的消息是否發(fā)送成功。

6. MQTT 訂閱 Topic

??需要在 MQTT 連接成功后才能訂閱 topic,否則訂閱 Topic 不成功,收不到對(duì)應(yīng)消息

7. MQTT 取消訂閱 Topic

8. MQTT 發(fā)布消息

9. MQTT 斷開(kāi)連接

10. 通知設(shè)置

??由于 MQTT 啟動(dòng)了一個(gè) Service,而 Android 8.0 以上對(duì)于后臺(tái) Service 限制時(shí)長(zhǎng) 5 秒;所以將 MqttService 綁定到 Notification 上成為了一個(gè)前臺(tái)通知;通知的標(biāo)題和內(nèi)容顯示可以在 strings.xml 中設(shè)置,對(duì)應(yīng)屬性如下:

??Android 8.0 及以上開(kāi)啟前臺(tái)服務(wù)綁定到通知,8.0 以下默認(rèn)不啟用,可將 mqtt_foreground_notification_low_26 設(shè)為 true,將 8.0 以下設(shè)備也開(kāi)啟前臺(tái)通知服務(wù)

??創(chuàng)建 MQTT 實(shí)例時(shí)需要傳送參數(shù) MqttOptions,下面將介紹下部分參數(shù);

1. Topic

??MQTT 是一種發(fā)布/訂閱的消息協(xié)議, 通過(guò)設(shè)定的主題 Topic,

發(fā)布者向 Topic 發(fā)送的 payload 負(fù)載消息會(huì)經(jīng)過(guò)服務(wù)器, 轉(zhuǎn)發(fā)到所有訂閱

該 Topic 的訂閱者

?? 通配符 : 假想移動(dòng)端消息推送場(chǎng)景,有的系統(tǒng)消息是全體用戶接收,有的消息是 Android 或 iOS 設(shè)備接收, 又或者是某些消息具體推送到用戶,當(dāng)然, 對(duì)應(yīng)的多種類型消息可以通過(guò)多訂閱幾個(gè)對(duì)應(yīng)的 Topic 解決,也可以使用通配符;

??通配符有兩個(gè), " + " 和 " # ", 與正斜杠 " / " 組合使用;加號(hào)只能表示一級(jí)Topic, 井號(hào)可以表示任意層級(jí) Topic; 例如: 訂閱 Topic為 " System/+ ", 發(fā)布者發(fā)布的 Topic 可以是 System、System/Android、System/iOS; 但是不能是 System/iOS/123, 而訂閱的 Topic 如果是" System/# " 則可以收到;

?? 注意,只有訂閱的 Topic 才可以使用 通配符, 發(fā)布和遺囑的 Topic 不能包含通配符.

2. ClientID

??發(fā)布者和訂閱者都是屬于客戶端, 客戶端與服務(wù)端建立連接之后,發(fā)送的第一個(gè)報(bào)文消息必須是 Connect 消息,而 Connect 的消息載荷中必須包含 clientID 客戶端唯一標(biāo)識(shí);

??如果兩個(gè)客戶端的 clientID 一樣, 則服務(wù)端記錄第一個(gè)客戶端連接之后再收到第二個(gè)客戶端連接請(qǐng)求,則會(huì)向一個(gè)客戶端發(fā)送 Disconnect 報(bào)文斷開(kāi)連接, 并連接第二個(gè)客戶端, 而如果此時(shí)設(shè)置了自動(dòng)重連, 第一個(gè)客戶端再次連接,服務(wù)端又?jǐn)嚅_(kāi)與第二個(gè)的連接, 連上第一個(gè)客戶端, 如此將導(dǎo)致兩個(gè)客戶端不斷的被擠掉重連.

??注意: clientID 使用的字符最好是 大小寫(xiě)字母和數(shù)字, 長(zhǎng)度最好限制在[1, 23] 之間;

3. 遺囑消息

??可選參數(shù), 客戶端沒(méi)有主動(dòng)向服務(wù)端發(fā)起 disconnect 斷開(kāi)連接消息,然而服務(wù)端檢測(cè)到和客戶端之間的連接已斷開(kāi), 此時(shí)服務(wù)端將該客戶端設(shè)置的遺囑消息發(fā)送出去

??應(yīng)用場(chǎng)景: 客戶端因網(wǎng)絡(luò)等情況掉線之后, 可以及時(shí)通知到所有訂閱該遺囑 Topic 的客戶端;

??遺囑 Topic 中不能存在通配符.

4. Session

??客戶端和服務(wù)端之間建立的會(huì)話狀態(tài), 一般用于消息保存, 如果設(shè)置清除 Session,則每次客戶端和服務(wù)端建立連接會(huì)創(chuàng)建一個(gè)新的會(huì)話,之前連接中的消息不能恢復(fù),

??而設(shè)置不清除會(huì)話, 對(duì)應(yīng)發(fā)布者發(fā)送的 qos 為 1和2 的消息,還未被訂閱者接收確認(rèn),則需要保存在會(huì)話中, 以便訂閱者下次連接可以恢復(fù)這些消息;

??注意: Session 存儲(chǔ)的消息是保存在內(nèi)容中的, 所以如果不是重要的消息,最好是設(shè)置清除 Session, 或者設(shè)置 qos = 0;

5. 心跳包

??標(biāo)識(shí)客戶端傳輸一次控制報(bào)文到下一次傳輸之間允許的空閑時(shí)間;在這段時(shí)間內(nèi),如果客戶端沒(méi)有其他任何報(bào)文發(fā)送,必須發(fā)送一個(gè) PINGREQ 報(bào)文到服務(wù)器,而如果服務(wù)端在 1.5 倍心跳時(shí)間內(nèi)沒(méi)有收到客戶端消息,則會(huì)主動(dòng)斷開(kāi)客戶端的連接,發(fā)送其遺囑消息給所有訂閱者。而服務(wù)端收到 PINGREQ 報(bào)文之后,立即返回 PINGRESP 報(bào)文給客戶端

??心跳時(shí)間單位為秒,占用2個(gè)字節(jié),最大 2^16 - 1 = 65535秒(18小時(shí)12分鐘15秒),設(shè)置為 0 表示不使用心跳機(jī)制; 心跳時(shí)間一般設(shè)置為幾分鐘或幾十秒即可,時(shí)間短點(diǎn)可以更快的發(fā)出遺囑消息通知掉線,但是時(shí)間短會(huì)增加消息頻率,影響服務(wù)端并發(fā); 微信長(zhǎng)連接為 300 秒,而三大運(yùn)營(yíng)商貌似也有個(gè)連接時(shí)間最小的為 5 分鐘。

6. qos

??服務(wù)質(zhì)量等級(jí) qos 對(duì)應(yīng)兩部分,一是客戶端到服務(wù)端發(fā)送的消息, 一是服務(wù)端到客戶端訂閱的消息; 從發(fā)布者到訂閱者實(shí)際 qos 為兩段路中 qos 最小的。

??qos 可選值 0(最多交付一次)、1(最少交付一次)、2(正好交付一次);

?? qos = 0 :接收方不發(fā)送響應(yīng),發(fā)送方不進(jìn)行重試;發(fā)送方只管發(fā)一次,不管是否發(fā)成功,也不管接收方是否成功接收,適用于不重要的數(shù)據(jù)傳輸;

?? qos = 1 :確保消息至少有一次到達(dá)接收方,發(fā)送方向接收方發(fā)送消息,需要等待接收方返回應(yīng)答消息,如果發(fā)送方在一定時(shí)間之內(nèi)沒(méi)有收到應(yīng)答,發(fā)送方繼續(xù)下一次消息發(fā)送,直到收到應(yīng)答消息,刪除本地消息緩存,不再發(fā)送;所以接收方可能收到1-n次消息;適用于需要收到所有消息,客戶端可以處理重復(fù)消息。

?? qos = 2 :確保消息只一次到達(dá)接收方,發(fā)送方和接收方之間消息處理流程最復(fù)雜;

?? Mqtt Qos 深度解讀 和 MQTT協(xié)議QoS2 準(zhǔn)確一次送達(dá)的實(shí)現(xiàn)

7. payload 負(fù)載消息

??字節(jié)流類型, 是 MQTT 通信傳輸?shù)恼鎸?shí)數(shù)據(jù)

8. 保留消息

??發(fā)布消息時(shí)設(shè)置, 對(duì)應(yīng)參數(shù) retain, 服務(wù)端將保留對(duì)應(yīng) Topic 最新的一條消息記錄; 保留消息的作用是每次客戶端連接上線都會(huì)收到其 Topic 的最后一條保留消息, 所以可能存在網(wǎng)絡(luò)不穩(wěn)定,頻繁掉線重連,每次重連重復(fù)收到保留消息;

?? 可以向?qū)?yīng)的 Topic 發(fā)送一條 空消息,用于清除保留消息。

MQTT 服務(wù)搭建 Apache Apollo 服務(wù)器 搭建 MQTT 服務(wù)

Github 倉(cāng)庫(kù)

mqtt 協(xié)議

面試筆記-Socket MQTT Websocket

1.Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議。

2.MQTT協(xié)議是應(yīng)用層協(xié)議不依賴長(zhǎng)連接,適合弱網(wǎng)絡(luò)。通過(guò)topic緩存信息。符合物聯(lián)網(wǎng)設(shè)備的使用場(chǎng)景。因?yàn)橥ㄟ^(guò)topic緩存信息,因此可以實(shí)現(xiàn)通過(guò)topic與多個(gè)端的一對(duì)多連接,而不是設(shè)備與設(shè)備的多對(duì)多連接,節(jié)省了能耗及帶寬。

MQTT的心跳,及非信息的報(bào)文,較Websocket更少,更節(jié)省帶寬及能耗。更適用于物理網(wǎng)的多種網(wǎng)絡(luò)協(xié)議。

3.WebSocket和Http一樣在應(yīng)用層,提供使用一個(gè)TCP連接進(jìn)行雙向通訊的機(jī)制,包括網(wǎng)絡(luò)協(xié)議和API,以取代網(wǎng)頁(yè)和服務(wù)器采用HTTP輪詢進(jìn)行雙向通訊的機(jī)制。 本質(zhì)上來(lái)說(shuō),WebSocket是不限于HTTP協(xié)議的,但是由于現(xiàn)存大量的HTTP基礎(chǔ)設(shè)施,代理,過(guò)濾,身份認(rèn)證等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP連接建立后的握手消息是基于HTTP的,由服務(wù)器判斷這是一個(gè)HTTP協(xié)議,還是WebSocket協(xié)議。 WebSocket連接除了建立和關(guān)閉時(shí)的握手,數(shù)據(jù)傳輸和HTTP沒(méi)丁點(diǎn)關(guān)系了。

Socket 連接,至少需要一對(duì)套接字,分為 clientSocket,serverSocket 連接分為3個(gè)步驟:

(1) 服務(wù)器監(jiān)聽(tīng):服務(wù)器并不定位具體客戶端的套接字,而是時(shí)刻處于監(jiān)聽(tīng)狀態(tài);

(2) 客戶端請(qǐng)求:客戶端的套接字要描述它要連接的服務(wù)器的套接字,提供地址和端口號(hào),然后向服務(wù)器套接字提出連接請(qǐng)求;

(3) 連接確認(rèn):當(dāng)服務(wù)器套接字收到客戶端套接字發(fā)來(lái)的請(qǐng)求后,就響應(yīng)客戶端套接字的請(qǐng)求,并建立一個(gè)新的線程,把服務(wù)器端的套接字的描述發(fā)給客戶端。一旦客戶端確認(rèn)了此描述,就正式建立連接。而服務(wù)器套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求.

Socket為長(zhǎng)連接:通常情況下Socket 連接就是 TCP 連接,因此 Socket 連接一旦建立,通訊雙方開(kāi)始互發(fā)數(shù)據(jù)內(nèi)容,直到雙方斷開(kāi)連接。在實(shí)際應(yīng)用中,由于網(wǎng)絡(luò)節(jié)點(diǎn)過(guò)多,在傳輸過(guò)程中,會(huì)被節(jié)點(diǎn)斷開(kāi)連接,因此要通過(guò)輪詢高速網(wǎng)絡(luò),該節(jié)點(diǎn)處于活躍狀態(tài)。

很多情況下,都是需要服務(wù)器端向客戶端主動(dòng)推送數(shù)據(jù),保持客戶端與服務(wù)端的實(shí)時(shí)同步。

若雙方是 Socket 連接,可以由服務(wù)器直接向客戶端發(fā)送數(shù)據(jù)。

若雙方是 HTTP 連接,則服務(wù)器需要等客戶端發(fā)送請(qǐng)求后,才能將數(shù)據(jù)回傳給客戶端。

因此,客戶端定時(shí)向服務(wù)器端發(fā)送請(qǐng)求,不僅可以保持在線,同時(shí)也詢問(wèn)服務(wù)器是否有新數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。

MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸)是輕量級(jí)基于代理的發(fā)布/訂閱的消息傳輸協(xié)議,設(shè)計(jì)思想是開(kāi)放、簡(jiǎn)單、輕量、易于實(shí)現(xiàn)。這些特點(diǎn)使它適用于受限環(huán)境。

例如:

①網(wǎng)絡(luò)代價(jià)昂貴,帶寬低、不可靠。

②在嵌入設(shè)備中運(yùn)行,處理器和內(nèi)存資源有限。

該協(xié)議的特點(diǎn)有:

①使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合。 ②對(duì)負(fù)載內(nèi)容屏蔽的消息傳輸。

③使用 TCP/IP 提供網(wǎng)絡(luò)連接。

④有三種消息發(fā)布服務(wù)質(zhì)量:

⑤"至多一次",消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無(wú)所謂,因?yàn)椴痪煤筮€會(huì)有第二次發(fā)送。

⑥"至少一次",確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。

⑦"只有一次",確保消息到達(dá)一次。這一級(jí)別可用于如下情況,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果。

⑧小型傳輸,開(kāi)銷很?。ü潭ㄩL(zhǎng)度的頭部是 2 字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量。

⑨使用 Last Will 和 Testament 特性通知有關(guān)各方客戶端異常中斷的機(jī)制。

實(shí)現(xiàn)MQTT協(xié)議需要客戶端和服務(wù)器端通訊完成,在通訊過(guò)程中,MQTT協(xié)議中有三種身份:發(fā)布者(Publish)、代理(Broker)(服務(wù)器)、訂閱者(Subscribe)。其中,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布者可以同時(shí)是訂閱者。

有三種消息發(fā)布服務(wù)質(zhì)量:

“至多一次”,消息發(fā)布完全依賴底層TCP/IP網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無(wú)所謂,因?yàn)椴痪煤筮€會(huì)有第二次發(fā)送。這一種方式主要普通APP的推送,倘若你的智能設(shè)備在消息推送時(shí)未聯(lián)網(wǎng),推送過(guò)去沒(méi)收到,再次聯(lián)網(wǎng)也就收不到了。qos=0

“至少一次”,確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。qos=1

“只有一次”,確保消息到達(dá)一次。在一些要求比較嚴(yán)格的計(jì)費(fèi)系統(tǒng)中,可以使用此級(jí)別。在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果。這種最高質(zhì)量的消息發(fā)布服務(wù)還可以用于即時(shí)通訊類的APP的推送,確保用戶收到且只會(huì)收到一次。qos=2

Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會(huì)收到該主題的消息內(nèi)容(payload);

payload,可以理解為消息的內(nèi)容,是指訂閱者具體要使用的內(nèi)容。

在MQTT協(xié)議中,一個(gè)MQTT數(shù)據(jù)包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構(gòu)成。MQTT數(shù)據(jù)包結(jié)構(gòu)如下:

固定頭(Fixed header)。存在于所有MQTT數(shù)據(jù)包中,表示數(shù)據(jù)包類型及數(shù)據(jù)包的分組類標(biāo)識(shí)。

可變頭(Variable header)。存在于部分MQTT數(shù)據(jù)包中,數(shù)據(jù)包類型決定了可變頭是否存在及其具體內(nèi)容。

消息體(Payload)。存在于部分MQTT數(shù)據(jù)包中,表示客戶端收到的具體內(nèi)容。

WebSocket則提供使用一個(gè)TCP連接進(jìn)行雙向通訊的機(jī)制,包括網(wǎng)絡(luò)協(xié)議和API,以取代網(wǎng)頁(yè)和服務(wù)器采用HTTP輪詢進(jìn)行雙向通訊的機(jī)制。 本質(zhì)上來(lái)說(shuō),WebSocket是不限于HTTP協(xié)議的,但是由于現(xiàn)存大量的HTTP基礎(chǔ)設(shè)施,代理,過(guò)濾,身份認(rèn)證等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP連接建立后的握手消息是基于HTTP的,由服務(wù)器判斷這是一個(gè)HTTP協(xié)議,還是WebSocket協(xié)議。 WebSocket連接除了建立和關(guān)閉時(shí)的握手,數(shù)據(jù)傳輸和HTTP沒(méi)丁點(diǎn)關(guān)系了。 由此可知兩者的應(yīng)用場(chǎng)景不一樣: MQTT是為了物聯(lián)網(wǎng)場(chǎng)景設(shè)計(jì)的基于TCP的Pub/Sub協(xié)議,有許多為物聯(lián)網(wǎng)優(yōu)化的特性,比如適應(yīng)不同網(wǎng)絡(luò)的QoS、層級(jí)主題、遺言等等。 WebSocket是為了HTML5應(yīng)用方便與服務(wù)器雙向通訊而設(shè)計(jì)的協(xié)議,HTTP握手然后轉(zhuǎn)TCP協(xié)議,用于取代之前的Server Push、Comet、長(zhǎng)輪詢等老舊實(shí)現(xiàn)。 兩者之所有有交集,是因?yàn)橐粋€(gè)應(yīng)用場(chǎng)景:如何通過(guò)HTML5應(yīng)用來(lái)作為MQTT的客戶端,以便接受設(shè)備消息或者向設(shè)備發(fā)送信息,那么MQTT over WebSocket自然成了最合理的途徑了。

paho mqtt c 源碼分析-2 (心跳機(jī)制)

MQTT是基于TCP的,因此需要考慮連接心跳,paho mqtt c的心跳處理函數(shù)

概括如下:

ping_outstanding 在下述函數(shù)中處理,該函數(shù)的調(diào)用是在接收線程中,如果收到云端的 PINGRESP 數(shù)據(jù)包,會(huì)調(diào)用該接口

lastSent 是MQTT消息包發(fā)送完成,調(diào)用的場(chǎng)景如下2個(gè):

MQTTPacket_Factory(...)

如果收到一個(gè)MQTT packet,則設(shè)置 lastReceived

網(wǎng)頁(yè)名稱:go語(yǔ)言mqtt心跳包 go mqtt
當(dāng)前URL:http://muchs.cn/article36/doocesg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷、Google、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化