之前有一篇文章介绍了如何在百度智能云上面创建MQTT设备,这期我们讲一讲如何利用VS使用C++制作一个简单的MQTT服务器。
首先,我们需要下载一个VS,VS全称visual studio,是微软发布的一款功能强大的编译器,从我的学习之初也一直在使用这款。这里就不赘述如何安装Visual Studio了,不会安装的同学可以自行搜索。
我们打开VS,选择创建新项目,类型选择C++的空项目。
在开始之前,我们需要一个可以实现MQTT的库,我这里的是paho.mqtt的库(链接贴不上来,如需私信),我们需要把库链接入编译器。
选择 项目-xxxx属性-配置属性-链接器-常规,在附加库依赖项中添加我们的库文件

之后添加“MQTTClient.h”头文件即可使用我们的MQTT库。

1.在主函数中我们首先创建MQTT连接变量以及存储MQTT连接信息的结构体。
MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
2.获取MQTT设备信息以及设置MQTT连接。
在百度智能云上面创建MQTT设备中提到获取MQTT服务器连接信息,我们在连接信息生成器中获得这些信息。并将这些信息保存下来作为等会连接使用。 3.配置MQTT连接信息,设置等待时间,以及设置消息回调函数。
connlost, msgarrvd, delivered是三个回调函数,分别当MQTT断开连接,MQTT接收消息,MQTT发送确认之后调用。
#define ADDRESS "agcqeqz.iot.gz.baidubce.com" #define CLIENTID "TEST1" #define TOPIC "One" #define PAYLOAD "TEST1" #define QOS 0 #define USERNAME "thingidp@agcqeqz|Test1|0|MD5" #define PASSWORD "b0fcc0100018a7b8db847f916fbedf7f"
MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = USERNAME;
conn_opts.password = PASSWORD;
MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n", TOPIC, CLIENTID, QOS);
MQTTClient_subscribe(client, TOPIC, QOS);
while (1);
运行上述代码,打开用量统计可以看见MQTT连接成功,我们接下来来编辑消息响应函数。我们将消息变量中的值存入payloadptr变量中,之后打印这个变量的值,这样子当有一个设备发送消息的时候,就可以触发这个函数打印消息了。
int msgarrvd(void* context, char* topicName, int topicLen, MQTTClient_message* message)
{
printf("Message arrived\r\n");
printf(" topic: %s\r\n", topicName);
printf(" message: ");
char* payloadptr = static_cast(message->payload);
cout<< payloadptr<

在设备中,我们选择模拟设备,点击开始模拟。订阅主题选择之前模板中(上一篇公众号提过)设置的主题,我这里是One,注意的是程序中的Topic 宏定义要一样


接下来我们选择我们需要的主题,发送我们的信息,我们发现我们的程序控制台上也成功接收到了我们发送的信息。
4.配置发送函数。
我们在主函数中设置输入,当我们有输入时我们即向云端发送数据。
while (1)
{
char cinn[256];
cout << "Please put your message:";
cin >> cinn;
if (strcmp(cinn, "exit") == 1)
{
exit(0);
}
MQTTClient_publish(client, TOPIC, strlen(cinn), cinn, QOS, 0, NULL);
}
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
不知道为什么我发送空格就会分成几段(我在研究一下),可以看出我们设备发送的消息也会被设备本身所接受,所以我们发送信息的时候应当包含更多的信息,比方说时间戳、设备ID等等信息,但是由于本文章只起演示作用就不多展示。


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!