前言
目前所有报警在云服务器,想要改为在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. 将报警信息上传到云服务器,云服务器查询设备所在小区,设备名称进行报警