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三个工程文件。