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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...