Mqtt開發筆記:windows下C++ ActiveMQ客戶端介紹、編譯和使用

21497936發表於2022-08-02

前話

  專案需求,需要使用到mqtt協議,之前編譯QtMqtt庫,不支援佇列模式queue(點對點),只支援訂閱/釋出者模式.,所以使用C++ ActiveMQ實現。

MQTT協議

簡介

  MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸協議),是一種基於釋出/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年釋出。MQTT最大優點在於,可以以極少的程式碼和有限的頻寬,為連線遠端裝置提供實時可靠的訊息服務。作為一種低開銷、低頻寬佔用的即時通訊協議,使其在物聯網、小型裝置、移動應用等方面有較廣泛的應用。

設計原則

  • 精簡,不新增可有可無的功能;
  • 釋出/訂閱(Pub/Sub)模式,方便訊息在感測器之間傳遞;
  • 允許使用者動態建立主題,零運維成本;
  • 把傳輸量降到最低以提高傳輸效率;
  • 把低頻寬、高延遲、不穩定的網路等因素考慮在內;
  • 支援連續的會話控制;
  • 理解客戶端計算能力可能很低;
  • 提供服務質量管理;
  • 假設資料不可知,不強求傳輸資料的型別與格式,保持靈活性。

特點

   1) 使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合
這一點很類似於XMPP,但是MQTT的資訊冗餘遠小於XMPP,,因為XMPP使用XML格式文字來傳遞資料。
   2) 對負載內容遮蔽的訊息傳輸
   3) 使用TCP/IP提供網路連線
主流的MQTT是基於TCP連線進行資料推送的,但是同樣有基於UDP的版本,叫做MQTT-SN。這兩種版本由於基於不同的連線方式,優缺點自然也就各有不同了。
   4) 有三種訊息釋出服務質量

  • “至多一次”,訊息釋出完全依賴底層TCP/IP網路。會發生訊息丟失或重複。這一級別可用於如下情況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。這一種方式主要普通APP的推送,倘若你的智慧裝置在訊息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。
  • “至少一次”,確保訊息到達,但訊息重複可能會發生。
  • “只有一次”,確保訊息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。在計費系統中,訊息重複或丟失會導致不正確的結果。這種最高質量的訊息釋出服務還可以用於即時通訊類的APP的推送,確保使用者收到且只會收到一次。

   5) 小型傳輸,開銷小
(固定長度的頭部是2位元組),協議交換最小化,以降低網路流量。非常適合"在物聯網領域,感測器與伺服器的通訊,資訊的收集",嵌入式裝置的運算能力和頻寬都相對薄弱,使用這種協議來傳遞訊息再適合不過了。
   6) 客戶端異常中斷的機制。

  • Last Will:即遺言機制,用於通知同一主題下的其他裝置傳送遺言的裝置已經斷開了連線。
  • Testament:遺囑機制,功能類似於Last Will。

釋出/訂閱者模式

  MQTT是一個基於客戶端-伺服器的訊息釋出/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用範圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通訊和物聯網(IoT)。其在,透過衛星鏈路通訊感測器、偶爾撥號的醫療裝置、智慧家居、及一些小型化裝置中已廣泛使用。
   在這裡插入圖片描述
  從圖上MQTT有三種角色的存在:

  • Broker代理:很多人理解為中介軟體,當然可以這樣子認為。他就是一箇中介軟體。用於處理資訊併傳送到相應的訂閱者。
  • 釋出者:用於釋出資訊到代理上面。注意:釋出者也可以是訂閱者。
  • 訂閱者:就是用於接受資訊的客戶端。

MQTT伺服器

  MQTT伺服器以稱為"訊息代理"(Broker),可以是一個應用程式或一臺裝置。它是位於訊息釋出者和訂閱者之間,它可以:

  • 接受來自客戶的網路連線;
  • 接受客戶釋出的應用資訊;
  • 處理來自客戶端的訂閱和退訂請求;
  • 向訂閱的客戶轉發應用程式訊息。

MQTT協議中的方法

  MQTT協議中定義了一些方法(也被稱為動作),來於表示對確定資源所進行操作。這個資源可以代表預先存在的資料或動態生成資料,這取決於伺服器的實現。通常來說,資源指伺服器上的檔案或輸出。主要方法有:

  • Connect:等待與伺服器建立連線
  • Disconnect:等待MQTT客戶端完成所作的工作,並於伺服器斷開TCP/IP會話
  • Subscribe:等待完成訂閱
  • UnSubscribe:等待伺服器取消客戶端的一個活多個和topics訂閱
  • Publish:MQTT客戶端傳送訊息請求,傳送完成後返回應用程式執行緒

