MQTT協議以及庫函數說明

来源:http://www.cnblogs.com/hbzzm/archive/2016/08/27/5813070.html
-Advertisement-
Play Games

內容簡介:之前我們寫了一篇ESP8266AT指令的說明文檔,在客戶端連接上伺服器之後,接下來便是網路通信。為此我們又寫了這一片MQTT協議的說明文檔,更加深層次的講述了通信的原理。此文檔只是我們在調試過程中的一些小結和經驗,所以並不是規範的設計手冊。如果想要使用瞭解MQTT協議,一定是要仔細看到他的 ...


內容簡介:之前我們寫了一篇ESP8266AT指令的說明文檔,在客戶端連接上伺服器之後,接下來便是網路通信。為此我們又寫了這一片MQTT協議的說明文檔,更加深層次的講述了通信的原理。此文檔只是我們在調試過程中的一些小結和經驗,所以並不是規範的設計手冊。如果想要使用瞭解MQTT協議,一定是要仔細看到他的手冊的。如果發現文中有寫錯的地方也希望指出,我們會改正,並且在我們的公眾號“眼湖雲”中更新。

圖片沒法貼上來,所以需要結合手冊來看。

 

我們的網路通信通過三部分,網關(ESP8266),MQTT協議,伺服器。

在通過ESP8266連接上伺服器之後,下麵就要通過MQTT進行通信。MQTT協議最新的版本是MQTT-3.1.1-CN,這個可以上網去下載,不過我們建議將MQTT-3.1protocol-Specific中文版也下載下來,兩份一起看,比較詳細。還有MQTT的源碼,網上也有的下載。

簡單點來說,MQTT協議就是將你要發送的內容按照它的規定組成一串字元串,然後發送出去,至於伺服器接收到了怎麼解析就不是我們玩嵌入式的人管的了。

MQTT協議一共有14個消息類型:

1.客戶端請求連接到伺服器; 2.連接確認; 3.發佈消息;4.發佈確認;5.發佈信息收到;6.發佈信息分發;7.發佈完成 8.客戶端訂閱請求;9.訂閱確認;10.客戶端取消訂閱請求;
11.取消訂閱確認;12.ping請求;13.ping響應;14.客戶端正在斷開連接;

而他們的發送格式都是一樣的,一共有三部分組成:

固定報頭,可變報頭,有效載體

具體的每一種的意思可以查看手冊,我們這裡只用到其中的三種,分別是1,3,8。接下來我們講講這三種消息類型。

一、客戶端請求連接伺服器。

客戶端連接到伺服器之後,客戶端發送給伺服器的第一個報文(第一個字元串,也就是消息類型)必須是第一個消息類型,也就是上面列出來的第一個消息類型,客戶端請求連接到伺服器connect)。

那麼我們該送什麼樣的字元串呢,其實手冊上已經列了出來怎麼發送,它的格式都是定死的。

我們給出一個字元串,也就是經過MQTT協議後將要發出去的字元串:

0x10  0x2d  0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  0x04  0xc2  0x0b  0xb8  0x00  0x10  

‘4’  ‘0’  ‘F’  ‘’0  ‘6’  ‘0’  ‘0’  ‘0’  ‘5’  ‘0’  ‘8’  ‘0’  ‘4’  ‘0’  ‘5’  ‘0’  0X00  0X05

‘a’  ‘d’  ‘m’  ‘i’  ‘n’   0x00   0x08  ‘p’   ‘a’   ‘s’   ‘s’   ‘w’   ‘o’   ‘r’   ‘d’ 

   一共是47個字元。

 

1.開頭的兩個字元。0x10  0x2d   這兩個位元組就是固定報頭。固定報頭只有兩個位元組,每個位元組八位。每一位都有它代表的意思。

0x10 (0001 0000):  低四位是保留位,預設都是0

                             高四位則是代表這個字元串是第一種消息類型,括弧里的1就是它的號碼代,手冊里有詳細的表格。

0x2d (0010 1011):  這個位元組是剩餘長度,也就是這個位元組之後,多有位元組的個數(可變報 頭+有效載體),我們這裡一共47個字元,減去這兩個,就是45個,十 六進位就是0x2d

 

2.接下來是可變報頭,可變報頭由四個部分組成:協議名,協議級別,連接標誌和保持連接

 

協議名有六個位元組,也就是接下來的0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  

    0x00  0x04 這是一組,代表後面的協議名的長度,我們這裡協議名便是MQTT,長度4

協議級別一個位元組 0x04 。這個在手冊中給出了這個固定的數據,也就是這個協議的版本的代表。

連接標誌一個位元組:0xc2   (1100 0010)

每一位的意思手冊上有。

