cxl
Published on 2025-06-15 / 38 Visits
0
0

MQTT Broker服务器开源利器-Mosquitto

在物联网(IoT)和实时数据传输日益普及的今天,消息队列和消息代理在应用架构中扮演着越来越重要的角色。对于 Java 开发者而言,选择一款高效、可靠且易于集成的消息代理至关重要。Mosquitto作为一款开源的消息代理软件,凭借其轻量级、支持多种协议(如 MQTT、MQTT-SN、WebSocket)等优势,成为众多开发者的首选。

Mosquitto 基础理论​

什么是 Mosquitto​

Mosquitto 是由 Eclipse 基金会开发和维护的开源消息代理,它实现了 OASIS MQTT(Message Queuing Telemetry Transport)消息协议,这是一种基于发布 / 订阅模式的轻量级通信协议,特别适合在低带宽、不稳定网络环境下的物联网设备和移动应用中使用。Mosquitto 不仅支持 MQTT 协议,还提供了对 MQTT-SN(用于传感器网络的简化版 MQTT)和 WebSocket 的支持,能够满足不同场景下的消息传递需求。

Mosquitto 的优势​

  • 轻量级:Mosquitto 占用资源少,适合在资源受限的设备(如树莓派、嵌入式设备)上运行。​

  • 开源免费:遵循 EPL(Eclipse Public License)协议,开发者可以自由使用、修改和分发。​

  • 跨平台:支持 Windows、Linux、macOS 等多种操作系统,并且提供了丰富的客户端库,方便与不同语言的应用集成。​

  • 安全可靠:支持 TLS/SSL 加密、用户名和密码认证、访问控制列表(ACL)等安全机制,保障消息传输的安全性。

Mosquitto 与 EMQX 对比​

性能表现​

  • Mosquitto:作为轻量级消息代理,在低并发、资源受限场景下表现出色,占用系统资源较少,适合小型物联网项目或边缘设备。但在高并发、大规模连接场景中,其性能可能会受到一定限制,处理能力相对较弱。​

  • EMQX:专为高并发、大规模物联网场景设计,采用了分布式架构和高效的消息处理算法,能够支持百万级别的并发连接和高吞吐量的消息处理,在性能上具有明显优势,更适合大型企业级物联网项目或需要处理海量数据的场景。​

功能特性​

  • Mosquitto:支持 MQTT、MQTT-SN、WebSocket 等协议,提供基础的发布 / 订阅功能,具备基本的安全机制,如 TLS/SSL 加密、用户名密码认证和访问控制列表(ACL)。但在集群管理、插件扩展等方面功能相对简单。​

  • EMQX:除了支持多种消息协议外,还提供了丰富的功能特性,如强大的集群管理功能,可实现自动发现、负载均衡和故障转移;具备灵活的插件机制,方便扩展功能,如集成数据库、实现消息持久化等;同时还支持规则引擎,可对消息进行过滤、转换和处理。​

生态与社区支持​

  • Mosquitto:是开源项目,拥有一定规模的社区,开发者可以在社区中获取帮助和分享经验。但其生态相对较小,插件和工具相对较少。​

  • EMQX:同样是开源项目,并且得到了广泛的应用和推广,拥有活跃的社区和庞大的生态系统。官方提供了丰富的文档、教程和示例,同时还有众多的第三方插件和工具,便于开发者快速构建复杂的物联网应用。​

使用场景建议​

如果项目对资源占用敏感,属于小规模、低并发的物联网应用,或者是在边缘设备上运行,Mosquitto 是一个不错的选择;而当项目需要处理高并发、大规模连接,对功能丰富度和扩展性有较高要求,例如大型智慧城市、工业物联网项目,EMQX 则更能满足需求 。

安装与部署

Docker

1. 拉取镜像
  docker pull eclipse-mosquitto:latest

2. 创建配置文件

创建本地目录存放配置和数据

   mkdir -p ./{config,data,log}

