MQTT
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平台,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和制動器(比如通過Twitter讓房屋聯網)的通信協議
MQTT特點
編輯-
“至多一次”,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
-
“至少一次”,確保消息到達,但消息重復可能會發生。
-
“只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
編譯環境
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-mqtt3a和paho-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工具編譯
如下
選擇平台是64還86
接下來根據參考文檔選擇需要編譯那些參數
指定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看到這個那么就成功了