【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3029783.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

出海企业必备神器:海外云手机的秘密你了解多少?

在全球化日益加速的今天,出海企业面临着前所未有的机遇与挑战。如何才能以一个较低的成本打入海外市场,实现业务的高速增长?答案就是——海外云手机! 一、为何海外云手机成为出海企业的必备神器? 突破地域限制&#xf…

一个开源即时通讯源码

一个开源即时通讯源码 目前已经含服务端、PC、移动端即时通讯解决方案,主要包含以下内容。 服务端简介 不要被客户端迷惑了,真正值钱的是服务端, 服务是采用Java语言开发,基于spring cloud微服务体系开发的一套即时通讯服务端。…

基于WPF的DynamicDataDisplay曲线显示

一、DynamicDataDisplay下载和引用 1.新建项目,下载DynamicDataDisplay引用: 如下图: 二、前端开发: <Border Grid.Row="0" Grid.Column="2" BorderBrush="Purple" BorderThickness="1" Margin="2"><Grid>…

数据结构学习/复习12

一、排序概念与应用 二、插入排序 三、希尔排序 当间隔数为1时则为插入排序 1.一组一组排 2.多组并排 3.间隔数变化直至为1 四、性能测速代码

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

成本降低 90%,出海社交平台 Typing 基于 Databend 的大数据探

Typing&#xff08;输入中科技&#xff09;成立于 2022 年&#xff0c;是一家主要面向东南亚、拉美、中东等海外地区提供社交平台的出海企业。其社交平台类似于国内的 Soul、陌陌等&#xff0c;提供视频直播、语音聊天室、短视频、生活分享、文字聊天等社交功能&#xff0c;注册…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE&#xff08;Sector Erase&#xff09;1.1 flash_se 模块设计1.1.1 信号连接示意图&#xff1a;1.1.2 SE状态机1.1.3 波形图设计&#xff1a;1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图&#xff1a;…

django中的日志处理

1、事件追踪 在什么样的时间发生了什么样的事情 2、bug调试 3、程序告警 4、大数据统计 ELK 日志分析系统 elasticsearh logstasn kibana 名词概念 loggers&#xff1a;日志器 —— 定大方向&#xff1a;1 handlers&#xff1a;处理器 —— 执行:3 formatters&#xff…

CTFHUB-技能树-Web题-RCE(远程代码执行)-文件包含

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09; 文件包含 文章目录 CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;文件包含解题方法1:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71f7355b3c124dfe8cdf1c95e6991553.png#pic_ce…

【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录 &#x1f4a5;一、PPT模版爬取&#x1f525;1.1 第一个爬虫&#x1f6b2;1. 获取下载页面链接 ❤️1.2 第二个爬虫&#x1f6b2;1.3 第三个爬虫&#x1f388;2. 文件保存 ❤️1.4 翻页处理 &#x1f525;二、完整代码 &#x1f525;&#x1f525;&#x1f525; Pytho…

Java类加载器介绍

在Java中&#xff0c;类加载器是一种动态加载类的机制&#xff0c;它负责在运行时查找、加载和链接类文件。当Java应用程序需要创建某个类的对象时&#xff0c;类加载器会在运行时查找该类对应的.class文件&#xff0c;并将其加载到Java虚拟机中。Java类加载器通常分为三层&…

JVM调优—减少FullGC

背景 最近负责了一个审批流程新项目&#xff0c;带领了几个小伙伴&#xff0c;哼哧哼哧的干了3个月左右&#xff0c;终于在三月底完美上线了&#xff0c;好消息是线上客户用的很丝滑&#xff0c;除了几个非常规的业务提单之外&#xff0c;几乎没有什么大的问题&#xff0c;但是…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

工作中遇见的问题总结

1. 当我执行下面代码的时候&#xff0c;下边的的代码还是会执行 if(name"aaa"){console.log("111");}

动手学深度学习——多层感知机

1. 感知机 感知机本质上是一个二分类问题。给定输入x、权重w、偏置b&#xff0c;感知机输出&#xff1a; 以猫和狗的分类问题为例&#xff0c;它本质上就是找到下面这条黑色的分割线&#xff0c;使得所有的猫和狗都能被正确的分类。 与线性回归和softmax的不同点&#xff1…

一文彻底读懂信息安全等级保护:包含等保标准、等保概念、等保对象、等保流程及等保方案(附:等保相关标准文档)

1. 什么是等级保护&#xff1f; 1.1. 概念 信息安全等级保护是指根据我国《信息安全等级保护管理办法》的规定&#xff0c;对各类信息系统按照其重要程度和保密需求进行分级&#xff0c;并制定相应的技术和管理措施&#xff0c;确保信息系统的安全性、完整性、可用性。根据等…

通俗的理解网关的概念的用途(四):什么是网关设备?(网络层面)

任何一台Windows XP操作系统之后的个人电脑、Linux操作系统电脑都可以简单的设置&#xff0c;就可以成为一台具备“网关”性质的设备&#xff0c;因为它们都直接内置了其中的实现程序。MacOS有没有就不知道&#xff0c;因为没用过。 简单的理解&#xff0c;就是运行了具备第二…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

Linux 安装JDK和Idea

安装JDK 下载安装包 下载地址&#xff1a; Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…

信息系统架构模型_1.单机应用模式和客户机/服务器模式

1.单机应用模式&#xff08;Standalone&#xff09; 单机应用系统是最简单的软件结构&#xff0c;是指运行在一台物理机器上的独立应用程序。这些软件系统&#xff0c;从今天的软件架构上来讲&#xff0c;是很简单&#xff0c;是标准的单机系统。当然至今&#xff0c;这种复杂的…