Paho MQTT C 开发者快速入门

Paho MQTT C 开发者快速入门

精简版快速入门,只保留核心概念与上手步骤。安装与从源码构建、同步/异步 API 详解、持久化、SSL/TLS、连接选项、性能优化等详见 Paho_MQTT_C完整文档.md。

目录

  1. [一句话了解 Paho MQTT C](#一句话了解 Paho MQTT C)
  2. [两种 API:同步 vs 异步](#两种 API:同步 vs 异步)
  3. 库变体怎么选
  4. [5 分钟上手](#5 分钟上手)
  5. 编译与链接
  6. [常用 API 速览](#常用 API 速览)
  7. [QoS 与传输选项](#QoS 与传输选项)
  8. 下一步
  9. 常见问题

1. 一句话了解 Paho MQTT C

Paho MQTT C 是 Eclipse 官方的 C 语言 MQTT 客户端库 :支持 MQTT v3.1.1 与 v5.0,提供同步 (MQTTClient) 和异步 (MQTTAsync) 两套 API,可连接任意 MQTT 代理进行发布/订阅,带持久化、SSL/TLS、WebSocket 等,适合嵌入式、Linux/Windows/macOS 及 Android。

为什么用?

  • 官方维护、协议支持全(含 MQTT 5 特性)
  • 同步 API 简单阻塞,异步 API 回调驱动不卡主线程
  • 四种库变体(同步/异步 × 是否 SSL)按需选择
  • 跨平台:Linux、Windows、macOS、嵌入式、Android NDK

2. 两种 API:同步 vs 异步

类型 头文件/库 特点 适用场景
同步 MQTTClient.h / paho-mqtt3c 阻塞调用,写法简单 脚本、简单工具、可阻塞场景
异步 MQTTAsync.h / paho-mqtt3a 非阻塞、回调 GUI、移动端、高并发
  • 同步 :MQTTClient_connect()、MQTTClient_publishMessage() 等会阻塞直到完成或超时。
  • 异步 :MQTTAsync_connect()、MQTTAsync_sendMessage() 立即返回,结果通过 onSuccess/onFailure 等回调通知,主线程可保持响应。

3. 库变体怎么选

库名 API SSL/TLS 说明
paho-mqtt3c 同步 否 普通 TCP
paho-mqtt3cs 同步 是 需加密时用
paho-mqtt3a 异步 否 非阻塞普通连接
paho-mqtt3as 异步 是 非阻塞 + 加密

按「是否要阻塞」和「是否要 SSL」选一个即可。


4. 5 分钟上手

4.1 安装

bash 复制代码
# Debian/Ubuntu
sudo apt-get install libpaho-mqtt-dev

# macOS
brew install paho-mqtt

或从源码构建(需 SSL 时加 -DPAHO_WITH_SSL=TRUE):

bash 复制代码
git clone https://github.com/eclipse-paho/paho.mqtt.c.git
cd paho.mqtt.c && mkdir build && cd build
cmake .. -DPAHO_BUILD_SHARED=TRUE -DPAHO_WITH_SSL=TRUE
make && sudo make install

4.2 最简发布(同步)

c 复制代码
#include "MQTTClient.h"
#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883"
#define CLIENTID "ExampleClientPub"
#define TOPIC   "MQTT Examples"

// 创建 → 连接 → 发消息 → 等待完成 → 断开
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;

MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
MQTTClient_connect(client, &conn_opts);

pubmsg.payload = "Hello World!";
pubmsg.payloadlen = (int)strlen("Hello World!");
pubmsg.qos = 1;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
MQTTClient_waitForCompletion(client, token, 10000);

MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);

4.3 订阅(同步)

MQTTClient_setCallbacks 注册 connlost、msgarrvd、delivered,然后 MQTTClient_connect、MQTTClient_subscribe,在 msgarrvd 里处理收到的消息。

4.4 命令行测试

bash 复制代码
# 订阅
paho_c_sub -t "test/topic" -h mqtt.eclipseprojects.io

# 发布(另开终端)
paho_c_pub -t "test/topic" -m "Hello" -h mqtt.eclipseprojects.io

5. 编译与链接

使用 API 链接库
同步 -lpaho-mqtt3c(SSL 版用 paho-mqtt3cs)
异步 -lpaho-mqtt3a(SSL 版用 paho-mqtt3as)
bash 复制代码
gcc -o pub MQTTClient_publish.c -lpaho-mqtt3c
gcc -o sub MQTTClient_subscribe.c -lpaho-mqtt3c
gcc -o async_pub MQTTAsync_publish.c -lpaho-mqtt3a

6. 常用 API 速览

同步 (MQTTClient)
MQTTClient_create → MQTTClient_connect → MQTTClient_publishMessage / MQTTClient_subscribe → MQTTClient_waitForCompletion(发布时)→ MQTTClient_disconnect → MQTTClient_destroy。订阅时用 MQTTClient_setCallbacks 注册消息与连接丢失回调。

异步 (MQTTAsync)
MQTTAsync_create → MQTTAsync_setCallbacks(可选)→ MQTTAsync_connect(带 onSuccess/onFailure)→ 在回调里 MQTTAsync_sendMessage 或 MQTTAsync_subscribe → 最后 MQTTAsync_destroy。


7. QoS 与传输选项

  • QoS 0:最多一次(发完即忘)
  • QoS 1:至少一次(需 ACK)
  • QoS 2:恰好一次(四步握手)

URI 方案 :tcp:// / mqtt://(明文)、ssl:// / mqtts://(TLS)、ws:// / wss://(WebSocket)、unix://(本机 Unix 套接字)。


8. 下一步


9. 常见问题

现象 可能原因 处理
链接错误 未链接对应库 同步用 -lpaho-mqtt3c,异步用 -lpaho-mqtt3a,SSL 用 3cs/3as
连接失败 地址/端口/网络错误 检查 broker 地址与防火墙,可用 paho_c_pub/sub 先测
收不到消息 未订阅或主题不对 确认 subscribe 的 topic 与发布一致,注意通配符
SSL 编译失败 未装 OpenSSL 或未开选项 安装 openssl-dev,CMake 加 -DPAHO_WITH_SSL=TRUE

提示:同步 API 在回调里不要做耗时操作,以免阻塞库线程;异步 API 适合 GUI 或需要高并发的场景。

相关推荐
夏幻灵5 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码5 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx7 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆7 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光7 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西8 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨8 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
SuperByteMaster9 小时前
wfi进入之前没有清除basepri, 导致中断优先级不够,wfi 退不出来
c语言
徐小黑ACG9 小时前
Golang 基础05 结构体struct
开发语言·算法·golang