MQTT C语言来订阅消息
时间: 2023-07-01 20:10:13 浏览: 267
订阅 MQTT 消息主要涉及以下步骤:
1. 初始化 MQTT 客户端:为 MQTT 客户端分配内存空间并设置相关参数,如服务器地址、端口号、客户端 ID 等。
2. 连接 MQTT 服务器:使用初始化后的 MQTT 客户端连接到 MQTT 服务器。
3. 订阅主题:使用 MQTT 客户端订阅感兴趣的主题。
4. 处理消息:当 MQTT 服务器有新的消息到来时,MQTT 客户端会调用用户定义的回调函数进行消息处理。
下面是一个简单的 MQTT 订阅示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "ExampleClientSub"
#define TOPIC "test"
#define QOS 1
#define TIMEOUT 10000L
volatile MQTTClient_deliveryToken deliveredtoken;
void delivered(void *context, MQTTClient_deliveryToken dt) {
printf("Message with token value %d delivery confirmed\n", dt);
deliveredtoken = dt;
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
printf("Message arrived\n");
printf(" topic: %s\n", topicName);
printf(" message: ");
char* payloadptr = (char*) message->payload;
for(int i=0; i<message->payloadlen; i++) {
putchar(*payloadptr++);
}
putchar('\n');
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);
return 1;
}
void connlost(void *context, char *cause) {
printf("\nConnection lost\n");
printf(" cause: %s\n", cause);
}
int main(int argc, char* argv[]) {
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
int rc;
MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
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(-1);
}
MQTTClient_subscribe(client, TOPIC, QOS);
printf("Subscribed to topic %s\nWaiting for messages...\n", TOPIC);
while(1) {}
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return rc;
}
```
在这个示例中,我们使用 Eclipse Paho MQTT C 客户端库来实现 MQTT 客户端。在 `main` 函数中,我们首先创建了一个 MQTT 客户端对象,并设置连接选项。然后,我们使用 `MQTTClient_setCallbacks` 函数将消息回调函数和连接丢失回调函数设置为 `msgarrvd` 和 `connlost`,并使用 `MQTTClient_connect` 函数连接到 MQTT 服务器。接着,我们使用 `MQTTClient_subscribe` 函数订阅 `test` 主题。最后,我们进入一个无限循环,等待消息到来,并在消息到来时调用 `msgarrvd` 函数进行处理。当程序退出循环时,我们使用 `MQTTClient_disconnect` 函数断开 MQTT 连接,并释放相关资源。
阅读全文