【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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...