链接:
一、MQTT相关知识
在我们的代码中,我们使用了一个公共的Mosquitto测试服务器(test.mosquitto.org),它允许我们进行测试而不需要自己搭建broker。但在生产环境中,建议搭建自己的Mosquitto服务器或使用其他可靠的MQTT云服务。
注意:公共服务器可能不稳定,且不保证消息的私密性,因此只适用于测试。
1.1 什么是 Mosquitto?
Mosquitto 是一个开源 的 MQTT 消息代理(Broker),由 Eclipse Foundation 开发并维护。它是目前最流行、应用最广泛的 MQTT 代理软件之一。
1.2 MQTT 协议简介
-
MQTT (Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议
-
专为低带宽、高延迟或不稳定的网络环境设计
-
广泛应用于物联网(IoT)、移动应用和 M2M(机器对机器)通信
二、核心特性
2.1 协议支持
| 特性 | 支持情况 |
|---|---|
| MQTT 3.1 | ✅ 完全支持 |
| MQTT 3.1.1 | ✅ 完全支持 |
| MQTT 5.0 | ✅ 完全支持(v1.6+) |
| WebSocket | ✅ 支持 |
| SSL/TLS | ✅ 支持加密通信 |
2.2 性能特点
-
轻量级:占用资源少,适合嵌入式设备
-
跨平台:Windows、Linux、macOS、Raspberry Pi 等
-
高性能:支持大量并发连接(数万级别)
-
可扩展:支持插件系统和集群部署
三、架构组成
3.1 主要组件
┌─────────────────────────────────────────┐ │ Mosquitto 生态系统 │ ├─────────────────────────────────────────┤ │ 1. mosquitto (代理服务器/守护进程) │ │ 2. mosquitto_pub (命令行发布工具) │ │ 3. mosquitto_sub (命令行订阅工具) │ │ 4. libmosquitto (C客户端库) │ │ 5. mosquitto_passwd (密码文件工具) │ └─────────────────────────────────────────┘
3.2 通信模型
发布者 (Publisher) → Mosquitto Broker → 订阅者 (Subscriber) (发布消息) (路由消息) (接收消息) 主题层级示例: home/livingroom/temperature ← 发布温度数据 home/bedroom/light/control ← 控制灯光开关
四、安装与配置
4.1 在不同系统上安装
Ubuntu/Debian
bash
# 安装 Mosquitto
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
# 查看服务状态
sudo systemctl status mosquitto
# 启动/停止服务
sudo systemctl start mosquitto
sudo systemctl stop mosquitto
# 设置开机启动
sudo systemctl enable mosquitto
Windows
bash
# 1. 从官网下载安装包
# https://mosquitto.org/download/
# 2. 安装后,添加安装目录到 PATH 环境变量
# 3. 以服务方式运行
mosquitto install
# 4. 启动服务
net start mosquitto
4.2 配置文件详解
默认配置文件位置: /etc/mosquitto/mosquitto.conf
# ==================== 监听配置 ==================== # 监听端口(默认1883为MQTT,8883为MQTT over SSL) listener 1883 0.0.0.0 listener 8883 0.0.0.0 protocol mqtt # WebSocket 支持 listener 9001 protocol websockets # ==================== 安全配置 ==================== # 允许匿名连接(默认true,生产环境应关闭) allow_anonymous true # 密码文件 password_file /etc/mosquitto/passwd # ACL(访问控制列表) acl_file /etc/mosquitto/acl # ==================== SSL/TLS 配置 ==================== # 证书文件 cafile /etc/mosquitto/certs/ca.crt certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key # ==================== 日志配置 ==================== log_dest file /var/log/mosquitto/mosquitto.log log_type all # error, warning, notice, information, subscribe, unsubscribe # ==================== 持久化配置 ==================== persistence true persistence_location /var/lib/mosquitto/ persistence_file mosquitto.db # ==================== 桥接配置 ==================== # 连接其他MQTT代理 connection bridge-to-remote address remote.broker.com:1883 topic # both 2 # ==================== 限制配置 ==================== # 最大连接数 max_connections -1 # -1表示无限制 # 消息队列大小 max_queued_messages 1000 # 保持连接时间(秒) keepalive_interval 60
五、mosquitto_pub - 发布消息工具
5.1 基本语法
bash
mosquitto_pub [选项] -t <主题> -m <消息>
5.2 常用参数详解
| 参数 | 完整形式 | 说明 | 示例 |
|---|---|---|---|
| -h | --host | MQTT代理服务器地址 | -h localhost |
| -p | --port | 端口号(默认1883) | -p 1883 |
| -t | --topic | 消息主题(必需) | -t "home/livingroom/temp" |
| -m | --message | 消息内容(必需) | -m "22.5" |
| -q | --qos | 服务质量等级(0,1,2) | -q 1 |
| -r | --retain | 设置为保留消息 | -r |
| -u | --username | 用户名 | -u admin |
| -P | --password | 密码 | -P secret123 |
| -i | --id | 客户端ID | -i client_001 |
| -d | --debug | 调试模式 | -d |
| --help | 无 | 显示帮助信息 | --help |
5.3 参数组合示例
bash
# 示例1:最基本用法 - 连接本地服务器
# 格式:mosquitto_pub -h <主机> -t <主题> -m <消息>
mosquitto_pub -h localhost -t "test" -m "Hello"
# 示例2:连接远程公共测试服务器
mosquitto_pub -h test.mosquitto.org -t "my/test/topic" -m "Hello MQTT"
# 示例3:带QoS等级(确保消息到达)
mosquitto_pub -h localhost -t "sensor/data" -m "{\"temp\":22.5}" -q 1
# 示例4:保留消息(新订阅者能立即收到)
mosquitto_pub -h localhost -t "config/mode" -m "auto" -r
# 示例5:使用认证
mosquitto_pub -h 192.168.1.100 -u user1 -P pass123 -t "private/topic" -m "secret"
# 示例6:SSL/TLS加密连接
mosquitto_pub -h broker.example.com -p 8883 --cafile ca.crt -t "secure" -m "data"
# 示例7:从文件读取消息内容
echo "This is file content" > message.txt
mosquitto_pub -h localhost -t "file/upload" -f message.txt
# 示例8:从标准输入读取(管道方式)
echo "Line 1\nLine 2" | mosquitto_pub -h localhost -t "stdin" -s -l
5.4 高级参数
bash
# 设置Will遗言消息(客户端异常断开时发送)
mosquitto_pub -h localhost -t "status/client1" -m "online" \
--will-topic "status/client1" \
--will-payload "offline" \
--will-retain \
--will-qos 1
# 保持连接(心跳间隔)
mosquitto_pub -h localhost -t "ping" -m "alive" --keepalive 60
# 消息过期时间(秒)
mosquitto_pub -h localhost -t "temporary" -m "expire in 10s" --message-expiry 10
# 自定义属性(MQTT 5.0)
mosquitto_pub -h localhost -t "data" -m "value" --user-property "key:value"
六、mosquitto_sub - 订阅消息工具
6.1 基本语法
bash
mosquitto_sub [选项] -t <主题>
6.2 常用参数详解
| 参数 | 完整形式 | 说明 | 示例 |
|---|---|---|---|
| -h | --host | MQTT代理服务器地址 | -h localhost |
| -p | --port | 端口号 | -p 1883 |
| -t | --topic | 订阅主题(必需) | -t "sensor/#" |
| -q | --qos | 订阅QoS等级 | -q 1 |
| -v | --verbose | 显示主题和消息 | -v |
| -u | --username | 用户名 | -u subscriber |
| -P | --password | 密码 | -P pass456 |
| -i | --id | 客户端ID | -i sub_001 |
| -k | --keepalive | 心跳间隔 | -k 60 |
| -C | --msg-count | 接收消息数量后退出 | -C 10 |
| -R | --no-retained | 不接收保留消息 | -R |
| --help | 无 | 显示帮助 | --help |
6.3 通配符使用
bash
# 单级通配符 + (匹配一级)
# 匹配:home/livingroom/temp,不匹配:home/livingroom/bed/temp
mosquitto_sub -h localhost -t "home/+/temperature" -v
# 多级通配符 # (匹配多级,必须在末尾)
# 匹配:home/livingroom/light/status 和 home/kitchen/temp
mosquitto_sub -h localhost -t "home/#" -v
# 组合使用
mosquitto_sub -h localhost -t "+/sensor/+/data" -v
6.4 参数组合示例
bash
# 示例1:基本订阅
mosquitto_sub -h localhost -t "news"
# 示例2:显示主题和消息
mosquitto_sub -h localhost -t "sensor/temp" -v
# 输出:sensor/temp 22.5
# 示例3:订阅多个主题
mosquitto_sub -h localhost -t "temperature" -t "humidity" -t "pressure" -v
# 示例4:使用通配符订阅所有传感器数据
mosquitto_sub -h localhost -t "sensors/#" -v
# 示例5:只接收10条消息后退出
mosquitto_sub -h localhost -t "test" -C 10
# 示例6:SSL加密连接
mosquitto_sub -h broker.example.com -p 8883 \
--cafile ca.crt \
--cert client.crt \
--key client.key \
-t "secure/data" -v
# 示例7:保存输出到文件
mosquitto_sub -h localhost -t "log/#" > mqtt_log.txt
# 示例8:格式化输出
mosquitto_sub -h localhost -t "data" -v -F "[%t] %p"
# 输出:[home/temp] 22.5
6.5 输出格式化(-F 参数)
bash
# 可用的格式化占位符:
# %I: 消息ID
# %t: 主题
# %p: 消息内容
# %T: Unix时间戳
# %U: 本地时间(YYYY-MM-DD HH:MM:SS)
# %r: 保留标志(1=保留,0=不保留)
# %q: QoS等级
# 示例:完整格式
mosquitto_sub -h localhost -t "#" -v -F "[%U] QoS:%q Topic:%t Payload:%p"
# 输出:[2024-01-20 14:30:25] QoS:1 Topic:home/temp Payload:22.5
七、mosquitto_passwd - 密码管理工具
7.1 基本语法
bash
mosquitto_passwd [选项] <密码文件> <用户名>
7.2 常用参数详解
bash
# 创建新密码文件(如果文件存在则覆盖)
mosquitto_passwd -c passwd.txt username1
# 提示输入密码两次
# 向现有文件添加用户
mosquitto_passwd passwd.txt username2
# 批量模式(直接在命令行指定密码)
mosquitto_passwd -b passwd.txt username3 password123
# 删除用户
mosquitto_passwd -D passwd.txt username3
# 使用bcrypt加密(更安全,但更慢)
mosquitto_passwd -c -b passwd.txt username4 password456
# 不加密(明文,不推荐)
mosquitto_passwd -c -n passwd.txt username5
八、特殊参数和功能
8.1 连接选项
bash
# 设置超时时间
mosquitto_pub -h broker.example.com --connection-timeout 10 -t "test" -m "hello"
# 设置协议版本
mosquitto_sub -h localhost --protocol-version mqttv311 -t "test"
# 清理会话(clean session)
mosquitto_pub -h localhost --clean-session -t "test" -m "msg"
# SSL选项
mosquitto_pub -h secure.broker.com \
--cafile ca.crt \
--cert client.crt \
--key client.key \
--insecure \ # 跳过证书验证(仅测试)
-t "test" -m "data"
8.2 网络选项
bash
# 绑定到特定网络接口
mosquitto_pub -h broker.com --bind-address 192.168.1.100 -t "test" -m "data"
# 代理支持(SOCKS5)
mosquitto_pub -h broker.com --proxy socks5h://proxy:1080 -t "test" -m "data"
# IPv6连接
mosquitto_pub -h "::1" -t "test" -m "IPv6 test"
九、实际应用场景
9.1 监控系统主题
bash
# 监控所有系统状态
mosquitto_sub -h localhost -t "\$SYS/#" -v
# 监控特定指标
mosquitto_sub -h localhost -t "\$SYS/broker/bytes/received" -v
mosquitto_sub -h localhost -t "\$SYS/broker/clients/connected" -v
9.2 设备模拟
bash
# 模拟温度传感器
while true; do
temp=$((20 + RANDOM % 10))
mosquitto_pub -h localhost -t "sensors/temperature" -m "$temp" -q 1
sleep 5
done
# 模拟多个设备
for i in {1..5}; do
mosquitto_pub -h localhost -t "device/$i/status" -m "online" -r &
done
9.3 桥接和转发
bash
# 订阅一个主题,并转发到另一个主题
mosquitto_sub -h source.broker.com -t "source/#" -v | \
while read -r line; do
topic=$(echo "$line" | cut -d' ' -f1)
message=$(echo "$line" | cut -d' ' -f2-)
mosquitto_pub -h dest.broker.com -t "$topic" -m "$message"
done
十、总结
10.1 关键要点:
-
-h是最基本参数:指定MQTT代理服务器地址 -
-t和-m是必需参数:主题和消息内容 -
通配符 :
+单级,#多级(必须在末尾) -
QoS等级 :
-q 0(最多一次),-q 1(至少一次),-q 2(恰好一次) -
调试 :使用
-d参数查看连接过程
10.2 最佳实践:
-
生产环境:总是使用认证和加密(SSL/TLS)
-
主题设计 :使用层级结构,如
设备/类型/位置/数据 -
保留消息:谨慎使用,避免积压
-
客户端ID:指定有意义的ID,便于监控
10.3 记忆口诀:
-h 主机 -p 端口 -t 主题 -m 消息 -q 质量 -r 保留 -u 用户 -P 密码 -v 详情 -d 调试
十一、留言
如有问题,敬请指正。