链接:
1、MQTT - mosquitto安装、启动、使用
2、MQTT--EMQX入门+MQTTX使用
3、EMQX-简介、安装部署、基础功能、python代码测试
4、MQTTX的官方文档(MQTTX 是由 EMQ 开发的一款开源跨平台 MQTT 5.0 桌面客户端)
一、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
# 安装 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 mosquittoWindows
# 1. 从官网下载安装包 # https://mosquitto.org/download/ # 2. 安装后,添加安装目录到 PATH 环境变量 # 3. 以服务方式运行 mosquitto install # 4. 启动服务 net start mosquitto4.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 基本语法
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 参数组合示例
# 示例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 -l5.4 高级参数
# 设置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 基本语法
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 通配符使用
# 单级通配符 + (匹配一级) # 匹配: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" -v6.4 参数组合示例
# 示例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.56.5 输出格式化(-F 参数)
# 可用的格式化占位符: # %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 基本语法
mosquitto_passwd [选项] <密码文件> <用户名>7.2 常用参数详解
# 创建新密码文件(如果文件存在则覆盖) 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 连接选项
# 设置超时时间 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 网络选项
# 绑定到特定网络接口 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 监控系统主题
# 监控所有系统状态 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" -v9.2 设备模拟
# 模拟温度传感器 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 & done9.3 桥接和转发
# 订阅一个主题,并转发到另一个主题 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 调试
十一、留言
如有问题,敬请指正。