1、通用依赖准备
-
安装编译工具
Linux/macOS 需安装:
bashsudo apt update && sudo apt install build-essential cmake git # Ubuntu/Debian:ml-citation{ref="6" data="citationList"} brew install cmake # macOS
-
可选 SSL/TLS 支持
如需加密通信,安装 OpenSSL 开发库:
bashsudo apt install libssl-dev # Linux:ml-citation{ref="4" data="citationList"}
⚙️ 源码编译安装(跨平台)
bash
# 克隆仓库
git clone https://github.com/eclipse/paho.mqtt.c.git:ml-citation{ref="1,6" data="citationList"}
# 创建构建目录
cd paho.mqtt.c mkdir build && cd build
# 配置编译选项
cmake .. -DPAHO_WITH_SSL=ON # 启用SSL加密:ml-citation{ref="4,6" data="citationList"}
# Windows/macOS 省略 sudo
# 编译并安装
make sudo make install # Linux/macOS:ml-citation{ref="1,4" data="citationList"}
🐧 Linux 快捷安装(APT)
bash
sudo apt update sudo apt install libpaho-mqtt-dev # Ubuntu/Debian:ml-citation{ref="4,6" data="citationList"}
✅ 验证安装
创建测试程序 test.c
:
bash
#include <stdio.h>
#include <MQTTClient.h> // 关键头文件:ml-citation{ref="4" data="citationList"}
int main() {
MQTTClient client;
MQTTClient_create(&client, "tcp://broker.hivemq.com:1883", "test-client", MQTTCLIENT_PERSISTENCE_NONE, NULL);
printf("Library loaded successfully!\n");
MQTTClient_destroy(&client);
return 0;
}
编译运行:
bash
gcc test.c -o test -lpaho-mqtt3c # 链接动态库:ml-citation{ref="4" data="citationList"}
./test
2、示例代码实现
🔧 核心步骤概述
- 初始化MQTT客户端
- 创建客户端实例并配置连接参数
- 设置回调函数
- 处理消息接收、连接丢失等事件
- 连接MQTT代理
- 建立与MQTT服务器的TCP连接
- 订阅目标主题
- 指定主题名
test/topic
及QoS级别
- 指定主题名
- 发布消息到主题
- 向
test/topic
发送消息内容
- 向
⚡ C语言代码实现
bash
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h>
#define ADDRESS "tcp://broker.hivemq.com:1883" // 公共MQTT代理:ml-citation{ref="6" data="citationList"}
#define CLIENTID "C_Client_Example"
#define TOPIC "test/topic" // 目标主题名:ml-citation{ref="6" data="citationList"}
#define QOS 1 // 服务质量级别:ml-citation{ref="5" data="citationList"}
#define TIMEOUT 10000L // 超时时间(毫秒)
/* 消息到达回调函数 */
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
printf("✅ 收到消息!\n");
printf(" 主题: %s\n", topicName);
printf(" 内容: %.*s\n\n", message->payloadlen, (char*)message->payload);
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);
return 1;
}
/* 连接丢失回调 */
void connlost(void *context, char *cause) {
printf("❌ 连接断开:%s\n", cause);
}
int main() {
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
int rc;
// 1. 初始化客户端
if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, "创建客户端失败:错误码 %d\n", rc);
exit(EXIT_FAILURE);
}
// 2. 配置回调函数
if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, NULL)) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, "设置回调失败:错误码 %d\n", rc);
exit(EXIT_FAILURE);
}
// 3. 连接代理
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, "连接失败:错误码 %d\n", rc);
exit(EXIT_FAILURE);
}
printf("🔗 已连接至MQTT代理\n");
// 4. 订阅主题
if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, "订阅失败:错误码 %d\n", rc);
exit(EXIT_FAILURE);
}
printf("📥 已订阅主题: %s\n", TOPIC);
// 5. 发布消息
char* payload = "Hello from C MQTT Publisher";
MQTTClient_message pubmsg = MQTTClient_message_initializer;
pubmsg.payload = payload;
pubmsg.payloadlen = strlen(payload);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_deliveryToken token;
if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) {
fprintf(stderr, "发布失败:错误码 %d\n", rc);
exit(EXIT_FAILURE);
}
printf("📤 已发布消息到 %s\n", TOPIC);
// 保持运行以接收消息
printf("\n⏳ 等待接收消息 (按Enter退出)...\n");
getchar();
// 清理资源
MQTTClient_unsubscribe(client, TOPIC);
MQTTClient_disconnect(client, TIMEOUT);
MQTTClient_destroy(&client);
return 0;
}
🔧 编译与运行
bash
# 编译(需已安装Paho MQTT C库)
gcc mqtt_example.c -o mqtt_demo -lpaho-mqtt3c
# 运行
./mqtt_demo
📜 运行结果示例
bash
🔗 已连接至MQTT代理
📥 已订阅主题: test/topic
📤 已发布消息到 test/topic
⏳ 等待接收消息 (按Enter退出)...
✅ 收到消息!
主题: test/topic
内容: Hello from C MQTT Publisher