在Windows下创建简单的mqtt客户端
参考文章并感谢
https://blog.csdn.net/weixin_37139197/article/details/78934961
这两个都是讲Linux下的不过对我的帮助很大
前言
最近需要在Windows平台下开发一个简单的带界面的客户端与Mqtt代理通讯,以前都是在linux上面搞的,这回在Windows平台下还不太会了。
本想着Qt应该是有对应的库,结果查来查去发现还需要自己去下载源码,去整到Qt里面,奈何技术太渣,实在没搞出来。希望高版本Qt可以自己加上库。
一条路不通,就去找另一条,我决定还是使用paho.mqtt.c的源码来生成windows平台下的库。
前期准备
工具1 CMake,这里软件是为了将下载得paho.mqtt.c的源码转换成windows下VS的项目,下载网址https://cmake.org/download/ 这里要注意,最好就下msi版本,安装比较省事,如下图。
工具2 paho.mqtt.c源码
下载网址 https://github.com/eclipse/paho.mqtt.c (这个比较新)
https://github.com/eclipse/paho.mqtt.c/tree/v1.3.0
工具3 Visual Studio ,我这里使用的2015版本的
正式开始
首先,下载好源代码,解压。在解压的目录下创建一个build文件夹。名字自己随便起,最好是英文。
接着启动CMake程序,开始进行转换。如图,上面是框是源码的目录,下面的框是生成项目的目录,这就是创建一个build文件夹的原因。接着就点击左下方的Configure按钮。
如下图,我选择生成的工程为 VS2015 Win32 最后一个框我知道干啥的,也没有填。然后点击Finish。
接着就是出现下图所示的画面,我没有改动什么,直接点击Generate按钮。
生成完毕后就可以单击OpenProject按钮了,到这里Windows下 的paho mqtt c的工程就创建好了。
打开工程项目后,你会发现解决方案资源管理器中有很多项目,我只用了 paho-mqtt3c 这个项目,这个是同步的,还有一个paho-mqtt3a是异步的,我就找了一个简单的来用。右键paho-mqtt3c项目点击生成,一般会成功啊,我试了好几次,都成功了,如果读者出现错误,请自寻解决方法。
成功生成也意味着相对应的mqtt的 .lib 和 .dll 文件也成功生成了,他们所在的位置是在上面创建的哪个build文件夹下的src目录下的Debug或Release目录下(取决于你生成时用的什么版本),我这里用的是Release版本的。
.dll文件是配合生成的.exe文件一同使用的(.dll放在.exe目录下)
.lib文件是在编译项目文件的时候用的
到这里就可以开始创建自己的Mqtt客户端项目了,我这里是使用VS2015做开发,先创建一个工程,能输出hello world的就行。
接着需要添加若干头文件,这些头文件都在paho.mqtt.c-master\paho.mqtt.c-master\src目录下,我目前用这几个就OK。
记得把头文件复制到自己项目的目录下,记得还有上面提到的一个paho-mqtt3c.lib文件也要复制到自己的项目目录下。
接着就是写代码,这里写了一个很简单的程序,可以连接Mqtt服务器并向服务器发送某个主题的消息。
#include <iostream>
#include "MQTTClient.h" //引用mqtt的头文件
#include "MQTTClientPersistence.h" //引用mqtt的头文件
#include "MQTTProperties.h" //引用mqtt的头文件
#include <Windows.h>
using namespace std;
#pragma comment(lib, ".\\paho-mqtt3c.lib") //加载的.lib文件
int MqttInit(MQTTClient * MqClientHandle, char * BrokerUrl, char * Username, char * Password, char * Clientid, unsigned int Timerval)
{
int ret = 0;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient * temp = MqClientHandle;
ret = MQTTClient_create(temp, BrokerUrl, Clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
if (ret != MQTTCLIENT_SUCCESS)
{
return -1;
}
MqClientHandle = temp;
if (Timerval > 7200) { Timerval = 7200; }
if (Timerval < 30) { Timerval = 30; }
conn_opts.username = Username;
conn_opts.password = Password;
conn_opts.cleansession = 1;
conn_opts.connectTimeout = 15;
conn_opts.keepAliveInterval = Timerval;
ret = MQTTClient_connect(*MqClientHandle, &conn_opts);
if (ret != MQTTCLIENT_SUCCESS)
{
return -1;
}
return 0;
}
int PushData(MQTTClient MqClientHandle, char* topic, void* data, int qos, unsigned int Timeout)
{
int ret = 0;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token = 0;
if (qos < 0 || qos > 2) { qos = 0; }
pubmsg.payload = data;
pubmsg.payloadlen = strlen((const char *)data);
std::cout << " send data size = " << pubmsg.payloadlen << std::endl;
pubmsg.qos = qos;
pubmsg.retained = 0;
ret = MQTTClient_publishMessage(MqClientHandle, topic, &pubmsg, &token);
if (MQTTCLIENT_SUCCESS != ret)
{
return -1;
}
ret = MQTTClient_waitForCompletion(MqClientHandle, token, Timeout);
if (ret != MQTTCLIENT_SUCCESS)
{
return -1;
}
return 0;
}
int main()
{
MQTTClient client;
MqttInit(&client, "tcp://111.200.53.26:1883", "", "", "", 120);
while (1)
{
PushData(client, "123", "123456", 0, 100);
Sleep(1000);
}
return 0;
}
直接复制代码到你的.cpp文件上,编译,一般是能成功的啊,目前我还没遇到失败的。
在运行之前,记得把上面提到的.dll文件放到可执行文件(.exe)同一级目录下。这样运行才不会出错。
最后执行程序,结果如下,记得开启Mqtt的服务器啊。
程序正常运行,服务器也接收到了信息,图片是我用其他Mqtt客户端接收的服务器的信息。
将上面这一套东西搬到Qt上稍作修改也可以使用,头文件添加相同,就是.lib文件的引用不一样
LIBS += -LC:\Users\ThinkPad\Desktop\Qt_Mqtt_Client\MqttClientConfig -lpaho-mqtt3c 这里我是用的绝对路径
代码还是用上面的就行,当然得改啦,而且Qt的C++语法还挺严格,变量类型还得转换一下。
所以也可以用Qt创建Mqtt客户端了。
完结✿✿ヽ(°▽°)ノ✿
上一篇: AngularJS的内置过滤器详解
下一篇: 如何用ps给照片人物添加影子?