Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 386, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

编译MQTT C++ Client

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的即时通讯协议,有可能成为物联网的重要组成部分。
该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要特性:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    • “至少一次”,确保消息到达,但消息重复可能会发生。
    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

编译环境 win10专业版+vs2017企业版
1、安装cmake,https://cmake.org/download/,直接下载安装包(msi)

2、安装ActivePerl软件,https://www.activestate.com/activeperl/downloads.用cmd命令行的形式输入指令进入到安装目录,比如安装在C:\Perl64\下,进入到C:\Perl64\eg目录,输入“perl example.pl”, 如果出现如下图所示的:"Hello from         ActivePerl!",则表示软件安装成功。安装时自动设置环境变量

3、安装openssl,https://www.openssl.org/,解压缩文件。开始菜单-->Vistual Studio 2017-->x64 Native Tools Command Prompt for VS 2017,进入vs2017的命令行行提示工具,切换到openssl的解压缩目录,依次执行下面命令行
    perl Configure VC-WIN64 no-asm --prefix=C:\openssl(C:\openssl是openssl的安装目录)
                no-asm,表示不使用汇编,如果你不加上的话,在执行nmake命令时会出错;命令执行后控制台上输出NOTE: If in doubt, on Unix-ish systems use './config',则表示执行命令失败()
                如果这条命令执行不成,试试这个命令perl Configure VC-WIN64A --perfix=C:\openssl\win64 (还是其存储路径),这里使用的是VC-WIN64A这个参数
    ms\do_nasm 
    ms\do_win64a
   nmake  -f  ms\nt.mak(这是静态库,动态库是ntdll.mak)
   nmake  -f  ms\nt.mak test(测试命令,如果成功则最后显示“passed all tests”字样)
   nmake  -f  ms\nt.mak install 成功则会在C:\openss\win64目录下生成bin、include、lib、ssl四个文件夹
   如果需要编译动态库,nmake  -f  ms\nt.mak改成动态库版本就可以了。
   清除上次OpenSSL动态库的编译,以便重新编译:nmake -f ms\ntdll.mak clean
 清除上次OpenSSL静态库的编译,以便重新编译:nmake -f ms\nt.mak clean
   
   备注:利用openssl生成RSA公私密钥对。
   在Windows环境下,打开OPENSSL安装目录bin文件下面的openssl.exe。
   生成RSA私钥:genrsa -out rsa_private_key.pem 1024
   该命令会生成1024位的私钥
   生成RSA公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem此时,我们可以看到一个文件名为rsa_public_key.pem的文件,打开它,
  可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥
   把RSA私钥转换成PKCS8格式:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt
   生成的结果就是PKCS8格式的私钥

4、安装cppunit(cpp单元测试件)下载地址:http://downloads.sourceforge.net/cppunit/cppunit-1.12.1.tar.gz,如果不需要测试可以省略这一步。一般我们编译cppunit_dll工程,同时产生lib和dll文件
   里面有vc6的工程文件,用vs2017打开,升级工程后,编译容易出现MSB3073的错误,编译完成后,copy的时候提示找不到文件。需要做如下修改

(1)General\TargetName中,$(ProjectName)-->$(ProjectName)d,而cppunit_dll工程比较特殊,它需要在cppunitd_dll中间加"d",没办法使用$(ProjectName),可直接写为cppunitd_dll

(2)Linker\General\Output Files中,DebugDll\cppunit_dll.dll-->DebugDll\$(TargetName)$(TargetExt)

(3)Linker\Advanced\Import Libraries中,.\DebugDll\cppunit_dll.lib-->.\DebugDll\$(TargetName).lib

(4)PostBuild Event\Command Line中:改为:

       copy "$(TargetPath)" ..\..\lib\$(TargetName)$(TargetExt)

       copy "$(TargetDir)$(TargetName).lib" ..\..\lib\$(TargetName).lib

5、官网c++Mqtt Client 地址https://github.com/eclipse/paho.mqtt.cpp
   使用git下载git clone https://github.com/eclipse/paho.mqtt.cpp,进入刚刚下载的paho.mqtt.cpp文件中,将mqtt的c的源码包下载下来git clone https://github.com/eclipse/paho.mqtt.c.git
   新版的mqtt文件夹里没有sln文件,用cmake-gui生成sln文件,而后用vs2017打开编译,openssl路径;或者执行paho.mqtt.c文件夹下的cbuild批处理文件(git下来的是vs2015配置,vs2017则是
   "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat",具体的路径请根据自己安装配置),这里如果是批处理的话openssl的安装目录必须是c:\OpenSSL-Win64;
   cmake-gui,Configure选用Visual Studio 15 2017 Win64,Generate后,可以选定OPENSSL_LIB OPENSSL_INCLUDE_DIR OEPENSSLCRYPTO_LIB的路径。

   使用cmake-gui,产生sln文件,在一次General之后可以选定PAHO_MQTT_C_LIB和PAHO_MQTT_C_PAHT和openssl相关路径。然后打开工程编译就可以。
   如果不行产生ZERO_CHECK,在CMakelist文件中加入SET(CMAKE_SUPPRESS_REGENERATION 1)
   原来的CMakeLists文件比较庞杂,这是精简后的phot.mqtt.c/src/CMakeList
   phot.mqtt.c下的CMakeList:phot.mqtt.c/CMakeLists(下载完成后修改成文件名为CMakeList),去除了ZERO_CHECK、INSTALL、  PACKAGE三个工程文件。
   
   

    

   

    

posted on 2019-01-18 13:06 Benjamin 阅读(5199) 评论(0)  编辑 收藏 引用 所属分类: VC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理