MQTT協議學習總結

2021-09-25 17:15:49 字數 1375 閱讀 7382

mqtt 協議是建立在 tcp 協議之上的,就好比汽車地盤上有四個輪胎就能跑了,但是想要大家開車更舒服,我們還是得給底盤加個殼。

為什麼要在 tcp 協議之上再封裝一層 mqtt 協議呢?

舉個例子,如果你要用 tcp 協議做乙個即時聊天室,那麼你:

首先寫乙個伺服器程式,監聽某個埠,這樣客戶端就能連線上來了。然後大家就能向你的伺服器傳送資料了。

但是你不希望隨便誰都能連線你的伺服器並且往你的伺服器裡發東西,於是你寫了乙個註冊頁面,讓別人先去註冊賬號,然後他們在客戶端建立連線時傳送的第乙個tcp報文必須包含了賬號密碼。這樣當你收到第乙個報文之後,你就能判斷這個連線是否合法了。

但是發過來的賬號密碼,具體擺在報文什麼位置,也得事先約定好吧,不然怎麼知道哪幾位是賬號哪幾位是密碼,於是你要求:第乙個位元組為1,用來告訴你這是乙個請求連線的報文。然後第二個位元組是報文剩下的長度(這個沒啥異議,粘包處理必備),然後是「餅乾熊最帥」這樣乙個固定的字串(沒啥意思,就是開心),後面緊跟著就是賬號,然後是密碼。但是賬號有多長呢,所以賬號第乙個位元組是賬號的長度,剩下才是賬號內容,這樣就解決了「賬號有多長」的問題了,密碼同理。

如果賬號密碼不匹配就斷開連線並且返回一句「***x off」,如果建立連線後半天不傳送任何東西也斷開連線。

現在大家的客戶端都連線上來了,你在伺服器儲存了乙個`賬號:socket`的map,能通過任何乙個賬號找到這個人的socket並向他傳送資訊。接下來大家要開始聊天了。

在聊天室中,乙個人傳送的訊息其他人都能收到,所以你新增了聊天室的概念,使用者首先去你的web頁面建立聊天室,然後會得到乙個聊天室的id。然後使用者要加入聊天室,必須先傳送乙個加入聊天室的報文。然後你要求報文第乙個位元組為2代表加入聊天室的請求報文,然後是報文剩餘長度,然後是聊天室id,聊天室id有多長?我們還是用第乙個位元組代表長度,剩下的內容為具體id的形式來搞定。

現在有多個使用者加入了聊天室,其中每個使用者又都加入了多個聊天室。假設現在大家在聊天室a中開始聊天。使用者甲向伺服器傳送訊息,然後你發現你不知道這條訊息是請求連線還是要加入聊天室還是幹啥,所以傳送訊息也應該定義一種報文型別。於是你要求傳送訊息的報文的第乙個位元組為3,那麼這個報文是傳送到哪個聊天室的呢?於是你要求報文後面跟上聊天室id,最後是具體的訊息內容。

伺服器收到第乙個位元組為3的訊息,就知道這是乙個聊天訊息。然後根據上面帶的聊天室id以及你在伺服器儲存的使用者和聊天室的關係,找到了這個聊天室裡的所有人,然後你就把訊息發給這裡面的所有人了。

上面這個例子,在連線伺服器(檢查合法性、斷開連線)、訂閱主題(加入聊天室)、發布訊息這些過程中,你約定的報文格式和設計的伺服器處理邏輯就是 mqtt 協議的內容,當然我舉的例子非常粗糙

真正的mqtt協議要求的處理邏輯和報文格式都完善很多,但是協議本身還是很簡單的,具體內容去看 mqtt 的文件。

mqtt英文文件

mqtt中文文件翻譯

MQTT協議學習

mqtt協議是目前物聯網最主要的協議,它的設計主要是運用於,低頻寬 低網速 差網路環境能夠保證資料的正常傳輸。mqtt協議基於tcp ip協議,運用訂閱發布模式,解除應用之間的耦合關係。客戶端與客戶端之間只需要知道伺服器位置。就可以傳輸資料 獲取資料。具體的協議和過程可以檢視這個中文幫助文件。裡面詳...

MQTT協議 MQTT協議簡介

mqtt messagequeuing telemetry transport,訊息佇列遙測傳輸 是ibm開發的乙個即時通訊協議。mqtt是面向m2m和物聯網的連線協議,採用輕量級發布和訂閱訊息傳輸機制。它的設計思想是輕巧 開放 簡單 規範,因此易於實現。這些特點使得它對很多場景來說都是很好的選擇,...

MQTT協議 MQTT協議解析

協議就是通訊雙方的乙個約定,即,表示第1位傳輸的什麼 第2位傳輸的什麼 在mqtt協議中,乙個mqtt資料報由 固定頭 fixed header 可變頭 variable header 訊息體 payload 三部分構成。mqtt 資料報結構 固定頭存在於所有mqtt資料報中,其結構如下 bit76...