当前位置: 首页 > article >正文

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

在 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++ 客户端程序。

相关文章:

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

在 ARM 嵌入式 Linux 下使用 C/C 实现 MQTT 通信是一个常见的需求&#xff0c;尤其是在资源受限的环境中。以下是一个详细的教程&#xff0c;使用 Eclipse Paho C Client 库来实现 MQTT 客户端。 1. 安装 Eclipse Paho C Client 库 Eclipse Paho C Client 是一个轻量级的 MQTT…...

Oraclelinux问题-/var/log/pcp/pmlogger/目录超大

有套19c rac环境&#xff0c;操作系统是oracle linux 8.10&#xff0c;日常巡检时发现/var/log/pcp/pmlogger/目录超大&#xff0c;如下 [rootdb1 ~]# du -sh /var/log/pcp/pmlogger/* 468G /var/log/pcp/pmlogger/db 1.3G /var/log/pcp/pmlogger/oracle06-106 754M /…...

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景&#xff1a; vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…...

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…...

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…...

第5章:Docker镜像管理实战:构建、推送与版本控制

第5章:Docker镜像管理实战:构建、推送与版本控制 作者:DogDog_Shuai 阅读时间:约25分钟 难度:中级 目录 第5章:Docker镜像管理实战:构建、推送与版本控制 目录1. 引言2. Docker镜像基础 2.1 镜像结构...

Microsoft Edge浏览器的取证分析(基于Chromium)

概述 早在2019年&#xff0c;微软就用Chromium替换了EdgeHTML浏览器引擎&#xff0c;这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium&#xff0c;Edge与Chrome浏览器共享一个共同的架构&#xff0c;这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …...

汽车一键启动系统使用方便,舒适出行,轻松匹配

汽车一键启动系统 系统定义 移动管家汽车一键启动系统是装置在智能汽车上的一部分&#xff0c;是实现简约打火和熄火过程的一个按钮装置。它可以在原车钥匙锁头的位置改装&#xff0c;也能独立面板改装&#xff0c;现在很多高低配置的车辆都可安装。 功能特点 基本功能 启…...

C语言复习笔记--数组

今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始. 数组的概念 数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组. 下面从一维数组说起. 一维数组的创建和…...

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…...

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天&#xff0c;股票分析作为投资决策的核心环节&#xff0c;正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理&#xff0c;效率低下且成本高昂&#xff0c;而人工智能&#xff08;AI&#xff09;的引入为这一领域带来…...

深入解析 SQL Server 锁机制:如何定位并解决表锁问题

在 SQL Server 中&#xff0c;锁是并发控制的关键机制&#xff0c;确保数据的完整性和一致性。然而&#xff0c;在高并发环境下&#xff0c;锁可能导致阻塞甚至死锁&#xff0c;影响系统性能。因此&#xff0c;理解 SQL Server 的锁机制&#xff0c;并掌握如何定位和解决锁问题…...

Spring Boot 异步返回对象深度解析

前言 在现代高并发、高响应的应用场景中&#xff0c;Spring Boot 的异步处理能力是提升系统吞吐量和用户体验的关键技术之一。无论是实时数据推送、大文件传输&#xff0c;还是复杂异步任务调度&#xff0c;Spring Boot 提供了多种灵活的异步处理机制以满足不同需求。本文将从…...

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…...

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…...

强大的AI网站推荐(第一集)—— Devv AI

网站&#xff1a;Devv AI 号称&#xff1a;最懂程序员的新一代 AI 搜索引擎 博主评价&#xff1a;我的大学所有的代码都是使用它&#xff0c;极大地提升了我的学习和开发效率。 推荐指数&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x…...

模块二 单元4 安装AD+DC

模块二 单元4 安装ADDC 两个任务&#xff1a; 1.安装AD活动目录 2.升级当前服务器为DC域控制器 安装前的准备工作&#xff1a; 确定你要操作的服务器系统&#xff08;Windows server 2022&#xff09;&#xff1b; 之前的服务器系统默认是工作组的模式workgroup模式&#xff08…...

蓝桥杯备考:数学问题模运算---》次大值

