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#为例)

相关推荐
moton20177 天前
Flutter开发避坑指南:高频问题排查与性能调优实战
mqtt·flutter·性能优化·前端框架·自动化·dart
smileNicky11 天前
物联网IoT系列之MQTT协议基础知识
物联网·mqtt·iot
土拨鼠不是老鼠21 天前
Qt 中集成mqtt协议
开发语言·qt·mqtt
PcVue China1 个月前
MQTT:物联网时代的数据桥梁
网络·科技·物联网·mqtt·安全·自动化·软件工程
wn5311 个月前
【物联网IoT - 10分钟,构建一个自己的MQTT Broker服务!】
后端·物联网·mqtt·iot·mosquitto
千汇数据的老司机1 个月前
物联网领域的MQTT协议,优势和应用场景
物联网·mqtt·物联网通信协议
沐暖沐1 个月前
MQTT知识
mqtt
国产化创客2 个月前
物联网MQTT协议及本地化部署测试
物联网·mqtt·通信协议
抠脚学代码2 个月前
ESP8266 MQTT服务器+阿里云
mqtt·阿里云·esp8266