【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-05-11 00:26:45
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- 🎄二、mosquitto 的下载
- 🎄三、mosquitto 的交叉编译
- ✨3.1 openssl 的下载、交叉编译
- ✨3.2 cJSON 的下载、交叉编译
- ✨3.3 mosquitto 交叉编译
- 🎄四、mosquitto 的使用教程
- ✨4.1 mosquitto 部署到嵌入式开发板
- ✨4.2 运行 mosquitto (MQTT Broker)
- ✨4.3 运行 mosquitto_sub 订阅消息
- ✨4.4 运行 mosquitto_pub 发布消息
- 🎄五、总结

![]()
🎄一、概述
本文介绍如何使用 mosquitto 搭建一个 MQTT Broker。
Eclipse Mosquitto是一个开源(EPL/EDL许可)消息代理,它实现了MQTT协议版本 5.0、3.1.1和3.1。Mosquito 是轻量级的,适用于从低功耗单板计算机到全服务器的所有设备。
MQTT协议提供了一种使用发布/订阅模型执行消息传递的轻量级方法。这使得它适用于物联网消息传递,例如使用低功率传感器或移动设备,如手机、嵌入式计算机或微控制器。
Mosquitto项目还提供了一个用于实现MQTT客户端的C库,以及非常流行的Mosquitto_pub和Mosquitto_sub命令行MQTT客户端。
Mosquito是Eclipse基金会的一部分,是iot.Eclipse.org项目。开发由Cedalo推动。
关于 的更多内容,可以参考其官网:https://mosquitto.org/
![]()
🎄二、mosquitto 的下载
mosquitto 的下载地址:https://mosquitto.org/download/
如果不想下载最新版本的,也可以在其GitHub路径去下载:https://github.com/eclipse/mosquitto/tags
本文是直接在官网下载的,下载的版本是:mosquitto-2.0.18.tar.gz。

![]()
🎄三、mosquitto 的交叉编译
在编译 mosquitto-2.0.18.tar.gz 之前需要先编译其依赖库:openssl库 和 cJSON库。
✨3.1 openssl 的下载、交叉编译
本文下载的是 openssl-OpenSSL_1_1_1g.tar.gz,
下载地址:https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_1_1g
为什么使用这么旧的版本,因为这个我之前编译过,而且使用没问题。
编译步骤:
-
1、解压缩
tar zxf openssl-OpenSSL_1_1_1g.tar.gz -
2、进入目录,并配置输出目录和交叉编译器, (linux-generic32表示是32位操作系统,个别文章加了这个选项就不用去掉 -m64,我这里行不通)
cd openssl-OpenSSL_1_1_1g/ ./config no-asm shared no-async --prefix=`pwd`/ssl_result --cross-compile-prefix=aarch64-mix210-linux- -
3、执行下面命令,删除Makefile文件的
-m64,sed -i 's/-m64//' Makefile执行后,可以避免出现这个编译错误:
aarch64-mix210-linux-gcc: error: unrecognized command line option '-m64' -
4、编译、安装
make && make install
成功编译后,在openssl-OpenSSL_1_1_1g/目录会生成一个ssl_result目录,可以看到里面生成的库:

✨3.2 cJSON 的下载、交叉编译
cJSON库是C语言编写的,用来解析JSON信息的库,本文使用的是 cJSON-1.7.17.tar.gz。
下载地址:https://codeload.github.com/DaveGamble/cJSON/tar.gz/refs/tags/v1.7.17
cJSON 的编译很简单,可以使用下面shell脚本编译,将下面shell脚本保存成cJSON_install.sh,与下载的cJSON-1.7.17.tar.gz放在同一目录,直接执行cJSON_install.sh编译即可:
#! /bin/shexport CJSON_VER=cJSON-1.7.17
CROSSS_COMPILE_TOOL=aarch64-mix210-linux-# 1.解压缩
rm ${CJSON_VER} -rf
tar zxf ${CJSON_VER}.tar.gz# 2.编译
cd ${CJSON_VER}# 2.1 修改安装目录路径
sed -i '/PREFIX ?= /a PREFIX ?= $(PWD)\/..\/${CJSON_VER}_result' Makefile
sed -i '/PREFIX ?= \/usr\/local/d' Makefilemake CC=${CROSSS_COMPILE_TOOL}gcc
make install
cd ..
编译过程图:

