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-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的更多相关文章

  1. OGRE 2.1 Windows 编译

    版权所有,转载请注明链接 OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE ...

  2. Windows编译ejabberd

    Windows编译ejabberd(金庆的专栏)安装 erlang OTP. 添加路径到 PATH, 使 erl 可以运行.git clone ejabberd安装 rebar:git clone g ...

  3. 【转载】OGRE 2.1 Windows 编译

    OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE: OGRE官方推出了最新 ...

  4. CEF3.2623使用记录:windows编译

    CEF3.2623使用记录:windows编译 1:cef3.2623下载地址 2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 ...

  5. Windows 编译安装 nginx 服务器 + rtmp 模块

    有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...

  6. php beast windows编译教程

    git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk cd c:\php-sdk git checkou ...

  7. Windows编译Nginx源码

    Windows下的Nginx战役,人不作就不会死!就像是拿着麦当劳的优惠券去买肯德基一样,别扭啊 Nginx是一款轻量级的Web 服务器.反向代理服务器.邮件服务器等等集一大串荣誉于一身的大牌人物!他 ...

  8. 在windows编译MariaDB

    OS: Windows XP sp3 IDE: VS2010 MariaDB: V5.5 (到目前为止2016.5,中文域(.cn)只有清华大学 TUNA 镜像源可用) (.tar.gz为源码:.zi ...

  9. Windows编译安装OpenSSL

    windows下使用vs2008中的nmake编译安装openssl的脚本build.bat: echo off & color 0A :: 项目名称 set PROJECT=openssl ...

随机推荐

  1. Kubernetes单机安装部署

    系统环境: Ubuntu 16.04.2 LTS 软件环境: Docker 1.12.6 Go 1.8.3 Etcd 3.1.8 Flannel 0.7.1 Kubernetes master 1.7 ...

  2. 查看分析器(Analyzer)的分词效果

    1 测试代码 package com.test.lucene.helloworld; import org.apache.lucene.analysis.Analyzer; import org.ap ...

  3. 014-CallbackServlet代码

    package ${enclosing_package}; import java.io.IOException; import java.util.ResourceBundle; import ja ...

  4. pointer-events属性值详解

    其实早知道这个属性,但是一直没有去研究过.今天正好在twitter看到这个词,就去研究了下,正好解决了目前遇到的一个小难题,所以分享下.嗯,其实这是个比较简单的CSS3属性. 在某个项目中,很多元素需 ...

  5. 转 Unity企业级支持案例与分析

    Unity大中华区技术支持总监张黎明以“Unity企业级支持案例与分析”为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加今年的Unite,其实我现在看到有的朋友已经不是第一次来参加Un ...

  6. GIT 恢复单个文件到历史版本

    首先查看该文件的历史版本信息:git log <file> 恢复该文件到某个历史版本:git reset 版本号 <file> 检出改文件到工作区:git checkout - ...

  7. Django 入门项目案例开发(中)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务 ...

  8. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  9. java中多线程中测试某个条件的变化用 if 还是用 while?

    最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么要用while而不 ...

  10. SQLite.dll在xp中部署时的报错处理

    错误信息: System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SQLite.dll' or o ...