From 0698640b261b2ad6f465e086ab0fbff8f1331e70 Mon Sep 17 00:00:00 2001 From: yarnom Date: Mon, 28 Jul 2025 18:39:21 +0800 Subject: [PATCH] feat: rtksrv v1 test --- .../executor/D331RtcmMessageExecutor.java | 6 ++ .../sideslope/ntrip/RtcmUdpForwarder.java | 65 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/ntrip/RtcmUdpForwarder.java 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 3cd53ee5..cc9f8272 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 @@ -9,6 +9,7 @@ import com.imdroid.sideslope.bd.Gga; import com.imdroid.sideslope.bd.Rtcm1005; import com.imdroid.sideslope.message.D331RtcmMessage; import com.imdroid.sideslope.ntrip.UdpNtripServer; +import com.imdroid.sideslope.ntrip.RtcmUdpForwarder; import com.imdroid.sideslope.service.Device; import com.imdroid.sideslope.service.DeviceService; import com.imdroid.sideslope.server.DeviceChannel; @@ -45,6 +46,8 @@ public class D331RtcmMessageExecutor implements Executor private DataPersistService dataPersistService; @Autowired UdpNtripServer ntripServer; + @Autowired + RtcmUdpForwarder rtcmUdpForwarder; // 添加一个成员变量用于追踪每个测站最后一次转发D300数据的时间 private final Map lastD300ForwardTimeMap = new ConcurrentHashMap<>(); @@ -288,6 +291,9 @@ public class D331RtcmMessageExecutor implements Executor //System.out.println("挂载点: " + mountpoint); //System.out.println("RTCM数据: " + rtcm); ntripServer.send(mountpoint, rtcm); + + // 同时转发到12001端口 + rtcmUdpForwarder.forward(mountpoint, rtcm); }); } catch (Exception e) { logger.error("处理NTRIP数据失败, 挂载点: {}, 错误: {}", mountpoint, e.getMessage()); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/ntrip/RtcmUdpForwarder.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/ntrip/RtcmUdpForwarder.java new file mode 100644 index 00000000..831c86ff --- /dev/null +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/ntrip/RtcmUdpForwarder.java @@ -0,0 +1,65 @@ +package com.imdroid.sideslope.ntrip; + +import com.imdroid.common.util.ByteUtil; +import com.imdroid.common.util.ThreadManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.List; + +/** + * 将RTCM数据转发到指定UDP端口 + */ +@Service +public class RtcmUdpForwarder { + private final Logger logger = LoggerFactory.getLogger(RtcmUdpForwarder.class); + + @Value("${rtcm.forward.port:12001}") + private Integer forwardPort; + + private DatagramSocket socket; + private DatagramPacket outPacket; + + /** + * 转发RTCM数据到UDP端口 + * @param mount 挂载点名称 + * @param hexRtcm 差分信息16进制字符串 + */ + public void forward(String mount, String hexRtcm) { + ThreadManager.getSingleThreadPool(RtcmUdpForwarder.class.getName()).execute(() -> { + try { + if (socket == null) socket = new DatagramSocket(); + if (outPacket == null) outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName("localhost"), forwardPort); + + // 转发原始RTCM数据,不添加挂载点信息 + byte[] rtcmData = ByteUtil.hexStringTobyte(hexRtcm); + outPacket.setData(rtcmData); + socket.send(outPacket); + + logger.debug("Forwarded RTCM data from mountpoint {} to UDP port {}, data length: {}", + mount, forwardPort, rtcmData.length); + } catch (Exception e) { + socket = null; + outPacket = null; + logger.error("Failed to forward RTCM data: {}", e.getMessage()); + } + }); + } + + /** + * 转发多条RTCM数据到UDP端口 + * @param mount 挂载点名称 + * @param hexRtcmList 差分信息16进制字符串列表 + */ + public void forward(String mount, List hexRtcmList) { + logger.debug("Forwarding {} RTCM messages from mountpoint {}", hexRtcmList.size(), mount); + for (String hexRtcm : hexRtcmList) { + forward(mount, hexRtcm); + } + } +} \ No newline at end of file