一、MQTT Broker 简介
**
MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输协议,是一种基于发布 / 订阅(Publish/Subscribe)模式的轻量级消息传输协议,构建于 TCP/IP 协议之上 。它最初由 IBM 在 1999 年开发,设计目的是为了解决低带宽、高延迟或不可靠的网络环境下,设备之间的通信问题,特别适用于资源受限的物联网设备。
在物联网架构中,MQTT Broker 扮演着消息中转站的关键角色。想象一下,在一个智能家居系统里,智能灯泡、智能插座、智能摄像头等设备就像一个个信息的生产者和消费者,而 MQTT Broker 就像是一个快递中转站。智能灯泡可以将自己的开关状态、亮度等信息 "快递" 到 MQTT Broker,而智能音箱等设备可以从 MQTT Broker "收取" 这些信息,从而实现对智能灯泡的语音控制。在这个过程中,设备(也就是 MQTT 客户端)通过发布(Publish)消息,将数据发送到 MQTT Broker,同时也能通过订阅(Subscribe)特定的主题,从 MQTT Broker 接收感兴趣的数据。MQTT Broker 作为消息的中转站,负责接收、存储和转发消息,实现设备之间的通信 。
常见的 MQTT Broker 类型有很多,每种都有其特点和适用场景:
- Mosquitto :这是一款轻量级的开源 MQTT Broker,由 Eclipse 基金会托管。它的内存占用少、运行开销低,非常适合在资源有限的设备上运行,比如树莓派。在小型智能家居项目中,使用树莓派搭载 Mosquitto,就能轻松实现家庭设备之间的通信。其官网为Eclipse Mosquitto 。
- EMQX :国产的开源 MQTT Broker,最大的亮点是支持百万级的并发连接。对于大型物联网项目,如智慧城市中的智能路灯管理系统,涉及大量的路灯设备需要连接和通信,EMQX 就能很好地胜任。官网地址是https://www.emqx.com/ 。
- HiveMQ :这是一款商用的 MQTT Broker,提供了企业级的功能和支持,像高可用性、集群、安全认证等。在对可靠性和安全性要求极高的金融物联网场景,如银行的智能安防监控系统,HiveMQ 就可以保障系统稳定运行。官网是https://www.hivemq.com/ 。
二、前期准备
2.1 环境需求
- 操作系统:MQTT Broker 的兼容性较好,主流操作系统都能支持,如 Windows、Linux、macOS 。如果是在 Windows 系统上进行安装,建议使用 Windows 10 及以上版本,能更好地适配和稳定运行。Linux 系统的话,像 Ubuntu 18.04 及以上版本、CentOS 7 及以上版本都可以。对于 macOS,建议是 macOS Catalina 及以上版本。
- 硬件资源:若只是进行简单的测试和学习,普通的计算机硬件配置即可满足需求。比如,处理器是 Intel Core i3 及以上,内存 2GB 及以上,硬盘有 500MB 以上的可用空间。但要是应用在生产环境中,对硬件的要求会更高,具体的要根据实际的连接设备数量、消息流量等因素来确定 。例如,在一个连接了数千台设备的工业物联网项目中,可能就需要配备高性能的服务器,具备多核处理器、16GB 及以上的内存,以及大容量的高速硬盘。
2.2 工具下载
- Windows 系统 :如果选择 Mosquitto 作为 MQTT Broker,可以在其官方网站(https://mosquitto.org/download/)上找到适用于 Windows 系统的二进制安装包。下载完成后,按照安装向导的提示进行安装,安装过程中注意勾选 "Add Mosquitto to PATH" 选项,这样就能方便地在命令行中使用 Mosquitto 的相关命令 。如果想使用图形界面客户端工具 MQTT.fx 来辅助测试和管理,可前往其官方 GitHub 仓库(https://github.com/mqttfx/MQTT.fx/releases)下载最新版本的安装包,下载后直接运行安装程序即可完成安装。
- Linux 系统 :以 Ubuntu 系统为例,在终端中输入命令 "sudo apt - get install mosquitto mosquitto - clients",就能安装 Mosquitto 及其客户端工具。对于 CentOS 系统,先添加 EPEL 仓库,命令为 "sudo yum install - y epel - release",然后更新 Yum 包索引 "sudo yum update",最后使用命令 "sudo yum install - y mosquitto" 来安装 Mosquitto 。如果需要使用其他工具,比如 MQTTX,这是一款跨平台的 MQTT 客户端工具,可在其官方网站(MQTTX: Your All-in-one MQTT Client Toolbox)下载适用于 Linux 的安装包,下载后解压并按照官方文档的指引进行安装和配置。
- macOS 系统 :可以通过 Homebrew 来安装 Mosquitto,在终端中执行命令 "brew install mosquitto" 即可完成安装 。若要安装图形化客户端,比如 MQTT Explorer,在其官网(MQTT Explorer | An all-round MQTT client that provides a structured topic overview)下载 dmg 文件,然后将其拖动到 "Applications" 文件夹中完成安装。
三、安装步骤详解
3.1 Linux 系统安装
以 Ubuntu 系统为例,通过apt - get命令来安装 Mosquitto MQTT Broker。在安装之前,先确保系统的软件包列表是最新的,打开终端,输入以下命令更新软件包列表:
sudo apt - get update
这个命令会从软件源获取最新的软件包信息,更新本地的软件包列表。更新完成后,就可以安装 Mosquitto 及其客户端工具了,执行以下命令:
sudo apt - get install mosquitto mosquitto - clients
上述命令中,mosquitto是 MQTT Broker 的核心程序,mosquitto - clients包含了用于测试和操作 MQTT 的客户端工具,比如mosquitto_pub(用于发布消息)和mosquitto_sub(用于订阅消息) 。安装过程中,系统会提示确认安装,输入Y并回车,等待安装完成。安装完成后,可以通过以下命令检查 Mosquitto 服务的状态:
sudo systemctl status mosquitto
如果看到类似于 "Active: active (running)" 的提示,就说明 Mosquitto 服务已经成功启动并正在运行 。
3.2 Windows 系统安装
在 Windows 系统下,我们可以使用 Docker 来安装 MQTT Broker 镜像,这里以安装 Eclipse Mosquitto 镜像为例。首先,需要安装 Docker Desktop,前往 Docker 官方网站(https://www.docker.com/products/docker-desktop/)下载适合 Windows 系统的安装包,下载完成后运行安装程序,按照提示完成安装 。安装完成后,打开 Docker Desktop,确保它已经运行。然后,打开 Windows 的命令提示符或 PowerShell,输入以下命令来拉取 Eclipse Mosquitto 的 Docker 镜像:
docker pull eclipse - mosquitto
这条命令会从 Docker Hub 上下载 Eclipse Mosquitto 镜像到本地。镜像拉取完成后,运行以下命令来启动 MQTT Broker 容器:
docker run -d -p 1883:1883 eclipse - mosquitto
命令解释:
- docker run:用于启动一个新的容器实例。
- -d:表示以后台模式运行容器,即容器在后台运行,不会占用当前命令行窗口。
- -p 1883:1883:将容器的 1883 端口映射到主机的 1883 端口,1883 是 MQTT 的默认端口,这样主机就可以通过 1883 端口访问容器内运行的 MQTT Broker 。
- eclipse - mosquitto:指定要运行的镜像名称。
3.3 MacOS 系统安装
MacOS 系统可以利用 Homebrew 包管理器来安装 MQTT Broker,这里同样安装 Mosquitto。如果你的 Mac 上还没有安装 Homebrew,可以在终端中运行以下命令进行安装:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安装完成后,通过 Homebrew 安装 Mosquitto,执行命令:
brew install mosquitto
Homebrew 会自动下载并安装 Mosquitto 及其依赖项。安装完成后,可以使用以下命令启动 Mosquitto 服务:
brew services start mosquitto
这条命令会启动 Mosquitto 服务,并将其设置为开机自启。如果需要停止或重启服务,相应的命令分别是:
# 停止服务
brew services stop mosquitto
# 重启服务
brew services restart mosquitto
四、基础配置实战
4.1 配置文件解读
Mosquitto 的配置文件通常位于/etc/mosquitto/mosquitto.conf(在 Linux 系统中),在 Windows 系统中,如果是使用默认安装路径,配置文件一般在C:\Program Files\mosquitto\mosquitto.conf 。使用文本编辑器打开配置文件,下面来解释一些常用的配置项:
- 端口配置:port 1883,这里的 1883 是 MQTT 协议的默认端口,如果希望更改 MQTT Broker 监听的端口,比如改为 1884,直接将 1883 修改为 1884 即可 。例如,在一些企业网络环境中,由于安全策略限制,可能需要将 MQTT Broker 的端口改为非默认端口。
- 监听地址 :bind_address 0.0.0.0,0.0.0.0表示 MQTT Broker 会监听服务器的所有网络接口。如果只想让它监听特定的 IP 地址,比如服务器的内网 IP 192.168.1.100,则将0.0.0.0替换为192.168.1.100 。在一个有多个网络接口的服务器上,通过设置特定的监听地址,可以提高安全性,只允许特定网络内的设备连接。
- 匿名访问:allow_anonymous true,默认情况下,Mosquitto 允许匿名客户端连接。如果要禁止匿名访问,增强安全性,将true改为false即可 。在生产环境中,为了防止非法访问,通常会禁止匿名连接,要求客户端进行身份认证。
4.2 安全配置
- 用户名、密码认证:
-
- 打开配置文件mosquitto.conf,找到allow_anonymous选项,将其值改为false,禁止匿名登录 。
-
- 配置密码文件路径,找到password_file选项,如果没有则添加一行password_file /etc/mosquitto/pwfile,这里/etc/mosquitto/pwfile是密码文件的路径,可以根据实际情况修改 。
-
- 使用mosquitto_passwd命令创建密码文件和用户。如果pwfile文件不存在,使用以下命令创建并添加用户testuser:
mosquitto_passwd -c /etc/mosquitto/pwfile testuser
执行上述命令后,会提示输入密码,输入并确认密码后,用户testuser及其密码就被添加到了pwfile文件中 。如果pwfile文件已存在,想要添加新用户,去掉-c参数,使用以下命令:
mosquitto_passwd /etc/mosquitto/pwfile newuser
- TLS/SSL 加密:
-
- 首先需要获取 SSL 证书和私钥文件。可以从证书颁发机构(CA)购买,也可以使用 OpenSSL 工具生成自签名证书 。如果使用 OpenSSL 生成自签名证书,在终端中执行以下命令生成私钥文件server.key:
openssl genrsa -out server.key 2048
然后生成证书签名请求文件server.csr:
openssl req -new -key server.key -out server.csr
最后根据证书签名请求文件生成自签名证书server.crt:
openssl x509 -req -in server.csr -days 365 -signkey server.key -out server.crt
- 将生成的证书文件server.crt和私钥文件server.key放置在合适的目录,比如/etc/mosquitto/certs/ 。
- 编辑mosquitto.conf配置文件,添加以下配置:
listener 8883 # 使用TLS加密时,一般使用8883端口
cafile /etc/mosquitto/certs/ca.crt # 如果有CA证书,指定CA证书路径
certfile /etc/mosquitto/certs/server.crt # 指定服务器证书路径
keyfile /etc/mosquitto/certs/server.key # 指定服务器私钥路径
require_certificate false # 设置为true表示客户端必须提供证书才能连接,false表示不需要客户端证书,根据实际需求设置
完成配置后,重启 Mosquitto 服务,使配置生效 。通过配置 TLS/SSL 加密,客户端与 MQTT Broker 之间传输的数据会被加密,防止数据被窃取和篡改,提高通信的安全性。
4.3 持久化与会话设置
- 消息持久化:在 Mosquitto 中,消息持久化可以确保在服务器重启或客户端断开连接时,重要消息不会丢失 。打开mosquitto.conf配置文件,找到以下配置项:
persistence true # 开启持久化,将false改为true
persistence_location /var/lib/mosquitto/ # 指定持久化数据存储目录,可根据实际情况修改
autosave_interval 1800 # 每隔1800秒(30分钟)将内存中的数据库保存到磁盘,可根据需要调整
当persistence设置为true时,Mosquitto 会将消息数据存储到persistence_location指定的目录中 。autosave_interval控制着内存中数据保存到磁盘的时间间隔,较小的时间间隔可以提高数据的安全性,但可能会增加磁盘 I/O 操作;较大的时间间隔则相反。
- 会话管理:MQTT 中的会话用于维护客户端与服务器之间的状态,特别是对于持久会话(clean session 为 false),服务器会保存客户端的订阅信息和未确认的消息 。在客户端连接时,可以通过设置clean session标志来控制会话的行为。以 Python 的paho - mqtt库为例,创建客户端时设置clean_session=False来建立持久会话:
import paho.mqtt.client as mqtt
client = mqtt.Client(client_id="my_client", clean_session=False)
在 Mosquitto 的配置文件中,也有一些与会话相关的配置,比如persistent_client_expiration,用于设置持久客户端在多长时间不连接后被删除 。默认情况下,持久客户端不会被删除,如果希望设置过期时间,比如 30 天,可以在配置文件中添加:
persistent_client_expiration 30d
上述配置表示如果一个持久客户端 30 天没有重新连接,服务器将删除与该客户端相关的会话信息 。通过合理配置消息持久化与会话设置,可以确保 MQTT 通信的可靠性和稳定性,满足不同应用场景的需求。