libmosquitto 是一个用于实现 MQTT 协议的 C 语言客户端库,它允许开发者在应用程序中集成 MQTT 功能,进行消息的发布和订阅。以下是 libmosquitto 库的基本用法和代码示例:
1. 初始化和清理
在使用 libmosquitto 之前,需要初始化库,并在程序结束时清理资源:
mosquitto_lib_init(); // 初始化 libmosquitto 库
// ... 代码 ...
mosquitto_lib_cleanup(); // 清理 libmosquitto 库
2. 创建和配置客户端
创建一个新的 MQTT 客户端实例,并设置相关回调函数:
struct mosquitto *mosq = mosquitto_new(NULL, true, NULL); // 创建客户端实例
mosquitto_connect_callback_set(mosq, my_connect_callback); // 设置连接回调
mosquitto_message_callback_set(mosq, my_message_callback); // 设置消息回调
3. 连接到 MQTT 代理
连接到 MQTT 代理服务器:
int ret = mosquitto_connect(mosq, "localhost", 1883, 60); // 连接到本地 MQTT 代理
if (ret != MOSQ_ERR_SUCCESS) {
fprintf(stderr, "Unable to connect.\n");
return 1;
}
4. 订阅主题
订阅一个或多个 MQTT 主题:
mosquitto_subscribe(mosq, NULL, "my/topic", 0); // 订阅 "my/topic" 主题
5. 发布消息
发布消息到指定的主题:
mosquitto_publish(mosq, NULL, "my/topic", strlen("Hello World"), "Hello World", 0, 0);
6. 网络循环处理
启动网络循环,处理 MQTT 网络事件:
mosquitto_loop_start(mosq); // 启动网络循环
// ... 代码 ...
mosquitto_loop_stop(mosq, true); // 停止网络循环
7. 断开连接和销毁客户端
在程序结束时,断开与 MQTT 代理的连接,并销毁客户端实例:
mosquitto_disconnect(mosq); // 断开连接
mosquitto_destroy(mosq); // 销毁客户端实例
完整的客户端示例代码
以下是一个完整的 MQTT 客户端示例代码,包括订阅和发布功能:
#include <stdio.h>
#include <stdlib.h>
#include <mosquitto.h>
#define HOST "localhost"
#define PORT 1883
#define KEEP_ALIVE 60
void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
if (message->payloadlen) {
printf("%s %s\n", message->topic, message->payload);
} else {
printf("%s (null)\n", message->topic);
}
fflush(stdout);
}
void my_connect_callback(struct mosquitto *mosq, void *userdata, int result) {
if (!result) {
mosquitto_subscribe(mosq, NULL, "my/topic", 0);
} else {
fprintf(stderr, "Connect failed\n");
}
}
int main() {
struct mosquitto *mosq;
mosquitto_lib_init();
mosq = mosquitto_new(NULL, true, NULL);
if (!mosq) {
fprintf(stderr, "Error: Out of memory.\n");
return 1;
}
mosquitto_connect_callback_set(mosq, my_connect_callback);
mosquitto_message_callback_set(mosq, my_message_callback);
if (mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE)) {
fprintf(stderr, "Unable to connect.\n");
return 1;
}
mosquitto_loop_forever(mosq, -1, 1);
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return 0;
}
在编译程序时,需要链接 libmosquitto 库:
gcc -o mosquitto_client mosquitto_client.c -lmosquitto -lpthread
以上代码展示了如何使用 libmosquitto 库创建一个 MQTT 客户端,连接到 MQTT 代理,订阅和接收消息。