diff --git a/sec-beidou-fwd/src/test/java/DataTest.java b/sec-beidou-fwd/src/test/java/DataTest.java index f14359a8..84be9d1e 100644 --- a/sec-beidou-fwd/src/test/java/DataTest.java +++ b/sec-beidou-fwd/src/test/java/DataTest.java @@ -1,7 +1,5 @@ import com.imdroid.beidou_fwd.entity.KingMaData; import com.imdroid.common.util.GsonUtil; -import com.imdroid.secapi.dto.GnssCalcData; -import com.imdroid.secapi.utils.HexUtil; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D314PingMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D314PingMessageExecutor.java new file mode 100644 index 00000000..1ceeb4e8 --- /dev/null +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D314PingMessageExecutor.java @@ -0,0 +1,34 @@ +package com.imdroid.sideslope.executor; + +import com.imdroid.sideslope.message.D314PingMessage; +import com.imdroid.sideslope.server.OnlineChannels; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.springframework.stereotype.Component; + +/** + * @author Layton + * @date 2023/2/2 20:49 + */ +@Component +public class D314PingMessageExecutor implements Executor { + + @Override + public Void execute(D314PingMessage message) { + String deviceId = message.getId(); + byte[] forwardBytes = message.getSrcData(); + OnlineChannels.INSTANCE.get(deviceId).ifPresent(deviceChannel -> { + forwardBytes[12] = (byte) 1;//ping ack + ByteBuf buf = Unpooled.buffer(); + buf.writeBytes(forwardBytes); + deviceChannel.writeAndFlush(buf); + }); + + return null; + } + + @Override + public Class getMessageType() { + return D314PingMessage.class; + } +} diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java index 2e67f762..f787175d 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D3F0SelfCheckMessageExecutor.java @@ -2,13 +2,13 @@ package com.imdroid.sideslope.executor; import com.imdroid.common.util.HexUtil; import com.imdroid.secapi.client.BeidouClient; -import com.imdroid.secapi.client.RtcmClient; import com.imdroid.secapi.dto.*; import com.imdroid.sideslope.message.D3F0SelfCheckMessage; import com.imdroid.sideslope.sal.DeviceService; import com.imdroid.sideslope.sal.Device; import com.imdroid.sideslope.service.DataPersistService; import com.imdroid.common.util.ThreadManager; +import com.imdroid.sideslope.web.ApiController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -37,7 +37,7 @@ public class D3F0SelfCheckMessageExecutor implements Executor getMessageType() { return D3F0SelfCheckMessage.class; } private void checkAndSendF9PPowerOffCommand(Device device){ - LocalDateTime now = LocalDateTime.now(); - // 针对 2419 编号开头的测站设备,检查其 F9P 运行的时间,每隔48小时需要使其断电 - // 断电时间记录保存于缓存之中,不必查询数据库 - // 平台重启会清除缓存,所以每次重启后收到该设备的第一条D3F0自检消息后,让其 F9P 断电,以保证F9P断电时间小于等于 48 小时 - if(device.getDeviceId().startsWith("2419") && device.getDeviceType() == 0){ - // 缓存中若没有 F9P 最近一次断电时间的记录,则立即发送F9P断电指令 - if(device.getLastF9PPowerOffTime() == null){ + if(device.getDeviceId().startsWith("2419") && device.getDeviceType() == Device.DEVICE_ROVER){ + // 连续6个周期无解,则立即发送F9P断电指令 + if(device.getNoFixedAndFloatResult() >= 6){ sendF9PPowerOffCommand(device); - // 初始化 F9P 断电时间 - device.setLastF9PPowerOffTime(now); - logger.debug("设备" + device.getDeviceId() + ": F9P 最近一次断电时间初始化为 " + device.getLastF9PPowerOffTime()); - } - // 检查 F9P 最近一次断电时间是否超过 48 小时 ,若是,则发送断电指令 - else if(device.getLastF9PPowerOffTime().isBefore(now.minusHours(24))){ - logger.debug("设备 "+device.getDeviceId()+" 的 F9P 距离上一次断电已超过48小时,发送F9P断电指令"); - sendF9PPowerOffCommand(device); - // 更新F9P断电时间,用于下一个48小时周期后的判断 - device.setLastF9PPowerOffTime(now); - }else{ - logger.debug("设备 "+device.getDeviceId()+" 的 F9P 距离上一次断电时间为:"+device.getLastF9PPowerOffTime()); + logger.debug("{}: 连续{}次无固定解和浮点解,重启F9P",device.getDeviceId(), device.getNoFixedAndFloatResult()); + device.clearNoResultStat(); } } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/MessageParser.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/MessageParser.java index e121c8ab..f5a24581 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/MessageParser.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/MessageParser.java @@ -37,6 +37,7 @@ public class MessageParser { types.put((short)0xd31B, D31xConfigAckMessage.class);//LORA配置应答 types.put((short)0xd320, D31xConfigAckMessage.class);//v3.2 DTU配置应答 types.put((short)0xd350, D350TestMessage.class);//ACC上报 + types.put((short)0xd314, D314PingMessage.class);//ping } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D314PingMessage.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D314PingMessage.java new file mode 100644 index 00000000..58ac7647 --- /dev/null +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/message/D314PingMessage.java @@ -0,0 +1,27 @@ +package com.imdroid.sideslope.message; + +import io.netty.buffer.ByteBuf; + +/** + * @author Layton + * @date 2023/2/2 20:47 + */ +public class D314PingMessage extends BaseMessage { + + @Override + public void decodeBody(ByteBuf src) { + //srcData需要完整的消息,所以解析头用get方法 + this.header = src.getUnsignedShort(0); // flag + this.len = src.getUnsignedShort(2); // length:11bit + this.seq = 0; + this.id = String.valueOf(src.getUnsignedInt(4)); //id + + this.srcData = new byte[src.readableBytes()]; + src.readBytes(this.srcData); + } + + @Override + public boolean shouldDecodeHeader() { + return false; + } +} diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java index 51b1ec51..54cb916b 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java @@ -61,7 +61,7 @@ public class Device { LocalDateTime lastRxTime; LocalDateTime lastD3f0f2Time; - LocalDateTime lastF9PPowerOffTime; + short noFixedAndFloatResult=0; int lastRxHead = 0; @@ -108,6 +108,9 @@ public class Device { } public void clearStat(){ + if(fixedNum+floatNum == 0) noFixedAndFloatResult++; + else noFixedAndFloatResult = 0; + d3xxCount = 0; d3xxbytes = 0; d341Count = 0; @@ -123,4 +126,9 @@ public class Device { d342Bytes = 0; d341In42Count = 0; } + + public void clearNoResultStat(){ + noFixedAndFloatResult = 0; + } + } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java b/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java index 6d2b59f1..12b90962 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/task/DeviceStatusChecker.java @@ -112,7 +112,7 @@ public class DeviceStatusChecker { LocalDateTime now = LocalDateTime.now(); LocalDateTime beginTime = now.minusHours(warningCfg.getValue()); QueryWrapper calcDataQueryWrapper = new QueryWrapper<>(); - calcDataQueryWrapper.ge("createtime",beginTime.format(formatter)); + calcDataQueryWrapper.ge("createtime",beginTime); List calcDataList = dataMapper.selectList(calcDataQueryWrapper); MPJQueryWrapper queryWrapper =