Clean Session:伺服器在斷開連接後,是不是要保存客戶端的信息,我們保存,設為0

也就是如果我們的ESP8266在發消息時突然斷開了,接著又連了上來,那麼服   務器接著斷開時的狀態接續發送。

Willflag:這裡我們不用這一位,這一位不設置,後面的will QOS will retain都不用設置。

Username password 就是進入你的伺服器的賬號和密碼了。我們這裡用到了,所以這兩位都是1.

 

最後是保持連接,兩個位元組,0x0b  0xb8。 這個講起來比較多,我們這裡簡單解釋一下,詳細的需要自己看手冊,專門有講解。保持連接也就是心跳,即多長時間檢查一下是否還發消息和是否保持著連接,我們這兩個位元組就是設置的這個時間。

 

3.接下來就是有效載體,包括戶端標識符,遺囑主題,遺囑消息,用戶名,密碼

客戶端標識符:0x00 0x10 40F0600050804050    前面兩個位元組就是代表標識符的長度,後面的40F......就是客戶端標識符,代表著哪一個客戶端,這個自己根據自己的設計來決定。

遺囑主題,遺囑消息我們都沒有。

接下來的就是用戶名和密碼。

0X00  0X05  admin   0x00   0x08   password  

這個的意思不講也應該知道了,不再說了。

 

二、第一步的connect完成後,就是請求連接成功了。

接下來就是發佈消息和接收消息,這兩個不再詳細展開,他們的格式都是和上面的第一步一樣的,設置值根據手冊中的數據設置就可以。

簡單解釋一下,客戶端向伺服器傳消息,就是publish,發佈消息,那麼按照發佈消息的消息格式發送就可以。

客戶端想要接收伺服器的消息,就是接收消息了,這個需要在連接成功後就發送給伺服器。意思就是:我們使用的微信,上面有很多的公眾號。但是你怎麼樣才能受到這些公眾號的消息呢,你得先關註這些公眾號。同理,這裡的伺服器有很多的消息,你想要接收那部分的,就需要向伺服器發送那部分消息的公眾號才可以接收。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 進程概念 | 名稱 | 說明 | | : | : | | 程式 | 一組指令的集合 | | 進程 |程式的執行就是進程也可以把進程看成一個獨立的程式在記憶體中有其對應的代碼空間和數據空間,一個進程所擁有的數據和代碼只屬於自己進程是資源分配的基本單位,也是調度運行的基本單位 | | 線程 | 線程被人們 ...
  • 一、問題起源 在Linux系統中,通過rm刪除文件將會從文件系統的目錄結構上解除鏈接(unlink),如果文件是被打開的(有一個進程正在使用),那麼進程將仍然可以讀取該文件磁碟空間也一直被占用 這樣就會導致我們明明刪除了文件,但是磁碟空間卻未被釋放 二、問題分析 1、首先獲得一個已經被刪除但是仍然被 ...
  • 》進程式控制制塊 在linux中進程信息存放在叫做進程式控制制塊的數據結構中,每個進程在內核中都有⼀個進程式控制制塊(PCB)來維護進程相關的信息,Linux內核的 進程式控制制塊是task_struct結構體。在Linux中,這個結構叫做task_struct。 task_struct是Linux內核的一種數據結 ...
  • 1、問題描述 2、問題分析 google 499 / ClientClosed Request An Nginx HTTP server extension. This codeis introduced to log the case when the connection is closed b ...
  • 1.運行環境Windows xp;Arduino1.6.11 IDE.2.問題在Arduino編譯時,經常出現如下的錯誤: collect2.exe: error: ld returned 5 exit statusexit status 1Error compiling for board Ard... ...
  • 1.MMU是Memory Management Unit的縮寫,中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的記憶體訪問授權,多用戶多進程操作系統。 2.虛擬記憶體由來:許多年以前,當人們還在使用DOS或是更 ...
  • 文: 小波/QQ463431476 今年暑假參加了電子設計比賽,4天3夜(2016/7/25 7/29)選了個電子秤,所以想說說一點心得分享一下。秤可以測量,用了濾波和一個線性的方程。 硬體部分主要焊接4個電阻應變片搭建一個全橋電路,然後經過放大器,將電壓信號放大,HX711擁有一個24位 AD 來 ...
  • Linux下的文件許可權 在linux下每一個文件和目錄都有自己的訪問許可權,訪問許可權確定了用戶能否訪問文件或者目錄和怎樣進行訪問。最為我們熟知的一個文件或目錄可能擁有三種許可權,分別是讀、寫、和執行操作,在這裡不做詳細說明。我們創建一個文件後系統會預設地賦予所有者讀和寫許可權。當然我們也可以自己修改它,添 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...