编辑配置文件 ./config/mosquitto.conf

  # 基础配置
  listener 1883
  allow_anonymous true  # 是否匿名连接
  
  # 持久化与日志
  persistence true
  persistence_location /mosquitto/data
  log_dest file /mosquitto/log/mosquitto.log
3. 启动容器
  #  1883 MQTT 默认端口,9001 WebSocket 端口(可选)
  docker run -d \
  --name my-mosquitto \
  -p 1883:1883 \
  -p 9001:9001 \
  -v $(pwd)/config:/mosquitto/config \
  -v $(pwd)/data:/mosquitto/data \
  -v $(pwd)/log:/mosquitto/log \
  eclipse-mosquitto

Windows

Mosquitto 官方网站下载安装包,按照安装向导进行安装。

Ubuntu 22.04.5

  # 更新系统软件库
  sudo apt update
  # 安装mosquitto套件
  sudo apt-get install mosquitto mosquitto-clients
  # 安装完成后查看服务状态
  systemctl status mosquitto

一同安装的还有其它mosquitto工具套件:mosquitto、mosquitto_ctrl、mosquitto_passwd、mosquitto_pub、mosquitto_rr、mosquitto_sub

除了基本的mqtt服务mosquitto外,其它工具的作用分别为:

mosquitto_ctrl:这是 Mosquitto 的控制工具,主要用于与运行中的 Mosquitto 代理进行交互,执行管理操作。

主要功能

  • 查看代理状态:获取运行时信息,如连接数、主题数等

  • 动态修改配置:无需重启服务即可调整部分参数

  • 执行维护操作:如清理会话、查看内存使用情况等

mosquitto_ctrl里有很多模块,如统计模块、安全模块,上面安装的默认只有安全模块,即dynsec模块,可使用 mosquitto_ctrl dynsec help 查看使用帮助,主要是关于ACL权限的

mosquitto_passwd:这是密码管理工具,专门用于创建和管理 Mosquitto 的用户密码文件。

主要功能

  • 创建密码文件:生成用于用户认证的密码文件

  • 添加 / 删除用户:管理密码文件中的用户账户

  • 修改用户密码:更新现有用户的登录密码

例子:mosquitto_passwd -c /etc/mosquitto/passwd cxl ,还有其它增删改查命令可通过 mosquitto_passwd --help 查看帮助

mosquitto_pub:这是 MQTT 消息发布工具,用于向 Mosquitto 代理发布消息。

核心参数

  • -h:指定代理服务器地址

  • -p:指定代理服务器端口

  • -t:指定发布的主题

  • -m:指定消息内容

  • -q:指定 QoS 级别 (0,1,2)

  • -u/-P:用于认证的用户名和密码

例子:

  # 发布简单消息到指定主题
  mosquitto_pub -h localhost -t test/topic -m "Hello World"
  
  # 使用QoS 2发布消息并启用TLS
  mosquitto_pub -h server.example.com -p 8883 -t sensors/temp \
    -m "25.5" -q 2 --cafile /path/to/ca.crt
  
  # 从文件读取内容作为消息发布
  mosquitto_pub -t logs/error -f /var/log/error.log
  
  # 发布保留消息
  mosquitto_pub -t status -m "online" -r

mosquitto_sub:这是 MQTT 消息订阅工具,用于从 Mosquitto 代理订阅主题并接收消息。

核心参数

  • -h:代理服务器地址

  • -p:代理服务器端口

  • -t:订阅的主题

  • -v:显示详细输出(包含主题)

  • -q:指定订阅的 QoS 级别

  • -u/-P:认证信息

例子,图中是我用mqttx客户端进行连接后发送的消息:

  # 订阅单个主题并显示消息
  mosquitto_sub -h localhost -t test/topic -v
  
  # 订阅多个主题
  mosquitto_sub -t "home/#" -t "office/#" -v
  
  # 使用通配符订阅所有主题
  mosquitto_sub -t "#" -v
  
  # 订阅并将消息保存到文件
  mosquitto_sub -t sensors/data -h 192.168.1.50 > sensor_data.log
  
  # 带认证信息的订阅
  mosquitto_sub -t private/topic -u username -P password -v

