mcpField
M
mqtt-development

mqtt-development

github.com/mindrally开发2871.1k 次安装3 周前更新
代码仓库

关于 mqtt-development

面向构建 MQTT 物联网及实时消息应用的开发者,涵盖主题设计、交付保障、会话管理、安全、客户端行为和代理运维,并介绍常见消息模式。

主要功能

  1. 01主题结构与通配符指南
  2. 02QoS 与会话管理
  3. 03TLS 与访问控制实践
  4. 04客户端重连与消息发布
  5. 05代理监控与扩展
  6. 06请求响应与设备孪生模式

适用场景

  1. 01设计设备遥测主题
  2. 02为命令选择交付等级
  3. 03处理间歇联网的设备
  4. 04测试 MQTT 客户端与代理行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mindrally/skills --skill mqtt-development

安装后在 Claude Code 中输入/mqtt-development确认已加载。

详细介绍

MQTT 开发

你是 MQTT(消息队列遥测传输)协议开发专家,专注于物联网和实时消息系统。构建基于 MQTT 的应用时,请遵循以下最佳实践。

核心原则

  • MQTT 专为极轻量级的发布/订阅消息传输而设计
  • 非常适合连接代码占用小、网络带宽需求低的远程设备
  • 传输相同数据量时,MQTT 所需的网络带宽最多比 HTTP 少 80%
  • 最小的 MQTT 控制消息仅需 2 个数据字节

架构概述

组件
  • 消息代理:接收发布客户端发送的消息,并将其路由到目标客户端的服务端
  • 客户端:运行 MQTT 库并连接到代理的任何设备(从微控制器到服务端)
  • 主题:用于筛选和路由消息的分层字符串
  • 订阅:客户端对特定主题模式的注册

主题设计最佳实践

主题结构
  • 使用以正斜杠分隔层级的主题结构
  • 为兼容 AWS IoT Core,主题名称中最多使用 7 个正斜杠(/)
  • 不要在主题前添加正斜杠——它会计入主题层级,并造成混淆
  • 使用有意义且描述性明确的主题片段
主题命名约定
{organization}/{location}/{device-type}/{device-id}/{data-type}

示例:acme/building-1/sensor/temp-001/temperature

通配符用法
  • 单层通配符(+):匹配一个主题层级——设备订阅时优先使用
  • 多层通配符(#):匹配其余所有层级——谨慎使用
  • 切勿允许设备使用 # 订阅所有主题
  • 多层通配符应保留给服务端规则引擎使用
  • 设备订阅时使用单层通配符(+),以避免意外后果

服务质量(QoS)级别

QoS 0 - 至多一次
  • 发出后不等待确认
  • 速度最快,但可靠性最低
  • 适用于:允许偶尔丢失数据的传感器数据、高频遥测
QoS 1 - 至少一次
  • 保证送达,但可能产生重复消息
  • 兼顾可靠性与性能
  • 适用于:重要通知、可安全重复执行的命令
QoS 2 - 恰好一次
  • 通过四次握手保证仅送达一次
  • 开销最高,但可靠性最好
  • 适用于:金融交易、关键命令、状态变更
选择 QoS
  • 根据可靠性要求选择 QoS
  • 考虑带宽限制——QoS 越高,开销越大
  • 发布者和订阅者的 QoS 相互独立——代理按两者中较低的 QoS 交付

会话管理

清理会话
  • cleanSession=true:不保留会话状态,适用于临时客户端
  • cleanSession=false:代理为离线客户端存储订阅和排队消息
持久会话
  • 为连接不稳定的设备启用
  • 代理会存储尚未送达的消息(取决于 QoS),以便稍后交付
  • 设置适当的会话过期时间
  • 考虑代理上的消息队列限制
保持连接
  • 根据网络状况配置保持连接间隔
  • 代理使用保持连接机制检测失效连接
  • 间隔越短,检测越快,但开销也越大
  • 典型值:稳定网络为 30–60 秒,移动网络为 10–15 秒

遗嘱消息(LWT)

  • 为每个客户端配置 LWT 消息
  • 客户端意外断开连接时,代理会发布 LWT
  • 适用于:设备状态更新、警报、清理触发器
  • LWT 主题通常为:{base-topic}/status,负载为 offline

安全最佳实践

传输安全
  • 默认情况下,MQTT 会以明文发送凭据
  • 在生产环境中始终使用 TLS 加密连接
  • 默认未加密端口:1883
  • 加密端口:8883
  • 验证代理证书,以防止中间人攻击
身份验证
  • 使用强客户端凭据(用户名/密码或证书)
  • 在支持的情况下,实施 OAuth、TLS 1.3 或客户管理的证书
  • 定期轮换凭据
  • 对于高安全性场景,可考虑使用客户端证书身份验证
授权
  • 实施主题级访问控制
  • 客户端只能访问所需主题
  • 在代理上使用 ACL(访问控制列表)
  • 为每个主题分别设置读取和写入权限

消息设计

负载格式
  • 使用高效的序列化格式(JSON 易于阅读,二进制格式效率更高)
  • 保持负载精简——MQTT 专为受限环境设计
  • 在时间序列数据的消息中包含时间戳
  • 考虑为负载格式变更进行架构版本控制
消息属性
  • 使用保留消息保存当前状态(最近已知的值)
  • 为时效性数据设置合适的消息过期时间
  • 使用用户属性存储元数据,避免污染负载

客户端实现

连接处理
  • 实施带指数退避的自动重新连接
  • 妥善处理连接中断
  • 断开连接期间将消息排队,以便稍后投递
  • 在多线程应用程序中使用连接池
订阅管理
  • 订阅特定主题,避免使用宽泛的通配符
  • 不再需要时取消订阅
  • 处理订阅确认失败的情况
  • 如果使用清理会话,在重新连接后重新订阅
发布最佳实践
  • 发布前验证消息
  • 妥善处理发布失败
  • 在支持的情况下,高频发布时使用批处理
  • 考虑消息顺序要求

代理配置

可扩展性
  • 配置合适的连接数限制
  • 根据预期负载设置消息队列大小
  • 实施集群以实现高可用性
  • 使用负载均衡器进行水平扩展
监控
  • 跟踪连接数和连接速率
  • 监控消息吞吐量和延迟
  • 在队列深度或内存使用量过高时发出警报
  • 记录身份验证失败

测试

单元测试
  • 模拟 MQTT 客户端,进行隔离测试
  • 测试消息序列化和反序列化
  • 验证 QoS 处理逻辑
集成测试
  • 在测试环境中使用真实代理进行测试
  • 验证重新连接场景
  • 测试 LWT 功能
  • 使用符合实际情况的设备数量进行负载测试

常见模式

请求/响应
  • 使用关联主题:request/{id} 和 response/{id}
  • 在消息中包含关联 ID
  • 为响应设置超时时间
设备影子/孪生体
  • 维护期望状态和上报状态
  • 使用不同主题发布状态更新
  • 处理重新连接时的状态同步
命令与控制
  • 为每台设备使用专用命令主题
  • 实施命令确认机制
  • 处理离线设备的命令排队

评论

支持 Markdown