• 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.cWindows Build
    
    我的也就是这个位置
    C:Usersjerrypaho.mqtt.cpppaho.mqtt.cWindows 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 "mqttasync_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 << " Shutting 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:Usersjerrypaho.mqtt.cpppaho.mqtt.csrc

    如下

    再次生成哈,如果报这中错误,那么双击第一个错误 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:Usersjerrypaho.mqtt.cpppaho.mqtt.cuildoutput 这时我系统c dll的位置

    在c源码包中buildoutput文件中

    将下图的复制,然后拷贝到当前项目文件中

    如下

    拷贝到当前项目文件中

    然后再讲dll添加到当前项目中

    启动

    Ok看到这个那么就成功了

  • 相关阅读:
    软件项目管理阅读笔记02
    大二下周总结(11)
    “帮你APP”团队冲刺9
    “帮你APP”团队冲刺8
    “帮你APP”团队冲刺7
    “帮你APP”团队冲刺6
    “帮你APP”团队冲刺5
    单词统计
    “帮你APP”团队冲刺4
    “帮你APP”团队冲刺3
  • 原文地址:https://www.cnblogs.com/XiaoGuanYu/p/8168714.html
Copyright © 2020-2023  润新知