Mqtt開發(fā)筆記:windows下C++ ActiveMQ客戶端介紹、編譯和使用
前話
??項目需求,需要使用到mqtt協議,之前編譯QtMqtt庫,不支持隊列模式queue(點對點),只支持訂閱/發(fā)布者模式.,所以使用C++ ActiveMQ實現。
MQTT協議
簡介
??MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基于發(fā)布/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建于TCP/IP協議上,由IBM在1999年發(fā)布。MQTT最大優(yōu)點在于,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
設計原則
精簡,不添加可有可無的功能;
發(fā)布/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞;
允許用戶動態(tài)創(chuàng)建主題,零運維成本;
把傳輸量降到最低以提高傳輸效率;
把低帶寬、高延遲、不穩(wěn)定的網絡等因素考慮在內;
支持連續(xù)的會話控制;
理解客戶端計算能力可能很低;
提供服務質量管理;
假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。
特點
??1) 使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應用程序耦合
這一點很類似于XMPP,但是MQTT的信息冗余遠小于XMPP,,因為XMPP使用XML格式文本來傳遞數據。
??2) 對負載內容屏蔽的消息傳輸
??3) 使用TCP/IP提供網絡連接
主流的MQTT是基于TCP連接進行數據推送的,但是同樣有基于UDP的版本,叫做MQTT-SN。這兩種版本由于基于不同的連接方式,優(yōu)缺點自然也就各有不同了。
??4) 有三種消息發(fā)布服務質量
“至多一次”,消息發(fā)布完全依賴底層TCP/IP網絡。會發(fā)生消息丟失或重復。這一級別可用于如下情況,環(huán)境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發(fā)送。這一種方式主要普通APP的推送,倘若你的智能設備在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。
“至少一次”,確保消息到達,但消息重復可能會發(fā)生。
“只有一次”,確保消息到達一次。在一些要求比較嚴格的計費系統(tǒng)中,可以使用此級別。在計費系統(tǒng)中,消息重復或丟失會導致不正確的結果。這種最高質量的消息發(fā)布服務還可以用于即時通訊類的APP的推送,確保用戶收到且只會收到一次。
??5) 小型傳輸,開銷小
(固定長度的頭部是2字節(jié)),協議交換最小化,以降低網絡流量。非常適合"在物聯網領域,傳感器與服務器的通信,信息的收集",嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了。
??6) 客戶端異常中斷的機制。
Last Will:即遺言機制,用于通知同一主題下的其他設備發(fā)送遺言的設備已經斷開了連接。
Testament:遺囑機制,功能類似于Last Will。
發(fā)布/訂閱者模式
??MQTT是一個基于客戶端-服務器的消息發(fā)布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設備、智能家居、及一些小型化設備中已廣泛使用。
??
??從圖上MQTT有三種角色的存在:
Broker代理:很多人理解為中間件,當然可以這樣子認為。他就是一個中間件。用于處理信息并發(fā)送到相應的訂閱者。
發(fā)布者:用于發(fā)布信息到代理上面。注意:發(fā)布者也可以是訂閱者。
訂閱者:就是用于接受信息的客戶端。
MQTT服務器
??MQTT服務器以稱為"消息代理"(Broker),可以是一個應用程序或一臺設備。它是位于消息發(fā)布者和訂閱者之間,它可以:
接受來自客戶的網絡連接;
接受客戶發(fā)布的應用信息;
處理來自客戶端的訂閱和退訂請求;
向訂閱的客戶轉發(fā)應用程序消息。
MQTT協議中的方法
??MQTT協議中定義了一些方法(也被稱為動作),來于表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態(tài)生成數據,這取決于服務器的實現。通常來說,資源指服務器上的文件或輸出。主要方法有:
Connect:等待與服務器建立連接
Disconnect:等待MQTT客戶端完成所作的工作,并于服務器斷開TCP/IP會話
Subscribe:等待完成訂閱
UnSubscribe:等待服務器取消客戶端的一個活多個和topics訂閱
Publish:MQTT客戶端發(fā)送消息請求,發(fā)送完成后返回應用程序線程
CMS客戶端
??CMS API是一種類似JMS的C ++ API,用于與Message Brokers(如Apache ActiveMQ)進行交互。CMS有助于使C ++客戶端代碼更整潔,更易于遵循。ActiveMQ-CPP是僅客戶端庫,客戶端仍需要消息代理(如Apache ActiveMQ)進行通信。
下載源碼
??下載當前最新的windows版本源碼,下載地址如下:
??官網地址:https://activemq.apache.org/components/cms/
??CSDN下載地址:https://download.csdn.net/download/qq21497936/11233575
編譯avtivemq-cpp
??筆者使用的是VS2017。
步驟一:解壓
??將下載下來的壓縮文件解壓到編譯的專用文件夾:
??
步驟二:VS2017載入工程文件
??使用VS2017打開VS2010的工程文件:
??
??
??編譯”avtivemq-cpp”
???
步驟三:解決編譯錯誤:“/ZI”和“/Gy-”命令行選項不兼容
??編譯錯誤:
??
??解決方法:
??需要手動改變/Zl命令、/Gy命令:進入“項目”->“屬性”->“C/C++”->“常規(guī)”->“調試信息格式”->選擇“程序數據庫(/Zi)”。
??
???
??需要手動改變/Zl命令、/Gy命令:進入“項目”->“屬性”->“C/C++”->“代碼生成”->“啟用函數級鏈接”->選擇“是(/Gy)”。
??
步驟四:繼續(xù)右鍵工程生成
???
步驟五:解決編譯錯誤:“無法打開包括文件:apr_pools.h”
??(需要編譯Apr庫,請查看后續(xù)章節(jié)“VS2017編譯Apr-1.7.0庫”),編譯完成后,加入代碼中:
???
步驟六:繼續(xù)右鍵工程生成debug和release
??編譯通過:
??
??以上編譯的是debug版本,切換到release,需要再次配置包含頭文件屬性,然后開始編譯,耗費一定時間(約15-30分鐘)。
??
??
步驟七:頭文件以及庫文件歸類
??
??lib太大,無法上傳。
VS2017編譯Apr-1.7.0庫
??Active mq依賴一些額外的庫,在源碼的根目錄下的REAEDME.txt中有介紹,如下圖:
??
步驟一:下載部署
??Apr下載地址:http://apr.apache.org/download.cgi
??CSDN下載地址:https://download.csdn.net/download/qq21497936/11233615
??
??下載源碼解壓到專用的編譯文件夾:
??
步驟二:CMake配置工程
??需要使用到CMake。
??CMake是一個工程文件生成工具。用戶可以使用預定義好的CMake腳本,根據自己配置選擇開發(fā)環(huán)境(像是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