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 注册 connlostmsgarrvddelivered,然后 MQTTClient_connectMQTTClient_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_createMQTTClient_connectMQTTClient_publishMessage / MQTTClient_subscribeMQTTClient_waitForCompletion(发布时)→ MQTTClient_disconnectMQTTClient_destroy。订阅时用 MQTTClient_setCallbacks 注册消息与连接丢失回调。

异步 (MQTTAsync)
MQTTAsync_createMQTTAsync_setCallbacks(可选)→ MQTTAsync_connect(带 onSuccess/onFailure)→ 在回调里 MQTTAsync_sendMessageMQTTAsync_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 或需要高并发的场景。

相关推荐
破烂pan1 小时前
Python 实现 HTTP Client 的常见方式
开发语言·python·http
宁酱醇1 小时前
ORACLE 练习1
java·开发语言
HAPPY酷1 小时前
现代 C++ 并发服务器的核心模式
服务器·开发语言·c++
康小庄2 小时前
Java自旋锁与读写锁
java·开发语言·spring boot·python·spring·intellij-idea
Hello World . .2 小时前
Linux:线程(thread)
linux·开发语言·vscode
良木生香2 小时前
【C++初阶】C++入门相关知识(1):C++历史 & 第一个C++程序 & 命名空间
c语言·开发语言·c++
黎雁·泠崖2 小时前
【魔法森林冒险】11/14 战斗系统(二):多波战斗与BOSS战
java·开发语言
csbysj20204 小时前
PHP Mail - 发送邮件的最佳实践指南
开发语言
jdbcaaa4 小时前
Go 语言 runtime 包的使用与注意事项
开发语言·后端·golang·runtime