实习项目-心跳检测报警

Posted by ni on November 21, 2024
本文共3298 字 | 大约需要10.99 分钟阅读

前言

目前所有报警在云服务器,想要改为在ICSC服务器(与硬件交互相关业务)实现当机器状态改变,根据不同机器,发送对应的报警目标(微信,企业微信,钉钉)

前系统流程

  • 1. MQTT接收回调,如果为心跳则更新心跳

    if(CallAccessControlMethodEnum.UPDATE_HEART.getCmd()
       .equals(accessMQTTMessageDTO.getFunc())) {
                log.info("update_heart:"+message);
                if(!message.contains("fail")){
                    accessMQTTSyncService.updateHeart(deviceSn, message);
                }
      
            }
    
  • 2. 设置定时任务,将心跳信息更新至服务器

    public Boolean syncAccessDevice() {
            // 获取项目中以及存在的设备
            List<AccessDevice> accessDeviceList = accessDeviceService.getAllDevice();
            if (CollectionUtils.isEmpty(accessDeviceList)) {
                return true;
            }
            // 同步设备,RestTemplate远程调用服务器接口
            setAccessDevice(accessDeviceList);
            // 获取当前设备未同步的权限
            getAccessDevicePermission(accessDeviceList);
            return true;
        }
    
  • 3. 服务器更新,修改设备状态

    for (SyncAccessDeviceDTO syncAccessDeviceDTO : syncAccessDeviceDTOs) {
                        AccessControlDevice accessControlDevice = new AccessControlDevice();
                        accessControlDevice.setId(syncAccessDeviceDTO.getId());
                        accessControlDevice.setLastSyncTime(syncAccessDeviceDTO.getKeepaliveTime());
                        accessControlDevice.setServerId(monitorServer.getId());
                        //10分钟无同步信息记标记为下线
                        Duration duration = null;
                        if (ObjectUtils.isNotEmpty(syncAccessDeviceDTO.getKeepaliveTime())) {
                            // 计算时间差
                            duration = Duration.between(syncAccessDeviceDTO.getKeepaliveTime(), LocalDateTime.now());
                        }
                        if (ObjectUtils.isNotEmpty(duration) && duration.getSeconds() > 600L) {
                            accessControlDevice.setIsOnline(YesOrNoEnum.NO.getCode());
                        } else {
                            accessControlDevice.setIsOnline(YesOrNoEnum.YES.getCode());
                        }
                        accessControlDevicesUpd.add(accessControlDevice);
                    }
    
  • 4. 服务器设置定时任务,扫描设备表进行报警操作

    @XxlJob(value = "accessControlSyncHandler")
        public ReturnT<String> AccessControlSync() {
            log.info("job accessControlSyncHandler begin:");
            ReturnT<String> returnT = new ReturnT<>();
            returnT.setCode(0);
            returnT.setContent("success");
            TenantContext.goMaster();
            iotAlarmCustomService.platformDateAlarm();
            List<Datasource> datasourceList = datasourceService.list();
            if (CollectionUtils.isNotEmpty(datasourceList)) {
                for (Datasource datasource : datasourceList) {
                    TenantContext.setDataSourceId(datasource.getId());
                    iotAlarmCustomService.tenantDataAlarm();
                    returnT.setMsg(accessControlCustomService.accessControlSync());
                }
            }
            log.info("job accessControlSyncHandler finished:");
            return returnT;
        }
    
  • 5. 系统大致结构

要求

  • 1. 机器下线进行报警

  • 2. 机器上线进行报警

  • **3. 一次状态变更只实现一次报警 **

  • 4. 由于协议不同有些机器直接在云服务器记录心跳,需要进行落库

    协议:1、韦根协议 2、MQTT协议 3、海康eHome协议

实现

  • 1. 创建一张表,记录机器之前状态
  • 2. 将不同协议没在ICSC服务器上落库的信息进行落库
  • 3. 设置定时任务,每分钟扫描设备表,与记录表的状态进行对比,如果不同就报警并修改记录表,如果没有就插入不报警
  • 4. 设备表都进行查询性能低,减少Select的字段,控制时间范围,长时间没心跳的机器不进行比对
  • 5. 将报警信息上传到云服务器,云服务器查询设备所在小区,设备名称进行报警