直接开始正题,mqtt broker适合部署在嵌入式设备的非mosquitto莫属,网上关于arm的交叉编译教程很多,关于riscv的没有,进行了摸索尝试,做了如下记录。
一、源码获取
Download | Eclipse Mosquitto
https://mosquitto.org/download/即可下载到。
目前最新版本
mosquitto-2.0.15.tar.gz
下载到本地后
tar zxvf mosquitto-2.0.15.tar.gz
解压。
mosquitto编译依赖cJSON和openssl,所以也需要对这两个第三库进行交叉编译。
cJSON (1.7.x)
License: MIT
Project:
GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C
openssl (1.1.1)
License: OpenSSL License and SSLeay License
Project:
https://openssl.org
Source:
GitHub - openssl/openssl: TLS/SSL and crypto library
当前最新版本openssl-1.1.1u,有时候github拉取速度较慢,直接下载压缩包
https://www.openssl.org/source/openssl-1.1.1u.tar.gz
二、交叉编译
1.cJSON交叉编译
修改CMakeLists.txt
在下面版本后添加编译参数
set(CJSON_VERSION_SO 1)
set(CJSON_UTILS_VERSION_SO 1)
set(CMAKE_C_FLAGS "-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mabi=lp64d -mtune=c906")
set(CMAKE_CXX_FLAGS "-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mabi=lp64d -mtune=c906")
下面的option
里面建议把动态静态库的选项都设为ON
source
交叉编译工具环境,以输入riscv按TAB可以看到工具链为设置ok
然后在目录下执行
mkdir build
cd build
cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DBUILD_SHARED_AND_STATIC_LIBS=On -DCMAKE_INSTALL_PREFIX=$(pwd)/install_cv1800b
make install
即完成cJSON交叉编译
2.openssl交叉编译
进入到openssl目录
cd openssl-1.1.1u
source
交叉编译工具环境,以输入riscv按TAB可以看到工具链为设置ok
mkidr build
cd build
生成Makefile文件
../Configure linux64-riscv64 shared no-asm --prefix=$(pwd)/install_cv1800b CROSS_COMPILE=riscv64-unknown-linux-musl-
修改Makefile
94~95行修改如下后保存
CFLAGS=-Wall -O3 -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d
CXXFLAGS=-Wall -O3 -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d
make install
即完成openssl的交叉编译
3.mosquitto交叉编译
进入源码目录
cd mosquitto-2.0.15
source
交叉编译工具环境,以输入riscv按TAB可以看到工具链为设置ok
mkidr build
cd build
修改CMakeLists.txt
在下面语句前添加编译参数
project(mosquitto)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_C_COMPILER "riscv64-unknown-linux-musl-gcc")
set(CMAKE_CXX_COMPILER "riscv64-unknown-linux-musl-g++")
在下面语句后添加编译参数
include(GNUInstallDirs)
set(CMAKE_FIND_ROOT_PATH "/home/yxm/milk-v/CV180x/opensrc/openssl-1.1.1u/build/install_cv1800b" "/home/yxm/milk-v/CV180x/opensrc/cJSON/build/install_cv1800b")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d")
特别注意:
set(CMAKE_FIND_ROOT_PATH "/home/yxm/milk-v/CV180x/opensrc/openssl-1.1.1u/build/install_cv1800b" "/home/yxm/milk-v/CV180x/opensrc/cJSON/build/install_cv1800b")
中的路径需要更改为你本机实际交叉编译后的cJSON、openssl的路径
后面编译手册请改成OFF,不编译
option(DOCUMENTATION "Build documentation?" OFF)
相关功能请在option中选择ON 或者 OFF,裁剪
添加修改完内容保存
生成编译文件
cmake .. -DCMAKE_INSTALL_PREFIX=$(pwd)/cv1800b
执行编译&安装
make install
即完成mosquitto编译
image1177×722 163 KB
image674×669 48.7 KB
三、duo板运行
需要将cJSON、openssl、mosquitto
交叉编译生成安装目录下的
lib
全部拷贝至开发板/usr/lib
下
image548×726 34.3 KB
image646×723 16.9 KB
bin
全部拷贝至开发板/usr/bin
下
image599×570 22.6 KB
etc/mosquitto/
下的配置文件需要拷贝至/etc/mosquitto/
配置文件拷贝。
完成上面步骤后
mosquitto -c /etc/mosquitto/mosquitto.conf -v
即可启动,-d可后台运行,便于观察前台运行。
image858×107 5.25 KB
利用ssh再次开一个shell
输入mosquitto_sub -h localhost -p 1883 -t "demo/1"
订阅demo/1主题,该shell会被阻塞,等待消息发布。消息到来后输出消息内容。
利用ssh再次开一个shell
mosquitto_pub -h localhost -p 1883 -t "demo/1" -m "test"
mosquitto_pub -h localhost -p 1883 -t "demo/1" -m "hhhhhhh"
即可往topic下发布消息。
回到上一个订阅的shell
可以看到收到的消息了。
当然,服务端可以看到相关信息,连接、订阅、发布等
image1099×695 71 KB
实际除了上面用到的两个工具,还提供了用户创建,控制等工具
/etc/mosquitto/mosquitto.conf
为服务器的mqtt配置文件,请参考官网和百度按需配置自己的mqtt服务器吧。
当然也可以基于上面编译的mosquitto库开发自己的客户端程序。
更多的mosquitto使用和服务器的配置文件配置请自行查阅官方文档或者搜索引擎搜索
四、软件包获取
为了方便懒人,已经对软件包、动态库等进行了上传github,可以直接将软件包拷贝至duo上,然后tar zxvf xxx.tar.gz
解压后执行里面的install.sh
自动完成安装。
github地址)