From 0a00d65b83ebc41733ed6d1ad7512507ef0ecaad Mon Sep 17 00:00:00 2001 From: weidong Date: Sun, 12 May 2024 12:06:35 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E9=80=9A=E8=BF=87UDP=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=9F=BA=E7=AB=99=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/D331RtcmMessageExecutor.java | 66 +++++++++++-------- .../sideslope/service/DataPersistService.java | 3 + .../service/DataPersistServiceImpl.java | 28 ++++++++ .../sideslope/service/WarningServiceImpl.java | 43 ++++++------ 4 files changed, 94 insertions(+), 46 deletions(-) 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 36228ce3..5c00fda5 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 @@ -1,5 +1,6 @@ package com.imdroid.sideslope.executor; +import com.imdroid.common.util.ThreadManager; import com.imdroid.secapi.client.BeidouClient; import com.imdroid.secapi.dto.GnssDevice; import com.imdroid.sideslope.bd.Gga; @@ -8,6 +9,7 @@ import com.imdroid.sideslope.sal.Device; import com.imdroid.sideslope.sal.DeviceService; import com.imdroid.sideslope.server.DeviceChannel; import com.imdroid.sideslope.server.OnlineChannels; +import com.imdroid.sideslope.service.DataPersistService; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.slf4j.Logger; @@ -16,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.List; /** @@ -31,7 +34,8 @@ public class D331RtcmMessageExecutor implements Executor private DeviceService deviceService; @Autowired private BeidouClient beidouClient; - + @Autowired + private DataPersistService dataPersistService; @Override public Void execute(D331RtcmMessage message) { String id = message.getId(); @@ -63,8 +67,43 @@ public class D331RtcmMessageExecutor implements Executor } } + // trx stat message.setTenantId(device1.getTenantId()); + LocalDateTime lastTime = device1.getLastRxTime(); + Device lastCycleDevice; + if(LocalDateTime.now().isAfter(lastTime.plusMinutes(1))){ + // new cycle + lastCycleDevice = new Device(); + lastCycleDevice.setDeviceId(device1.getDeviceId()); + lastCycleDevice.setTenantId(device1.getTenantId()); + lastCycleDevice.setD3xxbytes(device1.getD3xxbytes()); + lastCycleDevice.setD341Count(device1.getD341Count()); + lastCycleDevice.setLastRxTime(device1.getLastRxTime()); + lastCycleDevice.setSatelitesInUse(device1.getSatelitesInUse()); + device1.clearStat(); + } else { + lastCycleDevice = null; + } + + // 如果控制通道没连接,则收到不到d3f0和d3f2,则根据UDP最后一个报文触发状态更新和统计 + // 测站的更新和统计放在解算之后进行,因为要统计固定解浮点解等信息 + if(lastCycleDevice != null){ + DeviceChannel channel = OnlineChannels.INSTANCE.getConfigChannel(device1.getDeviceId()); + if(channel == null || !channel.isOnline()){ + ThreadManager.getFixedThreadPool().submit(() -> { + // 通知上线 + try { + beidouClient.onDeviceActive(device1.getDeviceId(), device1.getTenantId()); + } catch (Exception e) { + + } + dataPersistService.updateDeviceState(lastCycleDevice); + }); + } + } + device1.updateRx(message.getHeader(),message.getLen(),message.getPacketNum()); + // update gga Gga gga = message.getGga(); if(gga != null) { device1.updateSatelitesNum(gga.getSatellitesInUsed()); @@ -73,31 +112,6 @@ public class D331RtcmMessageExecutor implements Executor device1.setLongitude(gga.getLongitude()); device1.setAltitude(gga.getAltitude()); } - // 借D341做GGA的统计分析 - /*D341LocationMessage d341Message = new D341LocationMessage(); - d341Message.setGga(gga); - d341Message.setId(message.getId()); - d341Message.setTenantId(message.getTenantId()); - d341Message.setPps(message.getPps()); - d341Message.setTilt(message.getTilt()); - d341Message.setB562_loc(null); - ThreadManager.getFixedThreadPool().submit(() -> { - gnssCalcService.calcSingle(d341Message,true); - });*/ - } - - // 收到第一个数据包,如果控制通道没连接,也通知上线 - if(device1.getD3xxCount() == 1){ - DeviceChannel channel = OnlineChannels.INSTANCE.getConfigChannel(device1.getDeviceId()); - if(channel == null || !channel.isOnline()){ - // 通知上线 - try{ - beidouClient.onDeviceActive(device1.getDeviceId(), device1.getTenantId()); - } - catch (Exception e){ - - } - } } return null; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java index 57bd58fe..6196c914 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistService.java @@ -22,4 +22,7 @@ public interface DataPersistService { void saveDeviceTrxStat(D3F2StopIndicationMessage d3F2StopIndicationMessage, boolean isUploading, Device device); void saveD342Stat(D342LocationMessage message, Device device); + + // 没有收到d3f2情况下的统计 + void updateDeviceState(Device device); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java index d0ae08d5..9c88fc69 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DataPersistServiceImpl.java @@ -140,4 +140,32 @@ public class DataPersistServiceImpl implements DataPersistService { ", bytes:"+device.getD342Bytes()+ ", total d341 num:"+device.getD341In42Count()+", session done"); } + + @Override + public void updateDeviceState(Device device) { + //新增或更新到status数据表里 + GnssStatus deviceState = deviceStateRepository.getByDeviceId(device.getDeviceId()); + boolean new_flag = false; + if(null == deviceState) { + deviceState = new GnssStatus(); + new_flag = true; + } + //deviceState.setId(SequenceUtil.getSequence()); + deviceState.setTenantid(device.getTenantId()); + deviceState.setDeviceid(device.getDeviceId()); + deviceState.setUpdatetime(device.getLastRxTime()); + deviceState.setD3xxbytes(device.getD3xxbytes()); + deviceState.setB562bytes(device.getD342Bytes()); + deviceState.setSatelliteinuse(device.getSatelitesInUse()); + + // 检测状态和告警 + deviceState.setState(GnssStatus.STATE_ACTIVE); + warningService.checkDeviceStatus(null, deviceState); + if(device.getDeviceType() == Device.DEVICE_BASE_STATION){ + warningService.checkD3xxNum(device); + } + + if(new_flag) deviceStateRepository.insert(deviceState); + else deviceStateRepository.updateById(deviceState); + } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java index c3566378..c6f4fc5e 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java @@ -89,27 +89,30 @@ public class WarningServiceImpl implements WarningService { isUpdated = true; } - //低电压告警 - if(statusMsg.getVoltage()!=null) { - if(check(curStatus, WarningCfg.TYPE_LOW_VOLTAGE, - WarningCfg.TYPE_NAME_LOW_VOLTAGE,true, - statusMsg.getVoltage(), null,null)) isUpdated=true; - } - //低RSSI - if(statusMsg.getRssi()!=null) { - if(check(curStatus, WarningCfg.TYPE_LOW_RSSI, - WarningCfg.TYPE_NAME_LOW_RSSI,true, - statusMsg.getRssi().intValue(), null,null)) isUpdated=true; - } - //倾角异常告警 - if(statusMsg.getPitch()!=null) { - if(check(curStatus, WarningCfg.TYPE_INCLINE, - WarningCfg.TYPE_NAME_INCLINE,false, - Math.abs(statusMsg.getPitch().intValue()), - Math.abs(statusMsg.getRoll().intValue()), - "pitch:"+ NumberUtils.scaleTwo(statusMsg.getPitch().doubleValue()) - +",roll:"+NumberUtils.scaleTwo(statusMsg.getRoll().doubleValue()))) isUpdated=true; + if(statusMsg!=null) { + //低电压告警 + if (statusMsg.getVoltage() != null) { + if (check(curStatus, WarningCfg.TYPE_LOW_VOLTAGE, + WarningCfg.TYPE_NAME_LOW_VOLTAGE, true, + statusMsg.getVoltage(), null, null)) isUpdated = true; + } + //低RSSI + if (statusMsg.getRssi() != null) { + if (check(curStatus, WarningCfg.TYPE_LOW_RSSI, + WarningCfg.TYPE_NAME_LOW_RSSI, true, + statusMsg.getRssi().intValue(), null, null)) isUpdated = true; + } + //倾角异常告警 + if (statusMsg.getPitch() != null) { + if (check(curStatus, WarningCfg.TYPE_INCLINE, + WarningCfg.TYPE_NAME_INCLINE, false, + Math.abs(statusMsg.getPitch().intValue()), + Math.abs(statusMsg.getRoll().intValue()), + "pitch:" + NumberUtils.scaleTwo(statusMsg.getPitch().doubleValue()) + + ",roll:" + NumberUtils.scaleTwo(statusMsg.getRoll().doubleValue()))) isUpdated = true; + } } + //卫星数 if(curStatus.getSatelliteinuse()!=null){ if(check(curStatus,WarningCfg.TYPE_LESS_INUSE_SAT,