引言
本文主要阐述通过交叉编译mosquitto库,然后在嵌入式设备上部署MQTT服务器,能够接收其他子设备的MQTT消息信息。
以下各个库的版本信息:
mosquitto-2.0.18
openssl-1.1.0l
(cJSON基本都是一样的,随便下载就可以了)
交叉编译mosquitto
首先交叉编译openssl、cJSON,这是其依赖库,然后再编译mosquitto。(注意以下的交叉编译方法只限定上述版本的库)
openssl
- 首先写一个脚本文件如下:
#!/bin/sh
LDLIBS="-ldl -lpthread" ./config no-asm no-shared no-threads --prefix=/data/luh/library/openssl/950 --cross-compile-prefix=aarch64-linux-gnu-sigmastar-10.2.1-
其中 --prefix表述安装路径,--cross-compile-prefix表示交叉编译链,其他都可以不用管。
- 然后运行此脚本文件。
- 运行之后会出现Makefile,在make之前删除Makefile中所有的-m64,然后再make运行。
注意:在make的时候可能会卡住不动,此时保持卡住页面不动,打开另一个会话界面再次make即可,结束后make install就可以了。
cJSON
- 编译
进入主目录,输入下述命令:
make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++
此处改为自己的交叉编译链就可以了。
- 安装:
make DESTDIR=$PWD install
DESTDIR:表示安装路径,将$PWD改为自己的安装路径即可。
mosquitto
- 配置:
进入主目录,在config.mk中添加下述路径(cJSON和openssl头文件以及库的路径):
CFLAGS += -I/data/luh/library/openssl/950/include
LDFLAGS += -L/data/luh/library/openssl/950/lib -lssl -lcrypto -ldl
CFLAGS += -I/data/luh/library/cJSON/950/include/cjson/
LDFLAGS += -L/data/luh/library/cJSON/950/lib/
prefix?=/data/luh/library/mosquitto/950
其中prefix是安装路径,上述配置的在config.mk中 位置如下:
- 编译:
make CC=aarch64-linux-gnu-sigmastar-10.2.1-gcc CXX=aarch64-linux-gnu-sigmastar-10.2.1-g++
选择自己的交叉编译链即可。
- 安装:
make install
注意:
若遇见报错,找不到dlopen等错误:
进入相应的目录,重新执行命令,添加-dl重新编译即可。
部署到设备
交叉编译mosquitto会得到下述文件:
将所有的文件复制到嵌入式设备中,或者mount挂载到设备目录下。
配置文件
在任意目录写一个运行配置文件如下所示:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
listener 11883 0.0.0.0
user root
allow_anonymous true
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /tmp
log_dest file /tmp/mosquitto.log
include_dir /mnt/mosquitto/etc/mosquitto/conf.d
这个配置文件包含了 Mosquitto MQTT 服务器的基本设置,下面逐行解释:
3. listener 11883 0.0.0.0: 设置 Mosquitto 服务器监听所有网络接口(通过 0.0.0.0 指定)上的端口 11883。这意味着任何设备都可以通过此端口与服务器建立连接。
4. user root: 设置运行 Mosquitto 服务时使用的用户为 root。这通常不是一个安全的做法,因为通常推荐使用一个权限较低的专用用户账户来运行服务以减少潜在的安全风险。
5. allow_anonymous true: 允许匿名用户连接到 MQTT 服务器。这意味着客户端无需提供用户名和密码即可连接并发布、订阅消息。
6. pid_file /var/run/mosquitto.pid: 指定 Mosquitto 服务运行时生成的进程 ID 文件位置。
7. persistence true: 开启持久化模式,意味着在服务器重启后,一些会话状态和保留消息等信息会被保存下来。
8. persistence_location /tmp: 设置持久化数据存储的位置,在本例中是 /tmp 目录。
9. log_dest file /tmp/mosquitto.log: 指定日志输出方式为写入文件,并设定日志文件的路径为 /tmp/mosquitto.log。
10. include_dir /mnt/mosquitto/etc/mosquitto/conf.d/: 指定包含其他配置文件的目录,当 Mosquitto 启动时,会加载此目录下的所有 .conf 结尾的文件作为附加配置。
注意:上述的配置可以自行选择必要的选项进行配置。
运行测试
进入sbin目录下运行mosquitto:
./mosquitto -c /mnt/mosquitto/etc/mosquitto/mosquitto.conf
然后进入bin分别运行下述命令,进行订阅和发布:
订阅主题hello:
./mosquitto_sub -v -t hello -p 11883
向主题hello中发布world消息:
./mosquitto_pub -t hello -m world -p 11883
发布world后能够在订阅方看到world