Windows 编译 MQTT C++ Client
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看到这个那么就成功了
Windows 编译 MQTT C++ Client的更多相关文章
- OGRE 2.1 Windows 编译
版权所有,转载请注明链接 OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE ...
- Windows编译ejabberd
Windows编译ejabberd(金庆的专栏)安装 erlang OTP. 添加路径到 PATH, 使 erl 可以运行.git clone ejabberd安装 rebar:git clone g ...
- 【转载】OGRE 2.1 Windows 编译
OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE: OGRE官方推出了最新 ...
- CEF3.2623使用记录:windows编译
CEF3.2623使用记录:windows编译 1:cef3.2623下载地址 2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 ...
- Windows 编译安装 nginx 服务器 + rtmp 模块
有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...
- php beast windows编译教程
git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk cd c:\php-sdk git checkou ...
- Windows编译Nginx源码
Windows下的Nginx战役,人不作就不会死!就像是拿着麦当劳的优惠券去买肯德基一样,别扭啊 Nginx是一款轻量级的Web 服务器.反向代理服务器.邮件服务器等等集一大串荣誉于一身的大牌人物!他 ...
- 在windows编译MariaDB
OS: Windows XP sp3 IDE: VS2010 MariaDB: V5.5 (到目前为止2016.5,中文域(.cn)只有清华大学 TUNA 镜像源可用) (.tar.gz为源码:.zi ...
- Windows编译安装OpenSSL
windows下使用vs2008中的nmake编译安装openssl的脚本build.bat: echo off & color 0A :: 项目名称 set PROJECT=openssl ...
随机推荐
- inline元素、inline-block元素在float、position:fixed、position:absolute之后出现的问题
我们知道内联元素是不能设置宽.高的,但是一旦使其脱离了文档流,就可以了,这是因为它已经变成了块级元素. 例1: <!DOCTYPE html> <html lang="en ...
- JS框架设计之主流框架的引入机制DomeReady一种子模块
DomReady其实是一种名为"DomContentLoaded"事件的名称,不过由于框架的需要,它与真正的DomContentLoaded有区别,在旧的JS书籍中m都会让我们把J ...
- centos 7编译安装php7
0.下载php源代码 http://www.php.net/releases/ 1.配置编译环境 yum install -y gcc gcc++ libxml2-devel openssl open ...
- redis和memcache缓存击穿,缓存失效问题
我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 Paste_Image.png Paste_Image.png ...
- jQuery validate 设置失去焦点就校验和失去焦点就表单校验是否通过
js部分 html部分 自定义样式: /*自定义validate覆盖掉了 validate 里面默认的显示样式*/ label.error{ background:url(${pageContext. ...
- 网站Http升级至Https(基于Tomcat)
由于之前一直忙于服创比赛,然后就导致好久没写博客了. 现在服创结束也有十来天了,感觉不写点什么就对不起自己了. 于是乎,就写写将网站从http升级到https的过程吧. 首先域名和服务器自然是必须的, ...
- Ubuntu 下常用的命令 简略记录
# 动态显示 NVIDIA watch -n 1 nvidia-smi #查看某一目录下文件的总数(不包含子目录) ls -l | wc -l #挂载硬盘或者U盘 mount /dev/sdb1 /m ...
- 本地IDC机房数据库容灾解决方案
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51jo ...
- Ajax嵌套Ajax的模版
引入 在开发中,难免会碰到需要发送两次ajax请求或者更多的情况 情境:我们需要resultB数据,后台提供的接口要先传入参数paramA,获取到resultA,然后resultA作为参数,调用另外一 ...
- Java---工欲善其事必先利其器(准备篇)
Java API 1.7链接:http://pan.baidu.com/s/1cKUaKY 密码:116m Eclispse链接:http://pan.baidu.com/s/1mh6MoL6 密码: ...