Raspberry Pi 5 安装 MTPP客户端

在树莓派 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值