✨3.3 mosquitto 交叉编译
编译步骤:
-
1、解压缩、进入源码目录:
tar zxf mosquitto-2.0.18.tar.gz cd mosquitto-2.0.18 -
2、修改
config.mk,指定依赖库的头文件路径、库路径,并且指定安装目。
在config.mk的 146 行,在ARCH:=$(shell uname -p)语句下面添加下面语句:# 指定ssl库、cJSON库的头文件和库文件 CFLAGS += -I/home/samba/01_libCompile/013_mqtt/MQTT_Broker/result_dir/ssl_result/include -I/home/samba/01_libCompile/013_mqtt/MQTT_Broker/result_dir/cJSON-1.7.17_result/include LDFLAGS+= -L/home/samba/01_libCompile/013_mqtt/MQTT_Broker/result_dir/ssl_result/lib -L/home/samba/01_libCompile/013_mqtt/MQTT_Broker/result_dir/cJSON1.7.17_result/lib -lssl -lcrypto -dl# 指定安装目录 DESTDIR=/home/samba/01_libCompile/013_mqtt/MQTT_Broker/result_dir/mosquitto-2.0.18_result没有添加上面语句,或者添加不正确的话,会报编译错误:
../config.h:61:12: fatal error: openssl/opensslconf.h: No such file or directory
注意:
1、指定的路径必须使用绝对路径,因为这个config.mk可能被其他层级的Makefile包括,不使用绝对路径会出错。
2、-lssl -lcrypto -dl这几个选项也要加,不然链接时可能会报错。
3、DESTDIR目录一定要指定,不然make install的时候可能会安装到根目录去。 -
3、编译、安装
make CC=aarch64-mix210-linux-gcc CXX=aarch64-mix210-linux-g++ make install
编译完成后,可以看到如下的几个文件:

![]()
🎄四、mosquitto 的使用教程
✨4.1 mosquitto 部署到嵌入式开发板
我这个是交叉编译,是要部署到嵌入式开发板的,如果读者是在Ubuntu等Linux发行版系统部署的话,也可以参考,主要就是让依赖的动态库可以被找到。
将前面已编译 openssl、cJSON、mosquitto 目录放到一块,我这里是放在 mosquitto_result_dir 目录,如下:

