MQTT(mosquitto、命令行工具介绍)

链接:

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
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 关键要点:

  1. -h 是最基本参数:指定MQTT代理服务器地址

  2. -t-m 是必需参数:主题和消息内容

  3. 通配符+ 单级,# 多级(必须在末尾)

  4. QoS等级-q 0(最多一次),-q 1(至少一次),-q 2(恰好一次)

  5. 调试 :使用 -d 参数查看连接过程

10.2 最佳实践:

  1. 生产环境:总是使用认证和加密(SSL/TLS)

  2. 主题设计 :使用层级结构,如 设备/类型/位置/数据

  3. 保留消息:谨慎使用,避免积压

  4. 客户端ID:指定有意义的ID,便于监控

10.3 记忆口诀:

复制代码
-h 主机 -p 端口
-t 主题 -m 消息
-q 质量 -r 保留
-u 用户 -P 密码
-v 详情 -d 调试

十一、留言

如有问题,敬请指正。

相关推荐
EMQX2 小时前
Everything Will Flow:面向 AI 的新一代融合消息流平台 FlowMQ 正式发布
物联网·mqtt·智能硬件·flowmq
不懂的浪漫3 小时前
mqtt-plus 架构解析(五):错误处理与 ErrorAction 聚合策略
java·spring boot·后端·物联网·mqtt·架构
不懂的浪漫3 小时前
mqtt-plus 架构解析(三):Payload 序列化与反序列化,为什么要拆成两条链
java·spring boot·物联网·mqtt·架构
星野云联AIoT技术洞察1 天前
OPC UA、MQTT、Modbus 应该如何分层:工业 IoT 接入架构新思路
mqtt·modbus·opc ua·边缘网关·设备接入·协议分层·工业iot
EMQX1 天前
S3 正在吞噬一切:AI 时代的基础软件架构革命
人工智能·物联网·mqtt·flowmq
不懂的浪漫1 天前
mqtt-plus 架构解析(一):分层架构与设计哲学
spring boot·分布式·物联网·mqtt·架构
Z文的博客1 天前
嵌入式 ARM 设备交叉编译 mosquitto 2.0.20 (完整 TLS 支持) 详细教程 TRAE全程辅助,没敲一行代码
qt·mqtt·嵌入式·ai编程·mosquitto·嵌入式linux·trae
芯智工坊3 天前
第13章 Mosquitto监控与日志管理
前端·网络·人工智能·mqtt·开源
芯智工坊4 天前
第10章 Mosquitto桥接模式
网络·数据库·人工智能·mqtt·开源·桥接模式
芯智工坊4 天前
第12章 Mosquitto插件与扩展机制
mqtt·网络协议·开源