MQTT broker 安装与基础配置实战指南(一)

一、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 的安装包,下载后解压并按照官方文档的指引进行安装和配置。

三、安装步骤详解

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.00.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 安全配置

  • 用户名、密码认证
    1. 打开配置文件mosquitto.conf,找到allow_anonymous选项,将其值改为false,禁止匿名登录 。
    1. 配置密码文件路径,找到password_file选项,如果没有则添加一行password_file /etc/mosquitto/pwfile,这里/etc/mosquitto/pwfile是密码文件的路径,可以根据实际情况修改 。
    1. 使用mosquitto_passwd命令创建密码文件和用户。如果pwfile文件不存在,使用以下命令创建并添加用户testuser:
复制代码

mosquitto_passwd -c /etc/mosquitto/pwfile testuser

执行上述命令后,会提示输入密码,输入并确认密码后,用户testuser及其密码就被添加到了pwfile文件中 。如果pwfile文件已存在,想要添加新用户,去掉-c参数,使用以下命令:

复制代码

mosquitto_passwd /etc/mosquitto/pwfile newuser

  • TLS/SSL 加密
    1. 首先需要获取 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

  1. 将生成的证书文件server.crt和私钥文件server.key放置在合适的目录,比如/etc/mosquitto/certs/ 。
  1. 编辑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 通信的可靠性和稳定性,满足不同应用场景的需求。

相关推荐
Quz2 天前
QML Hello World 入门示例
qt
xcyxiner5 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner6 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner6 天前
DicomViewer (添加模型类)3
qt
xcyxiner7 天前
DicomViewer (目录调整) 2
qt
xcyxiner7 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能9 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G9 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
森G9 天前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt
森G9 天前
71、打包发布---------打包发布
c++·qt