然后将整个目录复制到嵌入式开发板。
✨4.2 运行 mosquitto (MQTT Broker)
在编译结果目录mosquitto-2.0.18_result/usr/local/sbin 中存在 mosquitto 的可执行文件,mosquitto 就是我们要部署的 MQTT Broker(MQTT 代理),将它运行之后,我们就可以通过MQTT客户端进行发布/订阅了。
- 首先,设置
LD_LIBRARY_PATH环境变量,添加依赖库的路径,执行如下语句(路径根据你自己的设置):export LD_LIBRARY_PATH=/nfsroot/mosquitto_result_dir/ssl_result/lib:$LD_LIBRARY_PATH - 然后,添加 mosquitto 配置文件,在当前目录新建文件
mosquitto.conf,内容如下:# 设置 Mosquitto 服务器监听所有网络接口(通过 0.0.0.0 指定)上的 1883 端口. listener 1883 0.0.0.0# 设置运行 Mosquitto 服务时使用的用户为 root。 # 这通常不是一个安全的做法,因为通常推荐使用一个权限较低的专用用户账户来运行服务以减少潜在的安全风险。 user root# 允许匿名用户连接到 MQTT 服务器。这意味着客户端无需提供用户名和密码即可连接并发布、订阅消息。 allow_anonymous true# 指定 Mosquitto 服务运行时生成的进程 ID 文件位置。 #pid_file /var/run/mosquitto.pid# 开启持久化模式,意味着在服务器重启后,一些会话状态和保留消息等信息会被保存下来 #persistence true# 设置持久化数据存储的位置,在本例中是 /tmp 目录。 #persistence_location /tmp# 指定日志输出方式为写入文件,并设定日志文件的路径为 /tmp/mosquitto.log。 #log_dest file /tmp/mosquitto.log# 指定包含其他配置文件的目录,当 Mosquitto 启动时,会加载此目录下的所有 .conf 结尾的文件作为附加配置。 #include_dir /mnt/mosquitto/etc/mosquitto/conf.d/#max_inflight_messages 1024 #max_queued_messages 5120 #message_size_limit 2048000 #set_tcp_nodelay true - 最后,运行
mosquitto,-c是指定 mosquitto 配置文件mosquitto.conf的路径(根据自己的设置):./mosquitto -c /nfsroot/mosquitto_result_dir/mosquitto-2.0.18_result/usr/local/sbin/mosquitto.conf
✨4.3 运行 mosquitto_sub 订阅消息
mosquitto_sub 是一个MQTT客户端,实现了订阅消息的功能,使用步骤:
- 1、在嵌入式开发板重新打开一个命令行窗口,设置
LD_LIBRARY_PATH环境变量,具体路径看自己的目录:export LD_LIBRARY_PATH=/nfsroot/mosquitto_result_dir/mosquitto-2.0.18_result/usr/local/lib/:/nfsroot/mosquitto_result_dir/cJSON-1.7.17_result/lib/:$LD_LIBRARY_PATH - 2、运行 mosquitto_sub 订阅消息,命令如下,
-v表示打印发布的消息,-h指定运行MQTT Broker的主机ip,-t指定要订阅的主题(Topic):./mosquitto_sub -v -h 192.168.3.227 -t /server/fromArm
✨4.4 运行 mosquitto_pub 发布消息
mosquitto_pub 也是一个MQTT客户端,实现了发布消息的功能,使用步骤:
- 1、在嵌入式开发板重新打开一个命令行窗口,设置
LD_LIBRARY_PATH环境变量,具体路径看自己的目录:export LD_LIBRARY_PATH=/nfsroot/mosquitto_result_dir/mosquitto-2.0.18_result/usr/local/lib/:/nfsroot/mosquitto_result_dir/cJSON-1.7.17_result/lib/:$LD_LIBRARY_PATH - 2、运行 mosquitto_pub 发布消息,命令如下,
-h指定运行MQTT Broker的主机ip,-t指定要发布的主题(Topic),-m指定要发送的消息,
也可以使用./mosquitto_pub -h 192.168.3.227 -t /server/fromArm -m {"data":"hello world!"}-f选项指定文件,将文件内容发布:./mosquitto_pub -h 192.168.3.227 -t /server/fromArm -f
下面是订阅、发布消息的过程:

![]()
🎄五、总结
本文介绍了 MQTT Broker 开源库 mosquitto 的下载、交叉编译、使用教程,如果想了解 mosquitto ,一定会有帮助。