这道题&#xff0c;由于数据规模是2e5&#xff0c;我们直接暴力的话是一定会超时的 所以我们得想个办法&#xff0c;我们先把所有的数排序去重 我们先想想如果要找最大值&#xff0c;怎么找 这时候我们要分类讨论 ①如果是大数模小数&#xff0c;那结果肯定是小于小数的&am…...

k8s1.30 部署calio网络

一、介绍 网路组件有很多种&#xff0c;只需要部署其中一个&#xff0c;推荐calio。 calio是一个纯三成的数据中心网络方案&#xff0c;calico支持广泛的平台。如k8s&#xff0c;openstack等。 calio在每一个计算节点利用linux内核&#xff0c;实现了一个高效的虚拟路由器来…...

test skills

一、测试技术 1、python GitHub - taizilongxu/interview_python: 关于Python的面试题 GitHub - JushuangQiao/Python-Offer: 《剑指Offer》面试题Python实现 GitHub - vinta/awesome-python: An opinionated list of awesome Python frameworks, libraries, software and …...

Elasticsearch:为推理端点配置分块设置

推理端点对一次可处理的文本量有限&#xff0c;具体取决于模型的输入容量。分块&#xff08;Chunking&#xff09; 是指将输入文本拆分成符合这些限制的小块的过程&#xff0c;在将文档摄取到 semantic_text 字段时会进行分块。分块不仅有助于保持输入文本在可处理范围内&#…...

如何使用webpack预加载 CSS 中定义的资源和预加载 CSS 文件

在 Webpack 中预加载 CSS 文件及其内部定义的资源&#xff08;如图片、字体等&#xff09;&#xff0c;可以通过 资源预加载&#xff08;Preloading&#xff09; 技术优化关键资源的加载优先级。以下是具体的实现方法和步骤&#xff1a; 一、预加载 CSS 文件 1. 使用 vue/prel…...

[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)

导语&#xff1a; 在工业控制领域&#xff0c;设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码&#xff0c;威胁设备稳定运行。本文将手把手教你使用 DriverView工具&#xff0c;高效完成工控机驱动安全检查&#xff0c;精准识别可疑驱动&a…...

解决 React Native 0.76 中 com.facebook.react.settings 插件缺失问题

在使用 React Native 0.76 创建项目时&#xff0c;遇到以下错误&#xff1a; FAILURE: Build failed with an exception. * Where: Settings file /Users/wangxp/learn/AwesomeProject/android/settings.gradle line: 2 * What went wrong: Plugin [id: com.facebook.react.se…...

多无人车协同探索开源包启动文件介绍(上)

在之前介绍的《多无人车协同探索开源包部署教程及常见报错解决方式》中运行多无人车协同探索时&#xff0c;先后运行了两个launch文件 multiple_tb3_house.launch 和three_robots.launch &#xff0c;本文来进一步看一下这两个启动文件以及其调用的move_base .launch 和multi_t…...

Linux驱动学习笔记(三)

并发与竞争 1.在编写驱动程序的时候&#xff0c;要尽量避免让驱动程序存在并发和竞争&#xff0c;Linux内核里面提供了几种处理并发与竞争的方法&#xff0c;分别是&#xff1a;原子操作、自旋锁、信号量和互斥体。 原子操作&#xff1a;Linux的原子操作基于atomic_t数据类型…...

【QT5 多线程示例】互斥锁

互斥锁 互斥锁介绍&#xff1a;【C并发编程】&#xff08;三&#xff09;互斥锁&#xff1a;std::mutex。原理都一样&#xff0c;这里就不赘述了。 QMutex 是 Qt 框架中提供的一个互斥锁类&#xff0c;主要包括以下成员函数&#xff1a; lock()&#xff1a;试图锁定互斥量。…...

SaaS系统的销售微服务与权限微服务边界设计

在设计SaaS系统的销售微服务与权限微服务的边界时&#xff0c;需要结合领域驱动设计&#xff08;DDD&#xff09;和微服务拆分原则&#xff0c;确保高内聚、低耦合。以下是结合微服务架构原则、多租户SaaS需求及权限管理场景的完整设计方案&#xff0c;整合了权限服务与销售服务…...

leetcode热题100道——两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...

C语言经典代码练习题

1.输入一个4位数&#xff1a;输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个&#xff14;位数&#xff1a;");scanf("%d",&a);printf("个位&#xff1a;%d\n"…...