当前位置: 首页 > backend >正文

MQTT示例体验(C)

1、通用依赖准备

  1. 安装编译工具
    Linux/macOS 需安装:

    
    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 开发库:

    sudo apt install libssl-dev # Linux:ml-citation{ref="4" data="citationList"}


⚙️ 源码编译安装(跨平台)

# 克隆仓库 
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)

sudo apt update sudo apt install libpaho-mqtt-dev # Ubuntu/Debian:ml-citation{ref="4,6" data="citationList"}

✅ 验证安装

创建测试程序 test.c

#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;
}

编译运行:

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语言代码实现

#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;
}

🔧 ‌编译与运行

# 编译(需已安装Paho MQTT C库)
gcc mqtt_example.c -o mqtt_demo -lpaho-mqtt3c# 运行
./mqtt_demo

📜 ‌运行结果示例

🔗 已连接至MQTT代理
📥 已订阅主题: test/topic
📤 已发布消息到 test/topic⏳ 等待接收消息 (按Enter退出)...
✅ 收到消息!主题: test/topic内容: Hello from C MQTT Publisher

http://www.xdnf.cn/news/13243.html

相关文章:

  • LangChain4j(18)——通过Xinference调用Rerank模型
  • 打卡Day49
  • Windows11+VS2019配置Libigl-2.4.1
  • EasyImage实战:结合内网穿透技术实现私有图床部署过程
  • DBLP数据库是什么?
  • 如何用 esProc SPL 操作大 csv
  • Linux【5】-----编译和烧写Linux系统镜像(RK3568)
  • MIPI信号为什么不能进行长距离传输
  • 相关类可视化图像总结
  • 第二十三课:手搓随机森林
  • 基于PSO与BP神经网络分类模型的特征选择实战(Python实现)
  • C语言中提供的第三方库之哈希表实现
  • 比较数据迁移后MySQL数据库和达梦数据库中的表
  • 深入实战多平台抓包:Sniffmaster与常见抓包工具协同利器解析
  • 前端绘制道路鱼骨图
  • 502的普通频谱参数设置
  • 红外测温传感器如何提升智能制造水平?
  • 学习时困了怎么办
  • 2020年IS SCI2区,多样本和遗忘能力粒子群算法XPSO,深度解析+性能实测
  • Python打卡day49!!!
  • 【精彩回顾.上海交通大学专场】---大模型推理需求下的计算生态链变革
  • “概率鹦鹉”难解语义等价验证的NPC难题: 从技术本质看LLM在SQL优化任务中的致命缺陷
  • 高并发内存池的轻量级模拟-细节处理与优化部分
  • 多协议诱骗电压芯片优势,如何防止负载太大而导致充电器复位重启
  • DisplayPort 2.0协议介绍(2)
  • JavaScript 标签加载
  • AI知识库调用全攻略:四种实战方法与技术实现
  • c++第七天 继承与派生2
  • 安全编程期末复习12(红色重点向下兼容)
  • 河南建筑安全员C证考试常见题及答案解析