如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
参考:
https://blog.csdn.net/weixin_45459266/article/details/136804799
相关文章:
【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-05-11 0…...
用云手机打造海外社媒矩阵
在全球经济一体化的大背景下,中国出海企业及B2B外贸公司正将海外社交媒体营销作为重要的市场拓展策略。为更好地触及不同受众群体,构建跨平台的社媒矩阵已成为企业营销的关键步骤。本文将探讨如何利用云手机技术,高效管理并运营多个海外社交媒…...
第 8 章 机器人平台设计之底盘实现(自学二刷笔记)
重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.1 底盘实现_概述 1.ros_arduino_bridge 简介 该功能包包含Arduino库和用来控制Arduino的ROS驱动包&…...
✔ ★Java项目——设计一个消息队列(五)【虚拟主机设计】
虚拟主机设计 创建 VirtualHost实现构造⽅法和 getter创建交换机删除交换机创建队列删除队列创建绑定删除绑定发布消息 ★路由规则1) 实现 route ⽅法2) 实现 checkRoutingKeyValid3) 实现 checkBindingKeyValid4) 实现 routeTopic5) 匹配规则测试⽤例6) 测试 Router 订阅消息1…...
ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘
对于数码科技宅在新购得磁盘之后,出于某种原因会在新的磁盘安装操作系统。在安装操作系统时,首先要对磁盘进行分区和格式化,而在此过程中,操作者们需要选择文件系统。文件系统也决定了之后操作的流程程度,一般文件系统…...
Python Web框架Django项目开发实战:创建在线学习应用
注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python项目开发Django实战-创建在线学习应用-编程案例解析实例详解课程教程.pdf 在当今数字化教…...
用得助全媒体呼叫中心,让AI落到实处帮品牌做营销
怎么让人工智能落到实处的帮助到我们?我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌,该品牌在中国功能性护肤品市场占有率达到20.5%,这么高的市场占有率客户的咨询量也是非常庞大的࿰…...
【吃透Java手写】2-Spring(下)-AOP-事务及传播原理
【吃透Java手写】Spring(下)AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类,定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…...
Spring原理分析--获取Environment资源对象
1.使用getEnvironment()获取环境信息 ApplicationContext接口继承了EnvironmentCapable接口,可以通过getEnvironment()获取Environment配置信息,例如: SpringBootApplication public class A01 {public static void main(String[] args) th…...
Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)
Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2) 计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView,然后有好多行,再把要查询的行内容完整的传给 ad…...
人民币数字和中文汉字转换
在PHP中,将人民币的中文汉字金额转换为数字,或者将数字转换为人民币的中文汉字金额,通常需要自定义一些函数来实现这一转换过程。下面分别给出这两个转换的示例代码。 数字转人民币中文汉字 function numberToChinese($num) { $cnNums arr…...
07_Flutter使用NestedScrollView+TabBarView滚动位置共享问题修复
07_Flutter使用NestedScrollViewTabBarView滚动位置共享问题修复 一.案发现场 可以看到,上图中三个列表的滑动位置共享了,滑动其中一个列表,会影响到另外两个,这显然不符合要求,先来看下布局,再说明产生这个…...
Java解决垂直鉴权问题(对垂直权限进行校验)
Java解决垂直鉴权问题(对垂直权限进行校验) 文章目录 Java解决垂直鉴权问题(对垂直权限进行校验)前言一、垂直鉴权是什么?二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…...
【MySQL工具】pt-heartbeat
功能 pt-heartbeat - 监控 MySQL 复制延迟。 用法 pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop pt-heartbeat 用于测量 MySQL 或 PostgreSQL 服务器上的复制延迟。您可以使用它来更新主服务器或监控从服务器。如果可能,MySQL 连接选项将从您…...
实现vant的年月日时分秒组件
方法:van-datetime-picker(type:datetime)和 van-picker结合实现。 <template><div class"datetimesec-picker"><van-datetime-pickerref"timePickerRef"type"datetime" //年月日时…...
typescript 命名空间、装饰器
1、命名空间 命名空间:在代码量较大的情况下,为了避免各种变量命名的冲突,可将相似功能的函数、类、接口等放置到命名空间内。同Java的包.Net的命名空间一样,typescript 的命名空间可以将代码包裹起来,只对外暴露需要在…...
GPT问答SAP BW
以下回答由GPT-3.5回答,仅供参考. 这个AI工具超好用,每天都有免费额度,写文章、总结长视频、画图等,都几秒搞定!快去下载Sider Chrome或Edge插件,薅羊毛! https://sider.ai/invited?c43b289bf2616575daecf…...
使用zdppy_amauth开发激活用户接口
服务端代码: 1、创建数据库连接对象2、初始化数据库3、声明一个上下文4、挂载用户相关的路由,这里主要由 用户登录接口用户注册注册获取用户列表接口激活指定用户接口 5、启动服务 import mcrud import api import amauth import env import contextli…...
c++ memset 指针示例
目录 C 传一个float指针,在函数内部修改指针的值 c memset 指针示例 C 传一个float指针,在函数内部修改指针的值 #include <iostream>// 定义一个函数,它接受一个指向float的指针 void modifyValue(float* ptr) {// 通过解引用指针来…...
24考研双非上岸武汉理工大学电子信息专硕,855考研经验
目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索,慢慢研究的,不过最晚9月初一定要确定院校了&a…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