CMS客戶端

  CMS API是一種類似JMS的C ++ API,用於與Message Brokers(如Apache ActiveMQ)進行互動。CMS有助於使C ++客戶端程式碼更整潔,更易於遵循。ActiveMQ-CPP是僅客戶端庫,客戶端仍需要訊息代理(如Apache ActiveMQ)進行通訊。

下載原始碼

  下載當前最新的windows版本原始碼,下載地址如下:
  官網地址:
  CSDN下載地址: https://download.csdn.net/download/qq21497936/11233575

編譯avtivemq-cpp

  筆者使用的是VS2017。

步驟一:解壓

  將下載下來的壓縮檔案解壓到編譯的專用資料夾:
   在這裡插入圖片描述

步驟二:VS2017載入工程檔案

  使用VS2017開啟VS2010的工程檔案:
   在這裡插入圖片描述
   在這裡插入圖片描述
  編譯”avtivemq-cpp”
    在這裡插入圖片描述

步驟三:解決編譯錯誤:“/ZI”和“/Gy-”命令列選項不相容

  編譯錯誤:
   在這裡插入圖片描述
  解決方法:
  需要手動改變/Zl命令、/Gy命令:進入“專案”->“屬性”->“C/C++”->“常規”->“除錯資訊格式”->選擇“程式資料庫(/Zi)”。
   在這裡插入圖片描述
    在這裡插入圖片描述
  需要手動改變/Zl命令、/Gy命令:進入“專案”->“屬性”->“C/C++”->“程式碼生成”->“啟用函式級連結”->選擇“是(/Gy)”。
   在這裡插入圖片描述

步驟四:繼續右鍵工程生成

    在這裡插入圖片描述

步驟五:解決編譯錯誤:“無法開啟包括檔案:apr_pools.h”

  (需要編譯Apr庫,請檢視後續章節“VS2017編譯Apr-1.7.0庫”),編譯完成後,加入程式碼中:
    在這裡插入圖片描述

步驟六:繼續右鍵工程生成debug和release

  編譯透過:
   在這裡插入圖片描述
  以上編譯的是debug版本,切換到release,需要再次配置包含標頭檔案屬性,然後開始編譯,耗費一定時間(約15-30分鐘)。
   在這裡插入圖片描述

   在這裡插入圖片描述

步驟七:標頭檔案以及庫檔案歸類

   在這裡插入圖片描述
  lib太大,無法上傳。

VS2017編譯Apr-1.7.0庫

  Active mq依賴一些額外的庫,在原始碼的根目錄下的REAEDME.txt中有介紹,如下圖:
   在這裡插入圖片描述

步驟一:下載部署

  Apr下載地址:
  CSDN下載地址: https://download.csdn.net/download/qq21497936/11233615
   在這裡插入圖片描述
  下載原始碼解壓到專用的編譯資料夾:
   在這裡插入圖片描述

步驟二:CMake配置工程

  需要使用到CMake。
  CMake是一個工程檔案生成工具。使用者可以使用預定義好的CMake指令碼,根據自己配置選擇開發環境(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程檔案。
  cmake下載地址: http://download.csdn.net/download/qq21497936/10154545
   在這裡插入圖片描述

  解壓後直接執行cmake-gui.exe
   在這裡插入圖片描述
  使用cmake生成apr的2017工程檔案:
   在這裡插入圖片描述

步驟三:CMake生成工程

   在這裡插入圖片描述

  CMake順利生成。
   在這裡插入圖片描述

步驟四:VS2017開啟工程

  使用VS2017開啟工程檔案:
   在這裡插入圖片描述

   在這裡插入圖片描述

步驟五:編譯

  右鍵“All_BUILD”屬性,點選“生成”,程式設計成功,如下圖:
   在這裡插入圖片描述

步驟六:標頭檔案與庫檔案歸類

  拿到apr.h標頭檔案,該標頭檔案在原始碼中是沒有的,更具目標編譯版本生成的。
   在這裡插入圖片描述

  標頭檔案include複製出來,需要將上面的apr.h複製進去
   在這裡插入圖片描述

  庫檔案:
   在這裡插入圖片描述

  封裝好:
   在這裡插入圖片描述
  提供CSDN下載
  VS2017 32位的: https://download.csdn.net/download/qq21497936/11234064
  VS2017 64位的: https://download.csdn.net/download/qq21497936/11234064


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2908558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章