mosquitto_rr:这是请求 - 响应工具,基于 MQTT 实现远程过程调用 (RPC) 模式。

工作原理

  • 发送请求消息到特定主题

  • 等待并接收来自指定响应主题的回复

  • 自动处理请求 ID 匹配

需配合服务端使用,这里就不作演示了。

配置

基础配置

配置项

描述

默认值

示例

persistence

是否启用消息持久化

true

persistence true

persistence_location

持久化数据存储路径

/var/lib/mosquitto/

persistence_location /var/lib/mosquitto/

log_dest

日志输出目标(可设为 file、stdout、syslog 等)

syslog

log_dest file /var/log/mosquitto/mosquitto.log

log_type

日志记录类型

包含errorwarning

log_type all

include_dir

包含其他配置文件的目录

include_dir /etc/mosquitto/conf.d

网络配置

配置项

描述

默认值

示例

port

MQTT 服务端口

1883

port 1883

bind_address

绑定的 IP 地址

监听所有接口

bind_address 192.168.1.100

max_connections

最大并发连接数(-1 表示无限制)

-1

max_connections 1000

connection_messages

是否发布客户端连接 / 断开消息

false

connection_messages true

allow_anonymous

是否允许匿名连接

true

allow_anonymous false

安全认证配置

配置项

描述

默认值

示例

password_file

用户名密码文件路径

password_file /etc/mosquitto/passwd

acl_file

访问控制列表文件路径

acl_file /etc/mosquitto/acl

use_identity_as_username

是否使用客户端证书的 CN 作为用户名

false

use_identity_as_username true

tls_version

TLS 版本

tlsv1.2

tls_version tlsv1.3

cafile

CA 证书文件路径

cafile /etc/mosquitto/certs/ca.crt

certfile

服务器证书文件路径

certfile /etc/mosquitto/certs/server.crt

keyfile

服务器私钥文件路径

keyfile /etc/mosquitto/certs/server.key

桥接配置

配置项

描述

默认值

示例

connection

桥接连接名称

connection remote_broker

address

远程代理地址和端口

address 192.168.1.200:1883

topic

桥接主题配置(格式:topic 主题 QoS [方向])

topic sensors/# in 1

bridge_protocol_version

桥接协议版本

mqttv311

bridge_protocol_version mqttv5

bridge_insecure

是否允许不安全连接(用于 TLS)

false

bridge_insecure true

高级配置

配置项

描述

默认值

示例

autosave_interval

自动保存持久化数据的间隔(秒)

1800

autosave_interval 3600

max_inflight_messages

最大飞行中消息数

100

max_inflight_messages 200

max_queued_messages

最大排队消息数

1000

max_queued_messages 5000

message_size_limit

最大消息大小(字节)

0(无限制)

message_size_limit 1048576

retry_interval

重发间隔(秒)

20

retry_interval 30

sys_interval

系统主题发布间隔(秒)

10

sys_interval 30

WebSocket 配置

配置项

描述

默认值

示例

listener

监听端口和地址(用于 WebSocket)

listener 9001

protocol

协议类型

mqtt

protocol websockets

websockets_compression

是否启用 WebSocket 压缩

false

websockets_compression true

MQTTv5 特定配置

配置项

描述

默认值

示例

allow_zero_length_clientid

是否允许零长度客户端ID

true

allow_zero_length_clientid false

require_correct_packet_order

是否要求正确的包顺序

false

require_correct_packet_order true

use_subscribe_id

是否使用订阅标识符

false

use_subscribe_id true

系统资源配置

配置项

描述

默认值

示例

sys_interval

系统主题发布间隔(秒)

10

sys_interval 30

system_heartbeat

系统心跳间隔(秒)

0(禁用)

system_heartbeat 60

max_keepalive

最大 Keep Alive 值(秒)

65535

max_keepalive 3600

这些配置选项能满足大多数场景需求。实际使用时,建议先备份配置文件,再逐步调整参数并测试效果


Comment