使用 Mosquitto 搭建 MQTT 消息代理(服务器)
物联网设备通常使用基于发布/订阅模式的 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_sub
和 mosquitto_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_sub
和 mosquitto_pub
时使用 -h
和 -p
分别指定服务器的主机名和端口号。