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 调试

十一、留言

如有问题,敬请指正。

相关推荐
喜喜安2 天前
MQTT物联网网关实验
物联网·mqtt·m5stack cores3
Tao____5 天前
基于若依RuoYi框架开发的物联网平台
java·物联网·mqtt·ruoyi·设备对接
松莫莫5 天前
Spring Boot 整合 MQTT 全流程详解(Windows 环境)—— 从 Mosquitto 安装到消息收发实战
windows·spring boot·后端·mqtt·学习
Tao____9 天前
支持mqtt、tcp、udp、websocket、http协议的物联网平台
java·物联网·mqtt·websocket·tcp/ip·udp
Tao____10 天前
适合中小型项目的物联网平台
java·物联网·mqtt·开源·iot
Tao____12 天前
开源物联网平台
java·物联网·mqtt·开源·设备对接
Tao____13 天前
国产开源物联网基础平台
java·物联网·mqtt·开源·设备对接
Tao____13 天前
国产开源物联网平台
java·物联网·mqtt·iot·设备对接
大河qu14 天前
HCIP-IoT/H52-111 真题详解(章节F),通信协议与通信设备 /Part1
mqtt·hcip·通信协议·coap·华为云物联网·lwm2m·网关设备