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.pswp.cn/pingmian/84231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中的系统库(简介、performance_schema)

文章目录 性能监控performance_schema1、performance schema入门2、performance_schema表的分类3、performance_schema的简单配置与使用4、常用配置项的参数说明5、重要配置表的相关说明6、performance_schema实践操作 Show processlist 性能监控 每次你提交完一个 sql 语句之…

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…

bug 记录 - 使用 el-dialog 的 before-close 的坑

需求说明 弹窗中内嵌一个 form 表单 原始代码 <script setup lang"ts"> import { reactive, ref } from "vue" import type { FormRules } from element-plus const ruleFormRef ref() interface RuleForm {name: stringregion: number | null } …

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…

老年生活照护实训室建设规划:照护质量评估与持续改进实训体系

随着人口老龄化程度的不断加深&#xff0c;老年生活照护需求日益增长&#xff0c;对专业照护人才的培养提出了更高要求。老年生活照护实训室建设方案作为培养高素质照护人才的重要载体&#xff0c;其核心在于构建科学完善的照护质量评估与持续改进实训体系。通过该体系的建设&a…

Ctrl-Crash 助力交通安全:可控生成逼真车祸视频,防患于未然

视频扩散技术虽发展显著&#xff0c;但多数驾驶数据集事故事件少&#xff0c;难以生成逼真车祸图像&#xff0c;而提升交通安全又急需逼真可控的事故模拟。为此&#xff0c;论文提出可控车祸视频生成模型 Ctrl-Crash&#xff0c;它以边界框、碰撞类型、初始图像帧等为条件&…

jieba实现和用RNN实现中文分词的区别

Jieba 分词和基于 RNN 的分词在技术路线、实现机制、性能特点上有显著差异&#xff0c;以下是核心对比&#xff1a; 1. 技术路线对比 维度Jieba 分词RNN 神经网络分词范式传统 NLP&#xff08;规则 统计&#xff09;深度学习&#xff08;端到端学习&#xff09;核心依赖词典…

excel数据对比找不同:6种方法核对两列数据差异

工作中&#xff0c;有时需要核对两列数据的差异&#xff0c;用于对比、复核等。数据较少的情况下差异肉眼可见&#xff0c;数据量较大时用什么方法比较好呢&#xff1f;从个人习惯出发&#xff0c;我整理了6种方法供参考。 6种方法核对两列数据差异&#xff1a; 1、Ctrl G定位…

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …

刷题记录(7)二叉树

一、单值二叉树 二叉树为二叉链表形式&#xff0c;结点为&#xff1a; 大概看看题就知道这道题让我们判断一个树到底所有结点的值是不是相同&#xff0c;相同就是单值二叉树。在实现二叉树相关操作的时候已经体会到了&#xff0c;递归来遍历二叉树是非常舒服的&#xff08;做这…

开源:FTP同步工具

文章目录 简介功能特性Windows (EXE)从源代码构建依赖项Linux 构建Windows 构建 使用方法软件截图主界面FTP 设置快捷菜单定时设置 配置说明开发与贡献许可证 欢迎来到盹猫的博客 本篇文章主要介绍了 [开源:FTP同步工具] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注…

视频质量测试点

目录 功能/UI 端侧性能 媒体质量 主观 客观 稳定性 兼容性 功能/UI 视频预览音频预览音视频同步全屏收藏打赏 端侧性能 PC端&#xff1a;内存占用、网络带宽占用等&#xff1b; 移动端&#xff1a;内存占用、功耗、发热、流量消耗等&#xff1b; 媒体质量 主观 音…

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…

【C/C++】高效的位操作

位运算&#xff08;Bitwise Operation&#xff09;是直接对整数的二进制位进行操作的运算方式&#xff0c;在底层开发、性能优化、算法设计中广泛使用。 1 基本位运算符及含义 运算符名称示例&#xff08;a5, b3&#xff09;运算过程&#xff08;二进制&#xff09;结果&按…