交叉编译 MQTT/Mosquitto
交叉编译 MQTT/Mosquitto
概述

Eclipse Mosquitto 是一个开源(EPL/EDL许可)消息代理,它实现了 MQTT 协议版本 5.0、3.1.1 和 3.1。Mosquitto 重量轻,适用于从低功耗单板计算机到全服务器的所有设备。
MQTT 协议提供了一种使用发布/订阅模型执行消息传递的轻量级方法。这使得它适用于物联网消息传递,如低功耗传感器或移动设备,如手机、嵌入式计算机或微控制器。
Mosquitto 项目还提供了一个用于实现 MQTT 客户端的 C 库,以及非常流行的 mosquitto_pub 和 mosquitto_sub 命令行 MQTT 客户端。
- 官方网址:https://mosquitto.org
- GitHub: https://github.com/eclipse/mosquitto
下载
如果以商用量产为目的,一般选择正式的发行版本为佳。在官方网址 Download 页面下方会显示最新可下载的源码压缩包。根据需求选择合适的版本进行下载,以最新的 2.0.15 版本为例,在页面下方点击链接下载源码包 mosquitto-2.0.15.tar.gz。

也可以直接使用 wget 命令下载:
wget https://mosquitto.org/files/source/mosquitto-2.0.15.tar.gz
如果需要使用特定版本,可以在 https://mosquitto.org/files/ 位置找到 mosquitto 的历史发行版本。进入网页之后选择 source/ 链接,然后选择下载压缩包即可。
交叉编译
解压缩源码包:
tar -xvf mosquitto-2.0.15.tar.gz
解压缩源码包之后建议先阅读 README.md 与 README-compiling.md 文档,里面有关于编译的相关信息。
在 mosquitto 的文档及配置文件中有提及到依赖关系,最主要的是依赖 OpenSSL 与 cJSON 库,如果需要完整编译可以先参考「交叉编译 OpenSSL」与「交叉编译 cJSON」两篇文章。需要注意的点就是,需要使用 make DESTDIR=$BUILDSYSROOT install 将编译产物部署到 sysroot 目录便于 mosquitto 编译时依赖,效果类似于 apt install *-dev 安装开发依赖包。
在 README.md 文档中也提及到,如果不需要依赖 cJSON 可以使用 make WITH_CJSON=no 或者不需要依赖 OpenSSL 时使用 make WITH_TLS=no 的方式来禁用编译依赖。
首先创建一个环境配置文件 aarch64-environment-setup,配置最重要的交叉编译环境变量。
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATHexport PREFIX=/usrexport CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-stripexport PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin 目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir> 参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include 及 /usr/lib。
source aarch64-environment-setup
make
make prefix=/usr WITH_STRIP=yes DESTDIR=$BUILDSYSROOT install
- 在源码目录下创建环境配置文件并调用
source命令让环境变量生效; - 执行
make命令编译源码; - 在 config.mk 文件中定义了
prefix以及 WITH_STRIP 的默认值,根据实际需求在执行make指令时重新进行配置; - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,在本示例中,BUILDSYSROOT 指的是交叉编译工具链的 sysroot 目录,此环境变量在
aarch64-environment-setup中已定义。更详细介绍可以参考 DESTDIR 官方介绍,也可以参考「交叉编译 libcap」关于 DESTDIR 的用法说明。
最终你就可以在 $BUILDSYSROOT/usr 文件夹中找到交叉编译好的 mosquitto 头文件及库文件。如果需要以软件包的形式发布,可以指定 DESTDIR 为其他目录,比如 DESTDIR=/tmp/sysroot 则最终交叉编译出来的产物会在 /tmp/sysroot 文件夹下。Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
△\triangle△ 交叉编译 cJSON
相关文章:
交叉编译 MQTT/Mosquitto
交叉编译 MQTT/Mosquitto 概述 Eclipse Mosquitto 是一个开源(EPL/EDL许可)消息代理,它实现了 MQTT 协议版本 5.0、3.1.1 和 3.1。Mosquitto 重量轻,适用于从低功耗单板计算机到全服务器的所有设备。 MQTT 协议提供了一种使用发…...
无重复字符的最长子串的解法
class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,记录每个字符是否出现过Set<Character> occ new HashSet<Character>();int n s.length();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左…...
Apache Hadoop生态部署-zookeeper单机安装
目录 查看服务架构图-服务分布、版本信息 一:安装前准备 1:zookeeper安装包选择--官网下载 2:zookeeper3.5.7安装包--百度网盘 二:安装与常用配置 2.1:下载解压zk安装包 2.2:配置修改 2.3࿱…...
java面试题-IO流
基础IO1.如何从数据传输方式理解IO流?IO流根据处理数据的类型可以分为字节流和字符流。字节流字节流以字节(8位)为单位读写数据。字节流主要用于读写二进制文件,如图片、音频、视频等。Java中的InputStream和OutputStream就是字节…...
Java性能-GC工具
GC工具(帮助分析程序性能 WE always need THAT TO help US) 开启GC日志 JDK 8 -verbose:gc 开启gc -XX:PrintGC 打印gc信息 -XX:PrintGCDetails 打印详细信息 -XX:PrintGCTimeStamps 相对于jvm启动时间0值开始 -XX:PrintGCDateStamps 日期字符串 -Xloggc:filename gc输入日志…...
复赛名单公布!2022隐私计算HACKATHON大赛火热进行中!
开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号O…...
微信小程序的全局弹窗以及全局实例
全局组件 微信小程序组件关系中,父组件使用子组件需要在父组件index.json中引入子组件,然后在父组件页面中使用,这种组件的对应状态是一对一的,一个组件对应一个页面。如果有一个全局弹窗(登录)࿰…...
100种思维模型之诺依曼思维模型-019
生活中,难免总会遇到一些“大”、“笼统”、“难入手”的问题! 如,前几天突然接到领导安排,帮忙梳理一个材料“***景区创建5A级旅游景区提升规划”。 对于一个没有学过景区提升规划、没有做过规划的我来说,真的挺难的…...
Python + Airtest + poco + pytest + pytest-html 实现Android App自动化测试框架
Python Airtest poco pytest pytest-html 实现Android App自动化测试框架 一、背景 为了尝试除Appium外的测试框架,本文将介绍基于网易的airtest框架为基础,配合poco及pytest实现对Android App的自动化测试。 二、框架介绍 框架集成使用airtest p…...
一篇文章让你学会spring
Spring6 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简…...
golang入门笔记——测试
测试类型: 单元测试: 规则: 1.所有测试文件以_test.go结尾 2.func Testxxx(*testing.T) 3.初始化逻辑放到TestMain中 运行: go test [flags][packages]Go语言中的测试依赖go test命令。 go test命令是一…...
【CSAPP】整数运算
文章目录无符号加法练习1练习2补码加法练习1练习2练习3练习4补码的非练习无符号乘法补码乘法练习1练习2练习3乘以常数练习1练习2除以2的幂练习1练习2关于整数运算的最后思考练习无符号加法 考虑两个非负整数x和y,满足0≤x,y<2w0 \le x, y < 2^w0≤x,y<2w&…...
使用 xshell 远程连接(使用 xftp 远程传输)
xshell 和 xftp的使用都基于ssh协议,我们需要先在远程服务端或者虚拟机上安装ssh服务,然后才能远程连接。 目录 1、什么是ssh协议? 2、安装 openssh (1) 安装 openssh 服务器 (2) 关闭服务器防火墙(或者开放端口22)…...
一个例子搞懂子网划分及子网掩码的计算
前置知识: 1、标准ip地址分为A、B、C、D、E五类,分类标准是ip地址的前几个比特位的值。 我们知道ip地址是32位比特-4字节组成,A类地址则是由首位为0,首字节为网络地址,其余3字节为主机地址组成,A类网络地址…...
SPI机制源码:JDK Dubbo Spring
JDK 17 Dubbo 3.1.6 JDK SPI JDK SPI在sql驱动类加载、以及slf4j日志实现加载方面有具体实现。 示例 public class Test {private static final Logger logger LoggerFactory.getLogger(Test.class);public static void main(String[] args) {ServiceLoader<JdkSpiServi…...
Spring Security+jwt+redis+自定义认证逻辑 权限控制
Spring Securityjwtredis自定义认证逻辑 权限控制 1.拦截访问基本思路 2.创建数据库表:角色表(应该6个表,这里只用用户表代替角色表)、权限表、路径表、角色-权限表、权限-路径表 /* SQLyog Professional v12.14 (64 bit) MySQL…...
打游戏什么蓝牙耳机好用?打游戏比较好的蓝牙耳机
游戏耳机提供身临其境的细致声音,同时也是与朋友在线聊天的绝佳通信设备,尤其对于游戏玩家来说,聆听和被聆听的最佳方式之一就是游戏耳机,那2023年到底有哪些值得购买的游戏耳机呢?现在就让我们一起来看看吧。 第一款…...
炔基点击交联试剂1704097-05-1,Alkyne-A-DSBSO crosslinker,发生相应点击反应
1、理论分析:中文名:炔基-A-DSBSO crosslinker,英文名:Alkyne-A-DSBSO crosslinkerCAS号:1704097-05-1化学式:C25H32N2O12S2分子量:616.652、产品详情:外观:白色固体&…...
刷题记录:牛客NC24309Overplanting (Silver)
传送门:牛客 题目描述: Farmer John has purchased a new machine that is capable of planting grass within any rectangular region of his farm that is "axially aligned" (i.e., with vertical and horizontal sides). Unfortunately, the machine malfunc…...
Spring Boot中使用Sa-Token实现轻量级登录与鉴权
1. Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 功能结构图 2. 登录认证 对于一些登录之后才能访问的接口(例如&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
