diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java index 49e81bcf..b7a58a2a 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java @@ -203,8 +203,6 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { future = ThreadManager.getScheduledThreadPool().schedule(() -> { try { calCycleResult(device, groupCalc,date); - // 清除统计 - device.clearStat(); } catch (Exception e) { logger.error(e.toString()); } @@ -283,6 +281,13 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { } } + //更新有效解时间 + if(locationRecord.getEnabled()){ + if(device.getLastValidCalcDataTime().isBefore(resultTime)){ + device.setLastValidCalcDataTime(resultTime); + } + } + // 记录本次位置,作为下次的参考 if(focusCalculator.getVer()==6) { if(locationRecord.getRpose()!=null) { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java index af6bcb5f..ed35df8a 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java @@ -40,18 +40,11 @@ public class D331RtcmMessageExecutor implements Executor public Void execute(D331RtcmMessage message) { String id = message.getId(); // 补齐tenantId - Device device1 = deviceService.findByDeviceId(id); - if(device1 == null || device1.getOpMode() == GnssDevice.OP_MODE_UNUSE) return null; - - // 原始码流输出到日志文件 -- INFO 级别 - // 只有测站开了日志记录,或者消息来自基站,才将原码记录到日志文件 - if(device1.getLoggingmode() == GnssDevice.LOGGING_MODE_FULL || device1.getDeviceType() == GnssDevice.TYPE_REFERENCE_STATION){ - logger.info("receive {} d331 message: {}", message.getId(), DataTypeUtil.getHexString(message.getSrcData())); - logger.info("receive d331 rtcm message of device: {}, seq:{}, len:{}", message.getId(), message.getSeq(), message.getLen()); - } + Device deviceBs = deviceService.findByDeviceId(id); + if(deviceBs == null || deviceBs.getOpMode() == GnssDevice.OP_MODE_UNUSE) return null; // 推送基站数据 - if(device1.getOpMode() == GnssDevice.OP_MODE_USE) { + if(deviceBs.getOpMode() == GnssDevice.OP_MODE_USE) { byte[] forwardBytes = message.getSrcData(); // 要求快速转发,因此用缓存,不要每次都查数据库 List deviceList = deviceService.findByParentId(id); @@ -74,26 +67,26 @@ public class D331RtcmMessageExecutor implements Executor } // 如果30分钟内收到不到d3f0和d3f2,则根据UDP最后一个报文触发状态更新和统计 - LocalDateTime now = LocalDateTime.now(); - if(device1.getLastRxTime()!=null && - device1.getLastRxTime().isBefore(now.minusMinutes(1))){ - if(device1.getLastD3f0f2Time() == null || - device1.getLastD3f0f2Time().isBefore(now.minusMinutes(30))) { + if(deviceBs.getD3xxbytes()>0){ + LocalDateTime now = LocalDateTime.now(); + if(deviceBs.getLastRxTime().isBefore(now.minusMinutes(1)) && + (deviceBs.getLastD3f0f2Time() == null || + deviceBs.getLastD3f0f2Time().isBefore(now.minusMinutes(30)))) { // new cycle - logger.info("device {} rx {} d331 in a cycle while not d3f0f2",device1.getDeviceId(),device1.getD3xxCount()); + logger.info("device {} rx {} d331 in a cycle while not d3f0f2",deviceBs.getDeviceId(),deviceBs.getD3xxCount()); Device lastCycleDevice = new Device(); - lastCycleDevice.setDeviceId(device1.getDeviceId()); - lastCycleDevice.setTenantId(device1.getTenantId()); - lastCycleDevice.setD3xxbytes(device1.getD3xxbytes()); - lastCycleDevice.setD3xxCount(device1.getD3xxCount()); - lastCycleDevice.setLastRxTime(device1.getLastRxTime()); - lastCycleDevice.setSatelitesInUse(device1.getSatelitesInUse()); - device1.clearStat(); + lastCycleDevice.setDeviceId(deviceBs.getDeviceId()); + lastCycleDevice.setTenantId(deviceBs.getTenantId()); + lastCycleDevice.setD3xxbytes(deviceBs.getD3xxbytes()); + lastCycleDevice.setD3xxCount(deviceBs.getD3xxCount()); + lastCycleDevice.setLastRxTime(deviceBs.getLastRxTime()); + lastCycleDevice.setSatelitesInUse(deviceBs.getSatelitesInUse()); + deviceBs.clearStat(); ThreadManager.getFixedThreadPool().submit(() -> { // 通知上线 try { - beidouClient.onDeviceActive(device1.getDeviceId(), device1.getTenantId()); + beidouClient.onDeviceActive(deviceBs.getDeviceId(), deviceBs.getTenantId()); } catch (Exception e) { logger.error(e.toString()); } @@ -103,18 +96,26 @@ public class D331RtcmMessageExecutor implements Executor } // update trx - device1.updateRx(message.getHeader(),message.getLen(),message.getPacketNum()); + deviceBs.updateRx(message.getHeader(),message.getLen(),message.getPacketNum()); // update gga Gga gga = message.getGga(); if(gga != null) { - device1.updateSatelitesNum(gga.getSatellitesInUsed()); + deviceBs.updateSatelitesNum(gga.getSatellitesInUsed()); //if(gga.isFixed()) { //基站的quality不会是4 - device1.setLatitude(gga.getLatitude()); - device1.setLongitude(gga.getLongitude()); - device1.setAltitude(gga.getAltitude()); + deviceBs.setLatitude(gga.getLatitude()); + deviceBs.setLongitude(gga.getLongitude()); + deviceBs.setAltitude(gga.getAltitude()); //} } + ThreadManager.getFixedThreadPool().submit(() -> { + // 原始码流输出到日志文件 -- INFO 级别 + // 只有测站开了日志记录,或者消息来自基站,才将原码记录到日志文件 + if(deviceBs.getLoggingmode() == GnssDevice.LOGGING_MODE_FULL){ + logger.info("receive {} d331 message: {}", message.getId(), DataTypeUtil.getHexString(message.getSrcData())); + } + }); + return null; } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java index e60c0488..49ea89d9 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D341LocationMessageExecutor.java @@ -37,23 +37,16 @@ public class D341LocationMessageExecutor implements Executor0) { + LocalDateTime now = LocalDateTime.now(); + if (device.getLastRxTime().isBefore(now.minusMinutes(2)) && + (device.getLastD3f0f2Time() == null || + device.getLastD3f0f2Time().isBefore(now.minusMinutes(30)))) { // new cycle Device lastCycleDevice = new Device(); lastCycleDevice.setDeviceId(device.getDeviceId()); @@ -78,6 +71,7 @@ public class D341LocationMessageExecutor implements Executor { gnssCalcService.calcSingle(message,true); + // 原始码流输出到日志文件 -- INFO 级别 + if(device.getLoggingmode() == GnssDevice.LOGGING_MODE_FULL){ + logger.info("receive {} d341 message: {}", message.getId(), DataTypeUtil.getHexString(message.getSrcData())); + } + else { + Gga gga1 = message.getGga(); + if (gga1 != null && !gga1.isFixed()) { + // 若不是固定解,则打印原始码流到日志里 + logger.info("receive {} d341 message: {}", message.getId(), DataTypeUtil.getHexString(message.getSrcData())); + } + } }); return null; @@ -115,4 +113,8 @@ public class D341LocationMessageExecutor implements Executor getMessageType() { return D341LocationMessage.class; } + + void executeInThread(D341LocationMessage message){ + + } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java index b5476ded..b65c9102 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F2StopIndicationMessageExecutor.java @@ -67,8 +67,20 @@ public class D3F2StopIndicationMessageExecutor implements Executor { + // 开始周期解算 LocalDateTime uploadTime = multiLineGNSSCalcService.checkUploadTime( device.getDeviceId(), device.getTenantId()); + gnssCalcService.calSingleDone(device, null, message.getCreateTime()); + + // 检查告警 + if(device.getDeviceType() == Device.DEVICE_BASE_STATION) { + warningService.checkD3xxNum(device); + } + else{ + warningService.checkB562Num(device); + } + + // 保存统计 dataPersistService.saveDeviceTrxStat(message, (uploadTime!=null), device); // 保存缓存中的 GNSS 单次解析结果 @@ -87,15 +99,8 @@ public class D3F2StopIndicationMessageExecutor implements Executor warningCfgQueryWrapper = new QueryWrapper<>(); @@ -113,7 +113,7 @@ public class DeviceStatusChecker { WarningCfg warningCfg = warningCfgMapper.selectOne(warningCfgQueryWrapper); if(warningCfg == null) return; - // 获取所有n个小时内无固定解的测站 + // 获取所有warningCfg.getValue()个小时内无固定解的测站 LocalDateTime now = LocalDateTime.now(); LocalDateTime beginTime = now.minusHours(warningCfg.getValue()); QueryWrapper calcDataQueryWrapper = new QueryWrapper<>();