使用 Mosquitto 搭建 MQTT 消息代理(服务器)

2024-12-26#MQTT#IoT

物联网设备通常使用基于发布/订阅模式的 MQTT 协议进行数据传输,Mosquitto 是一个实现了 MQTT 协议(5.0、3.1.1和3.1版本)的消息代理。本文介绍 Mosquitto 的安装配置。

安装 Mosquitto 🔗

在大部分的 Linux 发行版的包管理系统中,已经包含了 Mosquitto。比如,在 Armbian 中使用 apt 即可安装:

apt install -y mosquitto

配置 Mosquitto 🔗

当使用包管理器安装 Mosquitto 时,通常其配置位于 /etc/mosquitto/ 目录中。既即可在 /etc/mosquitto/mosquitto.conf 中直接配置;也可以在 /etc/mosquitto/conf.d/ 中添加新的配置文件。建议使用后者,这样便于以后的管理和迁移。

如果处于某些原因,该目录不存在。那么可使用 systemctl status mosquitto 找到服务单元文件,然后在启动配置里,找到 mosquitto 启动时的 -c 参数的值。这个值就是配置文件的地址。

访问控制 🔗

客户端访问 MQTT 代理时,可使用多种不同的认证方式(见官方文档《Authentication methods》)。以下简单介绍两种:匿名访问(即禁用认证)和通过用户名密码认证。除此之外还可通过认证插件完成身份认证。

匿名访问 🔗

当进行本地测试,或者真的不需要认证时,那么可打开匿名访问,这样任何客户端都可以直接访问 Mosquitto。

为此,在 Mosquitto 的配置文件中添加:

allow_anonymous true

启用用户名和密码认证 🔗

如果只有少量用户,那么可使用静态用户和密码进行认证。

在交互模式下添加用户 🔗

首先,创建空的密码文件:

touch /etc/mosquitto/password_file
chmod 0700 /etc/mosquitto/password_file

然后在交互模式下,添加用户:

mosquitto_passwd /etc/mosquitto/password_file <username>

根据提示输入密码和确认密码。打开 /etc/mosquitto/password_file 文件后,就会看到用户名和加密后的密码,二者用冒号隔开。

通过明文密码文件创建密码文件 🔗

另一种方式是先把用户名和明文密码保存在密码文件中,然后转换成加密后的密码。比如,在 /etc/mosquitto/password_file 中添加用户:

foo:bar

然后,修改为文件权限为 0700

chmod 0700 /etc/mosquitto/password_file

最后使用 mosquitto_passwd 对其进行加密:

mosquitto_passwd -U /etc/mosquitto/password_file

加载密码文件 🔗

在 Mosquitto 的配置文件中,使用 password_file 配置项设置密码文件:

password_file /etc/mosquitto/password_file

通常 mosquitto 是以 mosquitto 用户运行的,而文件的权限为 0700,因此为了让 mosquitto 能够读取密码文件,可以把密码文件的所有者修改为 mosquitto

chown mosquitto:mosquitto /etc/mosquitto/password_file

然后重启 mosquitto,确保其成功启动:

systemctl restart mosquitto.service

远程访问 🔗

默认情况下,Mosquitto 可能绑定在了 127.0.0.1,此时无法只能从本机访问。因此,需要将其绑定到 0.0.0.0,即可打开远程访问。为此,在配置文件中添加:

listener 1883 0.0.0.0

测试 🔗

为了测试 Mosquitto 使用安装配置成功,可使用 mosquitto_submosquitto_pub 命令进行简单的测试。不过,它们需要独立安装,在 Armbian 下可安装 mosquitto-clients 包:

apt install -y mosquitto-clients

测试本地的 Mosquitto 服务器 🔗

首先在控制台中监听某个主题,比如 test/topic

mosquitto_sub -v -t 'test/topic'

然后新开一个控制台,发布消息:

mosquitto_pub -v -t 'test/topic'

如果 Mosquitto 服务器启用了密码认证,那么可通过 -u-P 选项分别指定用户名和密码。

测试远程的 Mosquitto 服务器 🔗

如果要访问远程的 Mosquitto服务器,那么需要在运行 mosquitto_submosquitto_pub 时使用 -h-p 分别指定服务器的主机名和端口号。

参考资料 🔗


加载中...