MQTT示例体验(C)

1、通用依赖准备

  1. 安装编译工具 ‌

    Linux/macOS 需安装:

    bash 复制代码
    sudo apt update && sudo apt install build-essential cmake git  # Ubuntu/Debian:ml-citation{ref="6" data="citationList"}
    brew install cmake  # macOS

    Windows 需安装 CMake 和 MinGW。

  2. ‌可选 SSL/TLS 支持 ‌

    如需加密通信,安装 OpenSSL 开发库:

    bash 复制代码
    sudo 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、示例代码实现

🔧 ‌核心步骤概述‌

  1. ‌初始化MQTT客户端 ‌
    • 创建客户端实例并配置连接参数
  2. ‌设置回调函数 ‌
    • 处理消息接收、连接丢失等事件
  3. ‌连接MQTT代理 ‌
    • 建立与MQTT服务器的TCP连接
  4. ‌订阅目标主题 ‌
    • 指定主题名test/topic及QoS级别
  5. ‌发布消息到主题 ‌
    • 向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
相关推荐
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所1 小时前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人1 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
weixin199701080161 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子1 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
xuxigifxfh2 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i2 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
野生技术架构师2 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
殷色玫瑰2 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
小师兄吃牛肉3 小时前
Java语法 | 多重循环
java·开发语言·python