在树莓派 5 上使用 C/C++ 开发 MQTT 客户端功能,需要先安装 MQTT 库,然后编写代码实现连接、发布、订阅等功能。以下是详细步骤和示例代码:
一、 更新包列表并安装依赖
sudo apt update
sudo apt install build-essential cmake libssl-dev -y
- build-essential:这是一组基本的编译工具和库的元包,包含了构建 C 和 C++ 程序所需的 gcc(GNU 编译器集合)、make(构建自动化工具)等工具,对于开发和编译软件项目至关重要。
- cmake:这是一个跨平台的构建自动化工具,它可以根据不同的操作系统和编译器,生成相应的 Makefile 或其他项目文件,方便开发者进行项目的构建和管理。
- libssl-dev:这是 OpenSSL 库的开发文件包,OpenSSL 是一个强大的安全套接字层密码库,提供了对 SSL 和 TLS 协议的支持。安装这个包,开发人员可以在编写程序时使用 OpenSSL 提供的加密、解密、证书验证等功能。
- -y:这是一个选项参数,它会自动回答安装过程中的所有确认问题为 “是”,使得安装过程无需用户手动确认,自动完成安装。
二、下载Paho MQTT C库源码编译
# 克隆Paho MQTT C库源码
git clone https://github.com/eclipse/paho.mqtt.c.git
- 本地有提前下好的压缩包
1. 系统级目录(需管理员权限)
适用于全局安装,所有用户均可使用:
# 如果不存在创建工作目录
sudo mkdir -p /usr/local/src
cd /usr/local/src
mv ~/paho.mqtt.c.tar.gz ./
sudo tar -zxvf ./paho.mqtt.c.tar.gz
cd paho.mqtt.c
2. 用户级目录(无需管理员权限)
适用于仅当前用户使用的开发环境:
# 创建工作目录
mkdir -p ~/src
cd ~/src
# 下载并解压
tar -zxvf ~/paho.mqtt.c.tar.gz
cd paho.mqtt.c
三、编译与安装步骤
1.系统级目录需 sudo
# 创建并进入构建目录
sudo mkdir -p build && cd build
# 配置 CMake(添加高性能和静态库选项)
sudo cmake -DPAHO_WITH_SSL=TRUE \
-DPAHO_BUILD_SAMPLES=TRUE \
-DPAHO_BUILD_STATIC=TRUE \
-DPAHO_HIGH_PERFORMANCE=TRUE \
..
# 编译(自动检测 CPU 核心数)
sudo make -j$(nproc)
# 安装
sudo make install
# 更新动态链接库缓存
sudo ldconfig
- 静态库支持:-DPAHO_BUILD_STATIC=TRUE
- 启用 SSL 支持(推荐):
-
DPAHO_
WITH_
SSL=
ON:- 启用高性能模式:-DPAHO_HIGH_PERFORMANCE=TRUE
- 包含并编译 Paho MQTT C 库提供的示例代码:-DPAHO_BUILD_SAMPLES=TRUE
- 指定安装路径(默认就是
/usr/local
):-DCMAKE_INSTALL_PREFIX=/usr/local,可省略- 自动检测 CPU 核心数:make -j$(nproc)
2.更新动态链接库缓存
动态链接问题解决方案
临时方案(当前终端有效):
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
永久方案(推荐):
# 创建配置文件
sudo nano /etc/ld.so.conf.d/paho-mqtt.conf
# 在文件中添加库路径(例如)
/usr/local/lib
# 刷新动态链接库缓存
sudo ldconfig
如果选择用户级安装,需配置环境变量
1. 添加库路径
echo 'export LD_LIBRARY_PATH="$HOME/.local/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc source ~/.bashrc
2. 添加头文件搜索路径(开发时需要)
echo 'export CPATH="$HOME/.local/include:$CPATH"' >> ~/.bashrc source ~/.bashrc
source ~/.bashrc
四、 验证安装
# 检查库文件
ls /usr/local/lib/libpaho-mqtt3*
# 检查头文件
ls /usr/local/include/MQTTClient.h
五、使用示例
编译依赖 Paho MQTT C 库的程序:
# 系统级安装
gcc your_program.c -o your_program -lpaho-mqtt3c -lpaho-mqtt3cs
# 用户级安装
gcc your_program.c -o your_program -I$HOME/.local/include -L$HOME/.local/lib -lpaho-mqtt3c -lpaho-mqtt3cs
六、代码
1. 异步模式示例(非阻塞通信)
#include "MQTTAsync.h"
#define ADDRESS "mqtts://broker.example.com:8883" // SSL连接URI
#define CLIENTID "RPi5_AsyncClient"
#define TOPIC "home/device/pi5"
#define QOS 1
#define TIMEOUT 10000L
void on_success(void* context, MQTTAsync_successData* response) {
printf("Message published successfully\n");
}
void on_failure(void* context, MQTTAsync_failureData* response) {
printf("Message publish failed: %s\n", response->errorMessage->message);
}
int main() {
MQTTAsync client;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
MQTTAsync_message msg = MQTTAsync_message_initializer;
MQTTAsync_responseOptions resp_opts = MQTTAsync_responseOptions_initializer;
int rc;
// 创建异步客户端
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// 配置SSL选项(需提前安装OpenSSL)
MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer;
ssl_opts.trustStore = "/path/to/ca.crt"; // CA证书路径
conn_opts.ssl = &ssl_opts;
conn_opts.automaticReconnect = TRUE; // 启用自动重连
// 连接到代理
MQTTAsync_setCallbacks(client, NULL, NULL, NULL, NULL);
if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) {
printf("Connect failed: %d\n", rc);
return rc;
}
// 发布消息(异步模式)
msg.payload = "Hello from Raspberry Pi 5!";
msg.payloadlen = strlen(msg.payload);
msg.qos = QOS;
msg.retained = 0;
resp_opts.onSuccess = on_success;
resp_opts.onFailure = on_failure;
resp_opts.context = client;
MQTTAsync_publishMessage(client, TOPIC, &msg, &resp_opts);
MQTTAsync_waitForCompletion(client, TIMEOUT);
// 断开连接
MQTTAsync_disconnect(client, TIMEOUT);
MQTTAsync_destroy(&client);
return 0;
}
2. SSL/TLS 连接关键配置
- CMake 编译时启用 SSL:确保
PAHO_WITH_SSL=TRUE
,并安装libssl-dev
。 - 代码中配置证书
MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
ssl_opts.trustStore = "/etc/ssl/certs/ca-certificates.crt"; // 系统CA证书路径
conn_opts.ssl = &ssl_opts;
conn_opts.ssl->enableServerCertAuth = 1; // 验证服务器证书
3.高级功能与最佳实践
1) 持久会话与遗嘱消息
// 设置持久会话(断开后保留订阅关系)
conn_opts.cleansession = 0;
// 设置遗嘱消息(客户端异常断开时发布)
MQTTClient_willOptions will = MQTTClient_willOptions_initializer;
will.topicName = "client/status";
will.message = "RPi5 disconnected";
will.qos = 1;
conn_opts.will = &will;
2)动态主题与通配符订阅
通配符示例:订阅所有以home/
开头的主题
MQTTClient_subscribe(client, "home/#", QOS); // 同步模式
MQTTAsync_subscribe(client, "home/#", QOS, NULL); // 异步模式
3)内存管理与调试
启用运行时追踪:通过环境变量调试库行为
export MQTT_C_CLIENT_TRACE=ON # 启用追踪(输出到stdout或文件)
export MQTT_C_CLIENT_TRACE_LEVEL=PROTOCOL # 追踪级别(ERROR/PROTOCOL/MINIMUM等)
使用 valgrind 检测内存泄漏:
valgrind --tool=memcheck --leak-check=full ./your_mqtt_app
4)系统服务化
将 MQTT 客户端程序封装为 systemd 服务,确保开机自启:
sudo nano /etc/systemd/system/mqtt-client.service
[Unit]
Description=RPi5 MQTT Client
After=network.target mosquitto.service
[Service]
ExecStart=/usr/local/bin/mqtt_client # 替换为实际程序路径
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now mqtt-client.service