在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT

embedded/2025/3/26 6:12:55/

在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT 通信是一个常见的需求,尤其是在资源受限的环境中。以下是一个详细的教程,使用 Eclipse Paho C Client 库来实现 MQTT 客户端。


1. 安装 Eclipse Paho C Client 库

Eclipse Paho C Client 是一个轻量级的 MQTT 客户端库,适合嵌入式系统。

安装依赖

在 ARM 嵌入式 Linux 中,首先安装必要的依赖:

sudo apt update
sudo apt install build-essential cmake libssl-dev
下载和编译 Paho C Client
  1. 下载 Paho C Client 源码:
    git clone https://github.com/eclipse/paho.mqtt.c.git
    cd paho.mqtt.c
    
  2. 编译并安装:
    cmake -Bbuild -H. -DPAHO_WITH_SSL=OFF
    make -C build
    sudo make -C build install
    

2. 编写 MQTT 客户端代码

以下是一个简单的 MQTT 客户端示例,包括订阅和发布功能。

代码:mqtt_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "arm_mqtt_client"
#define TOPIC       "test/topic"
#define PAYLOAD     "Hello from ARM MQTT Client!"
#define QOS         1
#define TIMEOUT     10000L// 收到消息的回调函数
void messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message) {printf("Message arrived on topic: %s\n", topicName);printf("Payload: %.*s\n", message->payloadlen, (char *)message->payload);MQTTClient_freeMessage(&message);MQTTClient_free(topicName);
}int main() {MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;// 创建 MQTT 客户端rc = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);if (rc != MQTTCLIENT_SUCCESS) {printf("Failed to create client, return code: %d\n", rc);exit(EXIT_FAILURE);}// 设置消息到达回调rc = MQTTClient_setCallbacks(client, NULL, NULL, messageArrived, NULL);if (rc != MQTTCLIENT_SUCCESS) {printf("Failed to set callbacks, return code: %d\n", rc);MQTTClient_destroy(&client);exit(EXIT_FAILURE);}// 连接 MQTT 代理conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;rc = MQTTClient_connect(client, &conn_opts);if (rc != MQTTCLIENT_SUCCESS) {printf("Failed to connect, return code: %d\n", rc);MQTTClient_destroy(&client);exit(EXIT_FAILURE);}// 订阅主题rc = MQTTClient_subscribe(client, TOPIC, QOS);if (rc != MQTTCLIENT_SUCCESS) {printf("Failed to subscribe, return code: %d\n", rc);MQTTClient_disconnect(client, TIMEOUT);MQTTClient_destroy(&client);exit(EXIT_FAILURE);}printf("Subscribed to topic: %s\n", TOPIC);// 发布消息MQTTClient_message pubmsg = MQTTClient_message_initializer;pubmsg.payload = (void *)PAYLOAD;pubmsg.payloadlen = strlen(PAYLOAD);pubmsg.qos = QOS;pubmsg.retained = 0;rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, NULL);if (rc != MQTTCLIENT_SUCCESS) {printf("Failed to publish message, return code: %d\n", rc);MQTTClient_disconnect(client, TIMEOUT);MQTTClient_destroy(&client);exit(EXIT_FAILURE);}printf("Published message: %s\n", PAYLOAD);// 等待消息到达printf("Waiting for messages...\n");while (1) {sleep(1);}// 断开连接并销毁客户端MQTTClient_disconnect(client, TIMEOUT);MQTTClient_destroy(&client);return 0;
}

3. 编译代码

在 ARM 嵌入式 Linux 中编译代码:

gcc -o mqtt_client mqtt_client.c -lpaho-mqtt3c

4. 运行代码

  1. 确保 Mosquitto 代理已启动。
  2. 运行编译后的程序:
    ./mqtt_client
    
  3. 如果一切正常,程序将订阅 test/topic 主题并发布一条消息。

5. 测试和验证

  1. 使用 mosquitto_sub 订阅 test/topic 主题:
    mosquitto_sub -h localhost -t test/topic
    
  2. 运行 mqtt_client,你应该能在 mosquitto_sub 终端中看到发布的消息。

6. 优化和注意事项

  1. 资源优化
    • 如果内存资源紧张,可以禁用 SSL(如示例中所示)。
    • 减少 MQTTClient_message 的缓冲区大小。
  2. 网络稳定性
    • 在嵌入式系统中,确保网络连接稳定,避免因网络问题导致通信失败。
  3. 日志管理
    • 在发布版本中禁用调试日志,减少资源占用。
  4. 交叉编译
    • 如果需要在开发主机上交叉编译,请使用合适的交叉编译工具链,例如:
      arm-linux-gnueabihf-gcc -o mqtt_client mqtt_client.c -lpaho-mqtt3c
      

通过以上步骤,可在 ARM 嵌入式 Linux 中成功实现 MQTT 通信,并编写高效的 C/C++ 客户端程序。


http://www.ppmy.cn/embedded/174626.html

相关文章

鸿蒙 元服务摘要

元服务&#xff08;原名原子化服务&#xff09;&#xff0c;是HarmonyOS提供的一种面向未来的服务提供方式&#xff0c;是有独立入口的&#xff08;用户可通过点击方式直接触发&#xff09;、免安装的&#xff08;无需显式安装&#xff0c;由系统程序框架后台安装后即可使用&am…

跟着StatQuest学知识03-反向传播

一、反向传播基本原理&#xff08;b3&#xff09; 反向传播要点&#xff1a;当我们不确定像b3这样的参数时&#xff0c;我们使用链式法则计算残差平方和关于b3的导数&#xff0c;然后将b3从一个初始值开始&#xff0c;通过梯度下降法来调整参数&#xff0c;进而得出最佳值。 因…

【c++】异常处理

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、什么是异常 二、异常的使用 三、catch语句匹配的特例 四、异常的重新抛出 五、异常安全问题 六、异常规范 七、标准库异常体系 总结 前…

Milvus vs. ElasticSearch:向量库检索性能测试

目录 1. 构建检索库2. 测试条件3. 测试结果4. 性能分析5. 结论 1. 构建检索库 构建通用场景库总计约2万张。构建车辆数据库总计约12万张。构建公共数据库&#xff0c;包括Flickr30k、COCO、nlvr2、vqa等数据集约43万张。 2. 测试条件 环境说明&#xff1a;分别单机部署Milvu…

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库&#xff1f;② 创建目…

STM32 —— MCU、MPU、ARM、FPGA、DSP

在嵌入式系统中&#xff0c;MCU、MPU、ARM、FPGA和DSP是核心组件&#xff0c;各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念&#xff1a; 一、 MCU&#xff08;Microcontroller Unit&#xff0c;微控制器单元&#xff09; 核心定义 集成系统芯片&a…

【2025】部标JT808、JT1078、苏标主动安全模拟工具

支持JT808-2013、JT808-2019 除了直接客户端&#xff0c;还支持JT808服务端程序、JT808报文解析 下载地址&#xff1a;https://www.lingx.com/download.html

VSCODE右下角切换环境没用

VSCODE惦记右下角python版本&#xff0c;切换别的虚拟环境时&#xff0c;始终切换不了&#xff0c;同时右下角弹出&#xff1a; Client Pylance: connection to server is erroring. 取消继承环境也改了。https://www.cnblogs.com/coreylin/p/17509610.html 还是不行&#xf…