Mqtt集成与设计

Mqtt集成

集成mqtt,我们首先得明白什么是mqtt:

MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。适用于物联网(IoT)和设备通信场景,能够实现传感器、执行器和其它设备之间的高效通信。

了解几个概念:

MQTT 客户端、MQTT Broker、发布-订阅模式、主题、QoS

正片开始:

1. 系统架构:

2. 组件:

  • MQTT配置(MqttConfig):管理MQTT连接的配置信息
  • 基础MQTT客户端(BaseMqttClient):提供MQTT客户端的基础功能
  • 设备端MQTT客户端(DeviceMqttClient):面向设备的MQTT客户端实现
  • 服务器端MQTT客户端(ServerMqttClient):面向服务器的MQTT客户端实现
  • 设备池(DevicePool):管理所有已连接设备的信息
  • MQTT服务(MqttService):作为托管服务整合MQTT功能

3. 主题(Topic)设计

  • 设备相关

    • device/{deviceId}/info:设备信息
    • device/{deviceId}/status:设备状态
    • device/{deviceId}/heartbeat:设备心跳
    • device/{deviceId}/command:设备命令
    • device/{deviceId}/command/response:设备命令响应
  • 会议相关

    • meeting/broadcast:会议广播
  • 公告相关

    • announcement/broadcast:公告广播

4. 数据模型

4.1 设备信息(DeviceInfo)

设备的基本信息,包括:

  • 设备ID(DeviceId)
  • 设备名称(DeviceName)
  • 设备类型(DeviceType)
  • IP地址(IpAddress)
  • MAC地址(MacAddress)
  • 软件版本(SoftwareVersion)
  • 硬件版本(HardwareVersion)
  • 设备状态(Status)
  • 最后在线时间(LastOnlineTime)
  • 最后心跳时间(LastHeartbeatTime)
  • 描述(Description)
  • 位置(Location)
  • 额外属性(Properties)

4.2 设备状态(DeviceStatus)

设备可能的状态包括:

  • 离线(Offline)
  • 在线(Online)
  • 忙碌(Busy)
  • 其他自定义状态

4.3 设备命令(DeviceCommand)

发送给设备的命令,包括:

  • 命令ID(CommandId)
  • 设备ID(DeviceId)
  • 命令类型(CommandType)
  • 命令参数(Parameters)
  • 超时时间(Timeout)
  • 创建时间(CreateTime)

4.4 会议信息(MeetingInfo)

会议相关信息,用于会议通知。

4.5 公告信息(AnnouncementInfo)

系统公告信息,用于广播通知。

5. 工作流程:

5.1 服务启动流程

  1. 程序启动时,通过依赖注入注册MQTT相关服务:

    csharp 复制代码
    // 注册MQTT服务
    service.AddSingleton<MqttConfig>();
    service.AddSingleton<DevicePool>();
    service.AddSingleton<MqttService>();
    service.AddHostedService(provider => provider.GetRequiredService<MqttService>());
  2. MqttService作为IHostedService启动:

    • 加载MQTT配置
    • 创建服务器端MQTT客户端
    • 注册各种事件处理器
    • 连接到MQTT服务器
    • 启动心跳检查定时器
    • 启动设备清理定时器

5.2 设备连接流程

  1. 设备通过DeviceMqttClient连接到MQTT代理
  2. 连接成功后,设备发布自身信息到device/{deviceId}/info主题
  3. 服务器的ServerMqttClient收到设备信息,将设备添加到DevicePool
  4. 触发设备上线事件,执行相关业务逻辑

5.3 设备心跳流程

  1. 设备定期发送心跳消息到device/{deviceId}/heartbeat主题
  2. 服务器接收心跳消息,更新设备的最后心跳时间
  3. 服务器的心跳检查定时器定期检查设备心跳超时情况
  4. 对于心跳超时的设备,将其状态更新为离线,并触发设备离线事件

5.4 命令发送流程

  1. 应用程序通过MqttService.SendCommandAsync()发送命令
  2. 命令通过ServerMqttClient发布到device/{deviceId}/command主题
  3. 设备接收命令,执行相应操作
  4. 设备将命令执行结果发布到device/{deviceId}/command/response主题
  5. 服务器接收命令响应,触发命令响应事件

5.5 会议和公告广播流程

  1. 应用程序通过MqttService发布会议或公告信息
  2. 信息通过ServerMqttClient发布到对应广播主题
  3. 设备接收广播信息,触发相应事件进行处理

5.6 设备清理流程

  1. 设备清理定时器定期执行清理任务(默认每天凌晨2点)
  2. 清理长时间离线(默认24小时以上)的设备记录

6. 错误处理与重连机制

  1. MQTT客户端断开连接后,自动启动重连定时器
  2. 根据配置的重连间隔进行重连尝试
  3. 如果配置了最大重连次数,达到次数后停止重连;如果设置为0,则无限重连
  4. 所有通信操作都包含错误处理和日志记录

MQTT配置选项包括:

  • 服务器地址(ServerAddress):默认为"localhost"
  • 服务器端口(Port):默认为1883
  • 客户端ID(ClientId):默认自动生成
  • 用户名(Username)和密码(Password):用于认证
  • 是否使用TLS/SSL(UseTls):默认为false
  • 连接超时时间(ConnectionTimeout):默认为10秒
  • 心跳间隔(KeepAliveInterval):默认为60秒
  • 重连间隔(ReconnectInterval):默认为5秒
  • 最大重连次数(MaxReconnectAttempts):默认为0(无限重连)

设计思路讲完了,下面一篇文章讲解实现方式(以C#为例)

相关推荐
糖果罐子♡5 天前
MQTT 入门指南(一)
物联网·mqtt·嵌入式·通信协议
linweidong6 天前
物联网MQTT协议与实践:从零到精通的硬核指南
物联网·mqtt·websocket·嵌入式·iot·tdengine·工业物联网
月光技术杂谈19 天前
linux下MQTT订阅发布验证-mosquitto安装测试流程
linux·mqtt·订阅·mosquitto·发布·mosquitto_pub·mqtt-clients
慕木兮人可25 天前
关于阿里云-云消息队列MQTT的连接和使用,以及SpringBoot的集成使用
spring boot·物联网·mqtt·阿里云·云计算
Johny_Zhao1 个月前
基于CentOS Stream 8的物联网数据采集与展示方案
linux·网络·python·mqtt·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维
长流小哥1 个月前
STM32:ESP8266 + MQTT 云端与报文全解析
stm32·单片机·物联网·mqtt
特立独行的猫a1 个月前
使用 Go 语言实现完整且轻量级高性能的 MQTT Broker
开发语言·后端·mqtt·golang·broker·mqtt-broker
YGGP2 个月前
应用层协议简介:以 HTTP 和 MQTT 为例
mqtt·网络协议·http·rpc
Nerd Nirvana2 个月前
网关GateWay——连接不同网络的关键设备
网络·mqtt·计算机网络·gateway·路由器·modbus·电力设备
bing_1582 个月前
MQTT 在Spring Boot 中的使用
java·spring boot·后端·mqtt