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

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

Mqtt集成与设计的更多相关文章

  1. mqtt 集成

    -- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...

  2. MQTT 1——物联网集成项目技术选型与说明

    最近做的JAVA项目与物联网设备有集成,记录一下从技术选型到实现,整合: 1.通信协议技术选型,MQTT技术介绍2.MQTT服务端安装,客户端测试3.MQTT客户端与Spring MVC整合 1.项目 ...

  3. mqtt使用二(集成到java代码中)

    1.我采用的是springboot,首先pom文件中添加mqtt需要用到的依赖 <dependency> <groupId>org.springframework.boot&l ...

  4. SpringBoot 集成MQTT配置

    目录 1. 前言 2. MQTT介绍 3. SpringBoot 集成MQTT 3.1 导入mqtt库 3.2 配置MQTT订阅者 3.3 配置MQTT发布者 3.4 MQTT消息处理和发送 3.4. ...

  5. MQTT 协议学习:000-有关概念入门

    背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...

  6. MQTT协议 局域网和广域网 云服务器和虚拟主机、VPS SSH和FTP、SFTP

     MQTT协议 MQTT协议就很好的解决了coap存在的问题.MQTT协议是由IBM开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议.MQTT协议采用发布/订阅模式,所有的物联网终端都通过TC ...

  7. 持续集成并不能消除 Bug,而是让它们非常容易发现和改正(转)

    互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI). 本文简要介绍持续集成的概念和做法. 一.概念 持续集成指的是 ...

  8. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  9. 单机千万级MQTT连接服务器测试报告

    目标:测试创建1000万客户端连接到服务器端,服务器操作系统 Linux(任意一款发行版服务器版本).分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器.在硬 ...

  10. MQTT入门篇

    物联网(Internet of Things,IoT)最近曝光率越来越高.虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请 ...

随机推荐

  1. yarn : 无法加载文件 C:\Users\duany\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本

    在win10 下安装yarn后,在编辑器中检查yarn的安装的时候会出现: 解决方法 1:搜索powershell,以管理员方式运行powershell2:使用命令更改计算机的执行策略 执行: set ...

  2. 不为人知的网络编程(十五):深入操作系统,一文搞懂Socket到底是什么

    1.引言 我相信大家刚开始学网络编程中socket的时候,都跟我一样对书上所讲的socket概念云里雾里的.似懂非懂,很是困扰. 这篇文章我打算从初学者的角度,用通俗易懂的文字,跟大家分享下我所理解的 ...

  3. 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

    Navicat导出的MySQL8.0脚本在低版本MySQL导入执行报错 utf8mb4_0900_ai_ci 替换 utf8_general_ci utf8mb4 替换 utf8 完成以上两点替换再次 ...

  4. CDS标准视图:优先级描述数据 I_GenericPriorityTextData

    视图名称:优先级描述数据 I_GenericPriorityTextData 视图类型:基础视图 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IGENPRIOTEX ...

  5. ABC 386 (A~F)

    赛时做的,结果一直在卡D题.打得很失败的一场. ABC 略. D 题意可以转化为:给定\(m\)个黑色或白色的格子,其中: 每个黑色格子和\((1,1)\)作为对角线顶点,构成一个黑色矩形 每个白色格 ...

  6. Spring Cloud Alibaba实战,从微服务架构到基本服务配置

    https://blog.csdn.net/itcast_cn/article/details/124558887 Spring Cloud Alibaba 实战 1目标理解什么是微服务架构理解什么是 ...

  7. w3cschool-Zookeeper 教程

    参考https://www.w3cschool.cn/zookeeper/ Zookeeper 概述 ZooKeeper 是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂 ...

  8. Java底层知识面试题

    JVM内存结构class文件格式JVM不会理解我们写的Java源文件, 我们必须把Java源文件编译成class文件, 才能被JVM识别, 对于JVM而言,class文件相当于一个接口class文件是 ...

  9. MongoDB:【索引类型】单字段索引、复合索引、其他索引

    查询性能分析:

  10. 盘点!HelloGitHub 年度热门开源项目

    春节将至,HelloGitHub 也迎来了年终盘点时刻.这是一份送给开源爱好者的"年终盛宴",期待你在这里发现更多值得关注的开源佳作. 为了满足不同读者的需求,我精心准备了这期超长 ...