1. 程式人生 > >Windows 編譯 MQTT C++ Client

Windows 編譯 MQTT C++ Client

res cor one nsh cin cep amp 一個 方便

MQTT

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和制動器(比如通過Twitter讓房屋聯網)的通信協議

MQTT特點

編輯 MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性: 1、使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合; 2、對負載內容屏蔽的消息傳輸; 3、使用 TCP/IP 提供網絡連接; 4、有三種消息發布服務質量:
    • “至多一次”,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久後還會有第二次發送。
    • “至少一次”,確保消息到達,但消息重復可能會發生。
    • “只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
5、小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量; 6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制;

編譯環境

Windows系統是win7 64位

需要用到的工具:

需要使用git 所以http://gitforwindows.org/

CMake GUI (cmake.org)

Visual Studio (www.visualstudio.com

)

我這兒使用的是git,的例子也是git

下載源碼包

官網c++Mqtt Client 地址https://github.com/eclipse/paho.mqtt.cpp

使用git下載
git clone https://github.com/eclipse/paho.mqtt.cpp
				

技術分享圖片

技術分享圖片

編譯mqtt c庫

因為c++mqtt的庫必須需要c語言的mqtt庫支持,所以先編譯mqtt c的庫。

下載mqtt c的庫,進入剛剛下載的paho.mqtt.cpp文件中

技術分享圖片

使用記事本打開install_paho_mqtt_c.sh 這個文件

技術分享圖片

mqtt
c的源碼包下載下來
git clone https://github.com/eclipse/paho.mqtt.c.git
不過為了方便查找,將下載的mqtt c的源碼包,放在matt c++源碼包的目錄中

技術分享圖片

技術分享圖片

進入mqtt c源碼包的這個目錄中\paho.mqtt.c\Windows Build
我的也就是這個位置
C:\Users\jerry\paho.mqtt.cpp\paho.mqtt.c\Windows Build
雙擊 Paho C Mqtt APIs.sln,就會有如下界面

技術分享圖片

技術分享圖片

這兩個加密的我這兒不能編譯,因為我的環境沒有安裝openssl所以不能編譯
使用Mqtt認證的傳輸,不過一定想使用,可以自主安裝
接下來分別生成paho-mqtt3apaho-mqtt3c項目,還有編譯器不使用debug模式,
使用Release模式
如下

技術分享圖片

可能有報windows sdk的錯誤

技術分享圖片

只需要右擊當前項目-屬性
選擇一個windows SDK的版本,如下
這時最開始的

技術分享圖片

修改後

技術分享圖片

然後再生成一次

技術分享圖片

我們只需VersionInfo.h.in.in去掉,成為VersionInfo.h即可,在編譯一次

技術分享圖片

技術分享圖片

技術分享圖片

接下來生成paho-mqtt3a這個項目,途中可能遇到sdk的問題,請按照上個項目修改

技術分享圖片

Mqtt C的庫就編譯好了,接下來編譯mqtt c++的庫

編譯mqtt c++庫

Mqtt C的庫就編譯好了,接下來使用CMake工具編譯
如下

技術分享圖片

技術分享圖片

技術分享圖片

選擇平臺是6486

技術分享圖片

技術分享圖片

技術分享圖片

接下來根據參考文檔選擇需要編譯那些參數

技術分享圖片

指定mqttc的庫的位置如下,使用異步庫編譯,所以c++也只能編譯異步的,同步指定同步庫

技術分享圖片

生成構建的文件

技術分享圖片

打開項目即可

技術分享圖片

生成即可

技術分享圖片

測試

新建一個項目

內容如下

#include<iostream>

#include<string>

#include "mqtt\async_client.h"

int main(int argc, char* argv[])

{

const std::string TOPIC{ "hello" };

const std::string CLIENT_ID{ "async_consume" };

const std::string ADDRESS{ "www.brainmemory.cn:1883" };

const int QOS = 1;

const char * PAYLOAD = { "Hello World!" };

// Create a client

mqtt::async_client cli(ADDRESS, CLIENT_ID);

mqtt::connect_options connOpts;

connOpts.set_keep_alive_interval(20);

connOpts.set_clean_session(true);

try {

std::cout << "Connecting to the MQTT server..." << std::flush;

cli.connect(connOpts)->wait();

cli.start_consuming();

// Now try with itemized publish.

cli.publish(TOPIC, PAYLOAD, strlen(PAYLOAD), QOS, false);

// Disconnect

std::cout << "OK" << std::endl;

std::cout << "\nShutting down and disconnecting from the MQTT server..." << std::flush;

cli.unsubscribe(TOPIC)->wait();

cli.stop_consuming();

cli.disconnect()->wait();

std::cout << "OK" << std::endl;

}

catch (const mqtt::exception& exc) {

std::cerr << exc.what() << std::endl;

return 1;

}

std::cin.get();

return 0;

}

如下

技術分享圖片

將頭文件復制到當前項目目錄中,頭文件位置是c++庫文件中的src目錄中的mqtt文件中

技術分享圖片

右擊當前項目

技術分享圖片

將mqtt文件復制到當前目錄即可

如下

技術分享圖片

如果頭文件配置完成,那麽就不會有紅色的波浪號了

在將這剛剛編譯成功c++ mqtt項目中的庫復制當,當前項目中

技術分享圖片

技術分享圖片

在回到vs項目中將OBJS.lib添加到項目中

技術分享圖片

技術分享圖片

再生成一次可能會報這個錯

技術分享圖片

只需要將mqtt源碼包中 src目錄中的這MQTTAsync.h MQTTAsync.h兩個頭文件復制到當前目錄中即可

C:\Users\jerry\paho.mqtt.cpp\paho.mqtt.c\src

如下

技術分享圖片

再次生成哈,如果報這中錯誤,那麽雙擊第一個錯誤 213行

技術分享圖片

如下

技術分享圖片

把文件中所有的DLLexport替換為空

可以使用記事本或者其他的工具,我使用sublime

先ctrl+a 然後再ctrl+c

在使用sublime添加個文件

Ctrl+v

在sublime中Ctrl+h 或者查找替換匹配值

技術分享圖片

然後再使用ctrl+a 和ctrl+c

再到vs剛剛那個文件中

Ctrl+a 和ctrl+v

然後再次生成 可能會報如下錯誤

技術分享圖片

這個錯誤是沒有mqtt c的dll所有,我能只需要把mqtt c 異步的dll復制到當前目錄中

C:\Users\jerry\paho.mqtt.cpp\paho.mqtt.c\build\output 這時我系統c dll的位置

在c源碼包中build\output文件中

將下圖的復制,然後拷貝到當前項目文件中

如下

技術分享圖片

拷貝到當前項目文件中

技術分享圖片

然後再講dll添加到當前項目中

技術分享圖片

啟動

技術分享圖片

技術分享圖片

Ok看到這個那麽就成功了

Windows 編譯 MQTT C++ Client