Windows 編譯 MQTT C++ Client


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 這個文件

mqttc的源碼包下載下來
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看到這個那么就成功了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM