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 服务启动流程
程序启动时,通过依赖注入注册MQTT相关服务:
// 注册MQTT服务
service.AddSingleton<MqttConfig>();
service.AddSingleton<DevicePool>();
service.AddSingleton<MqttService>();
service.AddHostedService(provider => provider.GetRequiredService<MqttService>());
MqttService作为IHostedService启动:- 加载MQTT配置
- 创建服务器端MQTT客户端
- 注册各种事件处理器
- 连接到MQTT服务器
- 启动心跳检查定时器
- 启动设备清理定时器
5.2 设备连接流程
- 设备通过
DeviceMqttClient连接到MQTT代理 - 连接成功后,设备发布自身信息到
device/{deviceId}/info主题 - 服务器的
ServerMqttClient收到设备信息,将设备添加到DevicePool - 触发设备上线事件,执行相关业务逻辑
5.3 设备心跳流程
- 设备定期发送心跳消息到
device/{deviceId}/heartbeat主题 - 服务器接收心跳消息,更新设备的最后心跳时间
- 服务器的心跳检查定时器定期检查设备心跳超时情况
- 对于心跳超时的设备,将其状态更新为离线,并触发设备离线事件
5.4 命令发送流程
- 应用程序通过
MqttService.SendCommandAsync()发送命令 - 命令通过
ServerMqttClient发布到device/{deviceId}/command主题 - 设备接收命令,执行相应操作
- 设备将命令执行结果发布到
device/{deviceId}/command/response主题 - 服务器接收命令响应,触发命令响应事件
5.5 会议和公告广播流程
- 应用程序通过
MqttService发布会议或公告信息 - 信息通过
ServerMqttClient发布到对应广播主题 - 设备接收广播信息,触发相应事件进行处理
5.6 设备清理流程
- 设备清理定时器定期执行清理任务(默认每天凌晨2点)
- 清理长时间离线(默认24小时以上)的设备记录
6. 错误处理与重连机制
- MQTT客户端断开连接后,自动启动重连定时器
- 根据配置的重连间隔进行重连尝试
- 如果配置了最大重连次数,达到次数后停止重连;如果设置为0,则无限重连
- 所有通信操作都包含错误处理和日志记录
MQTT配置选项包括:
- 服务器地址(ServerAddress):默认为"localhost"
- 服务器端口(Port):默认为1883
- 客户端ID(ClientId):默认自动生成
- 用户名(Username)和密码(Password):用于认证
- 是否使用TLS/SSL(UseTls):默认为false
- 连接超时时间(ConnectionTimeout):默认为10秒
- 心跳间隔(KeepAliveInterval):默认为60秒
- 重连间隔(ReconnectInterval):默认为5秒
- 最大重连次数(MaxReconnectAttempts):默认为0(无限重连)
设计思路讲完了,下面一篇文章讲解实现方式(以C#为例)
Mqtt集成与设计的更多相关文章
- mqtt 集成
-- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...
- MQTT 1——物联网集成项目技术选型与说明
最近做的JAVA项目与物联网设备有集成,记录一下从技术选型到实现,整合: 1.通信协议技术选型,MQTT技术介绍2.MQTT服务端安装,客户端测试3.MQTT客户端与Spring MVC整合 1.项目 ...
- mqtt使用二(集成到java代码中)
1.我采用的是springboot,首先pom文件中添加mqtt需要用到的依赖 <dependency> <groupId>org.springframework.boot&l ...
- SpringBoot 集成MQTT配置
目录 1. 前言 2. MQTT介绍 3. SpringBoot 集成MQTT 3.1 导入mqtt库 3.2 配置MQTT订阅者 3.3 配置MQTT发布者 3.4 MQTT消息处理和发送 3.4. ...
- MQTT 协议学习:000-有关概念入门
背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...
- MQTT协议 局域网和广域网 云服务器和虚拟主机、VPS SSH和FTP、SFTP
MQTT协议 MQTT协议就很好的解决了coap存在的问题.MQTT协议是由IBM开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议.MQTT协议采用发布/订阅模式,所有的物联网终端都通过TC ...
- 持续集成并不能消除 Bug,而是让它们非常容易发现和改正(转)
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI). 本文简要介绍持续集成的概念和做法. 一.概念 持续集成指的是 ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- 单机千万级MQTT连接服务器测试报告
目标:测试创建1000万客户端连接到服务器端,服务器操作系统 Linux(任意一款发行版服务器版本).分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器.在硬 ...
- MQTT入门篇
物联网(Internet of Things,IoT)最近曝光率越来越高.虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请 ...
随机推荐
- Qt数据库应用18-横向纵向排版
一.前言 近期用户提了个需求,需要打印一个文档,要求其中部分页横向排版部分页面纵向排版,这个在之前的通用打印导出pdf类中是不具备的,通用的打印导出pdf只能统一设置一个排版方式,要么横向要么纵向,而 ...
- 前端学习openLayers配合vue3(加载线上数据源)
现在我们学习一下加载网上的线上数据再加上点矢量图层,紧接着上一步 关键代码 layers: [ //瓦片图层source第三方,或者自带的,地图的底层 new TileLayer({ // sourc ...
- 【译】GitHub Copilot Free 在 Visual Studio 中
可能您还没有听说过,GitHub 刚刚宣布了 Copilot Free(免费版)!好消息是:您现在已经可以在 Visual Studio 中开始使用 Copilot Free 了.它现在已经可用了,我 ...
- 特斯拉CEO埃隆马.斯克的五步工作法,怎么提高工程效率加速产品开发?
简介 在<埃隆·马斯克传>这本书中,有两个章节写到了特斯拉 CEO 埃隆马斯克为了在一段时间内,提升特斯拉汽车 model 3 的产能到每个月 5000 辆这个数量级,在书中叫 " ...
- docker没有vi不能执行yum报Device or resource busy
最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...
- ffmpeg简易播放器(1)--了解视频格式
视频帧 对于一份视频,实质上是多张图片高速播放形成的.每一张图片即为该视频的一帧.而每秒钟播放的图片张数便为所谓的帧率(Frame Rate/Frame Per Second).常见的帧率有24fps ...
- Docker开发实践:在windows 7中使用Docker for windows访问GUI
1 安装Docker for windows 1.1下载Docker for windows 从下面的网址中下载Docker for windows并安装. https://www.docker.co ...
- 玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定
本文分享自天翼云开发者社区<玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定>,作者:天翼云社区官方账号 随着社会经济的发展和人民生活水平的提高,越 ...
- SqlServer中获取字符串中的数字部分
具体SQL如下所示: --获取字符串中的数字部分 CREATE FUNCTION [dbo].[f_GetNumStr] ( @Str NVARCHAR(MAX) ) RETURNS NVARCHAR ...
- 【忍者算法】从扫雷游戏到矩阵操作:探索矩阵置零问题|LeetCode 73 矩阵置零
从扫雷游戏到矩阵操作:探索矩阵置零问题 生活中的算法 想象你在玩扫雷游戏,当你点到一个地雷时,不仅这个格子会被标记,与它同行同列的格子也都会受到影响.或者想象一个办公室的座位表,如果某个位置发现了感染 ...