Mqtt集成与设计

Mqtt集成

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

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

了解几个概念:

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

正片开始:

1. 系统架构:

+------------------+   +-------------------+   +-----------------+| 设备端MQTT客户端  |<--->| MQTT代理(Broker) |<--->| 服务器MQTT客户端 || DeviceMqttClient |   | (例如Mosquitto)  |   | ServerMqttClient|+------------------+   +-------------------+   +-----------------+​    ^                         ^​    |                         |​    v                         v+------------------+                +-----------------+|   设备层    |                |   应用层    ||  Device Layer  |                | Application Layer|+------------------+                +-----------------+

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相关服务:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序和APP抓包的问题

小程序和APP抓包的问题 很多同学都会遇到小程序和APP抓不到包的问题,抓不到https请求包,这边给大家提供一些解决方案。 Yakit工具 首先需要的就是一个抓包神器yakit,这个工具非常好用强大,具体安装和使用大家可以参考上一篇文章。 PC端小程序抓包 PC端可以采用双层代理的方…

【多届检索稳定医工交叉会议|EI检索稳且快】-第六届医学人工智能国际学术会议(ISAIMS2025)

大会简介 第六届医学人工智能国际学术会议(ISAIMS 2025)将于2025年10月24-26日于中国西安召开。会议自2020年至今已经成功举办五届,吸引了来自海内外相关领域学者千余名。本届会议将继续围绕人工智能在医学领域的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位…

ChatGLM一键微调

阿里云平台配置DSW交互式建模实例创建每一步记得点击开始,一定要一个个点,下载完在点下一个最后完成之后,点击生成的地址跳转Demo页面Demo页面

关闭 WSL 中正在运行的 Linux 发行版

你使用 WSL 在 Windows 内运行 Linux 吗?你想知道如何关闭在 WSL 中运行的 Linux 发行版吗? 你当然可以在 WSL 中运行的 Linux 系统中 执行 shutdown 命令:sudo shutdown now你还可以使用 wsl 命令关闭 Linux 系统。如果你有多个发行版在 WSL 中运行,这是一种极好的方法。 …

windows如何调出剪贴板所有复制过的内容?

前言 大家好,我是小徐啊。我们在开发Java应用的时候,经常是需要复制粘贴的。我们在windows上面开发的时候,默认都是复制后,就把之前的复制的内容替换了。这就导致我们的复制粘贴很不方便,其实,windows可以支持我们显示最近所有的复制内容的,具体怎么做呢?文末附快捷键方…

AI与.NET技术实操系列(七):使用Emgu CV进行计算机视觉操作

引言 计算机视觉(Computer Vision, CV)是人工智能领域中最为引人注目的分支之一。从自动驾驶汽车到医疗影像分析,从智能安防系统到虚拟现实体验,计算机视觉的应用无处不在,深刻地改变着我们的生活和工作方式。 对于.NET开发者而言,掌握计算机视觉技术不仅意味着能够开发出…

路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路

D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。 漏洞分析bi…

北斗卫星时钟源,安徽京准助力国产时间精准度

北斗卫星时钟源,安徽京准助力国产时间精准度北斗卫星时钟源,安徽京准助力国产时间精准度 北斗卫星时钟源,安徽京准助力国产时间精准度 京准电钟官微——ahjzsz 北斗卫星时钟源作为中国自主研发的全球卫星导航系统的重要组成部分,其时间精准度的提升依赖于技术创新和系统优化…

ASE60N30-ASEMI工业自动化专用ASE60N30

ASE60N30-ASEMI工业自动化专用ASE60N30编辑:LL ASE60N30-ASEMI工业自动化专用ASE60N30 型号:ASE60N30 品牌:ASEMI 封装:TO-247 最大漏源电流:60A 漏源击穿电压:300V 批号:最新 RDS(ON)Max:38mΩ 引脚数量:3 沟道类型:N沟道MOS管 封装尺寸:如图 特性:MOS管、N沟道…

1周上线,2个月交付!有巢数智如何用 NocoBase 颠覆建筑行业数智化效率

有巢数智利用 NocoBase 平台,在建筑行业实现了数智化转型。 他们在 1 周内上线,2 个月内交付项目,显著提升了项目交付效率。 了解他们如何通过 NocoBase 的插件化架构,快速构建和调整功能,以满足复杂的业务需求。原文链接:https://www.nocobase.com/cn/blog/rapid-develo…

GoT:基于思维链的语义-空间推理框架为视觉生成注入思维能力

文探讨GoT框架如何通过语义-空间思维链方法提升图像生成的精确性与一致性 计算机视觉领域正经历一次技术革新:一种不仅能将文本转换为图像,还能在生成过程中实施结构化推理的系统。这一系统即为GoT(Generative Thoughts of Thinking,生成式思维链)框架——一种将显式推理机…

极速突破,PolarDB MySQL 列存索引加速复杂查询,完成任务可领取200社区积分!

「技术解决方案【Cloud Up 挑战赛】」上线了! 在电商行业,商品筛选页是用户找理想商品的关键,但商品数量激增、用户需求多样使现有筛选页面面临挑战,庞大商品数据需实时处理致系统性能要求高,用户筛选排序要求复杂使查询请求变复杂,传统数据库查询方式存在响应慢、延迟高…