时间:2024-05-04
陈嘉欢
摘要:该文介绍了一个以SpringBoot框架为基础的物联网设备故障检测系统的设计与实现过程。该系统使用了MySQL、Redis以及MongoDB数据库,实现对物联网设备进行故障检测、对故障信息存储和反馈的功能,从而满足了对物联网设备故障检测的基本需求。
关键词:物联网設备;故障检测;故障反馈;SpringBoot;Redis;MongoDB
中图分类号:TP311.1 文献标识码:A
文章编号:1009-3044(2022)02-0109-03
1 引言
近年来,随着社会和互联网技术的快速发展,物联网技术也日渐成熟,社会正在逐步走向“万物互联”的时代。目前市面上诞生了许多功能不同的诸如摄像头、智能水表、电表以及智能家居等物联网设备[1],这些物联网设备的应用场景有很强的针对性并且十分智能,在提供了某方面功能的同时简化了某些流程、减轻了使用负担从而提升效率。与此同时,越来越多设备联网,也会造成一些困扰,例如物联网设备的操作管理流程复杂、设备发生故障难以及时发现等问题。其中对物联网设备进行实时故障检测和设备发生故障时的第一时间信息反馈尤为重要。合理运用物联网设备故障检测功能,能够在设备发生故障时避免或减少造成相应的人力、物力损失。
为了解决上述提到的物联网设备发生故障难以发现的问题,本文设计并实现了一个以SpringBoot[2]为基础的故障检测系统[3],将设备分成两种类型,对不同类型的设备使用不同的方法进行故障检测,当系统检测到有设备发生故障时,会采用发送电子邮件的方式,通知相应的人员及时解决设备故障问题。
2 系统设计
2.1 总体设计
设计该系统使用到的编译软件是IDEA,主要以SpringBoot框架为核心,选择MySQL数据库[4]对物联网设备信息持久化存储、使用Redis数据库的高速缓存功能对物联网设备进行故障检测,以及使用MongoDB文档型数据库对设备故障信息进行记录。
本系统根据物联网设备是否会主动上传设备心跳信息分为两种类型:设备会主动上传心跳信息(主动类型)和设备不会上传心跳信息(被动类型),对于两种类型的设备使用不同的方法进行故障检测。具体故障检测流程如图2所示。
2.2 数据库设计
本系统使用MySQL关系型数据库,对物联网设备的基本信息进行持久化存储和查询。根据功能需求分析,需要创建一个devices_db设备数据库,然后在数据库里面分别创建两个数据表:用户信息表和设备信息表。
用户信息表[5](user,用于登录系统,以及记录用户信息),其中的字段包含用户ID(user_id,用户ID,主键),账号(account,后台登录账号),密码(password,加密后的登录密码),用户名(user_name,用户姓名或昵称),手机号(phone,用于短信提醒),电子邮箱(email,用于发送邮件提醒),盐(salt,用于密码加密验证)等。
设备信息表(devices,记录设备的基本信息),其中的字段包含设备ID(device_id,设备ID,主键),设备UID(设备自身ID,设备唯一ID),设备类型(device_type,用于区分设备属于主动类型还是被动类型),设备名称(device_name,设备的名字),设备地点(device_address,记录设备所在地点),设备IP(device_ip,设备的IP地址,用于主动请求设备),设备状态(device_state,用于显示设备的在线状态,在线或离线)等。
2.3 主动类型设备故障检测设计
一般的物联网设备都会有自动上传心跳信息的功能,心跳信息包含对应的设备信息,如果设备有正常上传心跳信息则可以判定设备目前正常运行,心跳信息上传地址和推送间隔可以在设备后台手动设置,本文将此类设备归纳为主动类型设备。图3是某物联网设备的心跳信息参数设置界面。
系统有一个专门接收心跳信息的接口,在接收到设备心跳信息时,将设备的UID与当前系统时间以键值对的形式存入到Redis缓存中,记录设备最近一次的在线时间。图4是系统接收设备心跳信息接口。
系统运行后,会定时执行一个判断主动类型设备是否在线的任务,本系统设定为每分钟执行一次,每次执行该任务都会先查询设备信息表中所有的主动类型设备(根据device_type字段判断),并生成对应列表(List),然后系统启动多线程对列表中的所有设备进行故障检测。
具体的检测方法是根据当前设备的UID,并以这个UID为key去Redis缓存中查询当前设备最后一次在线时间,将当前的系统时间减去设备最后一次在线时间,得到时间差,如果时间大于心跳上传阈值(60秒)则判定该设备发生故障。
2.4 被动类型设备故障检测设计
与主动类型设备相反,不会上传心跳信息的设备则为被动类型设备。对于被动类型设备,不能通过等待设备主动响应的方式来判断设备是否发生故障,因此想要知道设备是否在线,需要系统主动去请求设备,例如主动请求设备信息接口或者Ping设备IP。因为不同设备的获取信息接口格式不一,所以本文采用主动Ping设备IP的方式来实现。系统启动后,也会每分钟执行一次定时任务,查询设备信息表中所有被动类型设备并生成对应列表。
然后系统将启用多线程对列表中的每台被动类型设备采用Ping设备IP的方式主动发起请求,如果设备在3秒内没有响应,则重新发生请求,以防网络波动引起误判,如果再次请求设备还是没有响应则判定该设备发生故障。
2.5 设备故障反馈设计
对于主动类型设备和被动类型设备,当根据对应的方法判定设备发生故障后,会先将设备UID为key,设备的状态为value存入到一个公有的故障设备映射(Map)中,此步骤是为了避免某设备发生故障后,一直重复提醒该设备发生故障。随后将此故障设备信息和当前系统时间存入到MongoDB数据库以及公有的故障集合(Set)中。
在系统启动后,每分钟都会执行一个定时任务,每次执行时都将判断故障设备集合(Set)是否为空,如果不为空,则说明有设备发生故障,此时系统将发送电子邮件到管理人员邮箱中,提醒有设备发生故障,尽快处理。发送电子邮件后,系统将会清空故障设备列表,避免重复发送邮件通知。
3 系统测试
该系统的可运行在Linux和windows操作系统上,运行前必须在本地或者服务器上安装配置好JDK1.8及以上的环境,并且启动MySQL、Redis以及MongoDB数据库确保连接成功,并且MySQL数据库中需要创建好device_db数据库,里面应包含用户信息表(user)和设备信息表(devices),通过修改项目的配置文件,填写MySQL、Redis、MongoDB数据库的连接地址(url)、端口(port)、账户和密码,本文将数据库部署在云服务器上并且在本地启动项目运行,成功连接上服务器的数据库[6]。
本地测试连接数据库成功后,即可使用Maven工具将项目打成jar包,通过使用XShell、XFtp等工具连接上云服务器再将jar包上传到服务器上并运行起来,系统成功启动。
MySQL数据库中设备信息表存在部分主动类型设备和被动类型不在线,因此系统通过定时任务检测到设备故障,然后发送电子邮件提醒,设备故障信息邮件如图13所示。
4 结束语
本文设计并实现了基于SpringBoot框架开发的物联网设备故障检测系统,通过将物联网设备分成主动和被动两种类型,分别采用不同的方法进行故障判断。对于主动类型设备,系统根据定时任务,将设备存储在Redis缓存里的最近一次心跳记录时间与当前时间作比较,如果时间差大于设定阈值,则判断设备发生故障,反之则设备正常;对于被动类型设备,系统根据定时任务,主动请求设备IP地址,并等待设备响应,如果设备在设定的阈值时间内没有响应,则判断设备发生故障,如果有响应则说明设备正常。对于故障反馈,也是采用定时任务的方式,当系统发现故障列表不为空,则将故障列表里的设备存储在MongoDB数据库中,并及时将故障设备信息发送电子邮件通知到对应的用户。
当然本系统也存在一定的缺陷,频繁使用定时任务检测,以及开启多线程去请求多台设备,会占用一定的系统资源,还有可能造成线程堵塞,影响效率。未来会有更多的设备联网,对物联网设备的故障檢测会愈发得到人们重视,也会有更多的方法对现有的系统提出改进,对高并发、多线程情景做优化处理。
参考文献:
[1] 高小淋.物联网设备通讯故障检测技术与解决方案[J].电脑知识与技术,2021,17(9):210-212.
[2] 杨开振.深入浅出Spring Boot 2.x[M].北京:人民邮电出版社,2018.
[3] 张海藩.软件工程[M].4版.北京:清华大学出版社,2003.
[4] 唐汉明.深入浅出MySQL[M].北京:人民邮电出版社,2014.
[5] 桑一梅,陆文怡.学生管理系统的设计与实现[J].电脑知识与技术,2020,16(35):62-63,77.
[6] 李宏坤,郑光勇,谢舞,等.基于spring boot框架的公司考勤系统的研究与设计[J].电脑知识与技术,2019,15(18):55-56.
【通联编辑:谢媛媛】
2923500783331
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!