feat: rtksrv v1 test

This commit is contained in:
yarnom 2025-07-28 18:39:21 +08:00
parent 1ddfb78c41
commit 0698640b26
2 changed files with 71 additions and 0 deletions

View File

@ -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<D331RtcmMessage, Void>
private DataPersistService dataPersistService;
@Autowired
UdpNtripServer ntripServer;
@Autowired
RtcmUdpForwarder rtcmUdpForwarder;
// 添加一个成员变量用于追踪每个测站最后一次转发D300数据的时间
private final Map<String, Long> lastD300ForwardTimeMap = new ConcurrentHashMap<>();
@ -288,6 +291,9 @@ public class D331RtcmMessageExecutor implements Executor<D331RtcmMessage, Void>
//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());

View File

@ -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<String> hexRtcmList) {
logger.debug("Forwarding {} RTCM messages from mountpoint {}", hexRtcmList.size(), mount);
for (String hexRtcm : hexRtcmList) {
forward(mount, hexRtcm);
}
}
}