From e272988adab1b60022c6d7288632eaf4494823bd Mon Sep 17 00:00:00 2001 From: zms Date: Fri, 20 Jun 2025 19:41:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=87=E7=94=A8=E5=9F=BA?= =?UTF-8?q?=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/dto/GnssDevice.java | 2 + .../executor/D331RtcmMessageExecutor.java | 50 ++++++++++++++++--- .../com/imdroid/sideslope/service/Device.java | 2 + .../sideslope/service/DeviceService.java | 2 + .../service/LocalDeviceServiceImpl.java | 25 ++++++++++ .../templates/page/table/gnss_add_dev.html | 21 +++++++- 6 files changed, 94 insertions(+), 8 deletions(-) diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java index 044aa7b8..de71969c 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java @@ -81,6 +81,8 @@ public class GnssDevice { // 参数改变 private Integer change_flag = 0; + private String parentid1; + private String getBatteryConfigCmd(){ return "d3130006"+ HexUtil.Int2HexString(Integer.parseInt(deviceid))+ "55"+(has_battery?"01":"00"); 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 203922d9..10719e4c 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 @@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -60,11 +61,17 @@ public class D331RtcmMessageExecutor implements Executor // 推送基站数据 if(deviceBs.getOpMode() == GnssDevice.OP_MODE_USE) { byte[] forwardBytes = message.getSrcData(); - // 要求快速转发,因此用缓存,不要每次都查数据库 - List deviceList = deviceService.findByParentId(id); - //logger.debug("base station {} has {} rovers: ", message.getId(),deviceList.size()); + // 获取使用该基站(包括作为主基站和备选基站)的所有测站 + List primaryDevices = deviceService.findByParentId(id); + List backupDevices = deviceService.findByParentId1(id); + + // 合并两个列表 + List allDevices = new ArrayList<>(); + allDevices.addAll(primaryDevices); + allDevices.addAll(backupDevices); + DeviceChannel deviceChannel = null; - for (Device device : deviceList) { + for (Device device : allDevices) { if (device.getOpMode() != GnssDevice.OP_MODE_USE) continue; if (device.getFixedNum()>0 && device.getGnssSampleRate()>1 && (deviceBs.getD3xxCount()%device.getGnssSampleRate()) != 0) { @@ -72,6 +79,20 @@ public class D331RtcmMessageExecutor implements Executor continue; } String deviceId = device.getDeviceId(); + + // 检查该设备是否应该接收此基站的数据 + String primaryBaseId = device.getParentId(); + String backupBaseId = device.getParentId1(); + + // 如果当前基站是该设备的备选基站,需要检查主基站是否离线 + if (id.equals(backupBaseId)) { + Device primaryBase = deviceService.findByDeviceId(primaryBaseId); + // 如果主基站仍然在线,则跳过备选基站的数据 + if (primaryBase != null && isBaseStationOnline(primaryBase)) { + continue; + } + } + // 获取设备通道并发送数据 if(device.getDataChannelType() == Device.CHANNEL_TYPE_UDP) { deviceChannel = OnlineChannels.INSTANCE.getDataChannel(deviceId); @@ -96,6 +117,9 @@ public class D331RtcmMessageExecutor implements Executor ByteBuf buf = Unpooled.buffer(); buf.writeBytes(forwardBytes); deviceChannel.writeAndFlush(buf); + if(deviceChannel != null && deviceChannel.isOnline()) { + if (logger.isDebugEnabled()) { + logger.debug("forward d331 rtcm from {} to device {}", id, deviceId); } } else if (baseStationModel == 0) { //logger.info("Base station model is 0 for device: {}", deviceId); @@ -293,8 +317,20 @@ public class D331RtcmMessageExecutor implements Executor } } - @Override - public Class getMessageType() { - return D331RtcmMessage.class; + + /** + * 判断住基站是否在线 + * @param baseStation 基站 + * @return 是否在线 + */ + + private boolean isBaseStationOnline(Device baseStation){ + if(baseStation == null) return false; + + LocalDateTime now =LocalDateTime.now(); + return baseStation.getLastRxTime() !=null && + baseStation.getLastRxTime().isAfter(now.minusMinutes(30)); } + + } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/Device.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/Device.java index af1c692c..9eca7fc0 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/Device.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/Device.java @@ -90,6 +90,8 @@ public class Device { byte cfgChannelType = CHANNEL_TYPE_TCP; // 0:TCP;1:DUP byte dataChannelType = CHANNEL_TYPE_UDP; // 0:TCP;1:DUP + private String parentId1; + public void updateRx(int head, int bytes,int count){ lastRxHead = head; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DeviceService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DeviceService.java index 7d927672..077d8798 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DeviceService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/DeviceService.java @@ -11,4 +11,6 @@ public interface DeviceService { Device findByDeviceId(String deviceId); List findByParentId(String parentId); + + List findByParentId1(String parentId1); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/LocalDeviceServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/LocalDeviceServiceImpl.java index 21329cfc..c479c82a 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/LocalDeviceServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/LocalDeviceServiceImpl.java @@ -65,6 +65,19 @@ public class LocalDeviceServiceImpl implements DeviceService { } return deviceList; } + + public List getDeviceListFromDBByParentId1(String parentId1) { + QueryWrapper query = new QueryWrapper(); + query.eq("parentid1", parentId1); + List gnssDeviceList = gnssDeviceMapper.selectList(query); + List deviceList = new ArrayList<>(gnssDeviceList.size()); + for (GnssDevice gnssDevice : gnssDeviceList) { + Device device = findByDeviceId(gnssDevice.getDeviceid()); + if(device!=null) deviceList.add(device); + } + return deviceList; + } + @Override public Device findByDeviceId(String deviceId) { Device device = deviceCache.getIfPresent(deviceId); @@ -89,6 +102,18 @@ public class LocalDeviceServiceImpl implements DeviceService { return devices; } + @Override + public List findByParentId1(String parentId1) { + List devices = subDeviceCache.getIfPresent(parentId1); + if (devices == null) { + devices = getDeviceListFromDBByParentId1(parentId1); + if (devices != null) { + subDeviceCache.put(parentId1, devices); + } + } + return devices; + } + public void refresh(String deviceId, String oldParentId){ Device device = deviceCache.getIfPresent(deviceId); if (device != null) { diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html index ae0c6663..72912309 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html @@ -89,6 +89,12 @@ +
+ +
+ +
+
@@ -307,7 +313,20 @@ } } + function checkDeviceId(){ + var $ = layui.$; + var value = $("#deviceid").val(); + console.log(value); + if(value.startsWith("6") || value.startsWith("7")){ + $("#has_battery").val('1'); + $("#has_battery").attr('disabled',true); + } + else{ + $("#has_battery").attr('disabled',false); + } + layui.form.render(); + } - + \ No newline at end of file -- 2.39.5