From e1e3cf084e76bdde6c5159f198fefb4686478dce Mon Sep 17 00:00:00 2001 From: weidong Date: Tue, 4 Jun 2024 15:21:11 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E5=B9=BF=E8=A5=BF?= =?UTF-8?q?=E8=B7=AF=E5=BB=BA=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beidou_fwd/task/GXXfz2Forwarder.java | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfz2Forwarder.java diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfz2Forwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfz2Forwarder.java new file mode 100644 index 00000000..c8b413d6 --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GXXfz2Forwarder.java @@ -0,0 +1,127 @@ +package com.imdroid.beidou_fwd.task; + +import com.imdroid.beidou_fwd.entity.XFZData; +import com.imdroid.beidou_fwd.service.TCPClient; +import com.imdroid.beidou_fwd.service.TCPListener; +import com.imdroid.common.util.GsonUtil; +import com.imdroid.common.util.NumberUtils; +import com.imdroid.secapi.dto.GnssCalcData; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Component +@Configuration +@EnableScheduling +public class GXXfz2Forwarder extends Forwarder{ + static final String FORWARDER_NAME = "广西路建"; + @Value("${gxlj.server.host}") + private String host; + + @Value("${gxlj.server.port}") + private int port; + + private TCPClient xfzTcpClient; + + final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + static class XFZTCPListener implements TCPListener{ + public static final int STATE_NO_ACK = 0; + public static final int STATE_OK = 1; + public static final int STATE_FAILED = 2; + public int state = STATE_NO_ACK; + + public void clear(){ + state = STATE_NO_ACK; + } + @Override + public void onConnected() { + + } + + @Override + public void onDisconnect() { + + } + + @Override + public void onMessage(String msg) { + if(msg.contains("succeed")) state = STATE_OK; + else state = STATE_FAILED; + } + } + XFZTCPListener listener = new XFZTCPListener(); + @PostConstruct + void registerMe(){ + init(FORWARDER_NAME, "TCP "+host+":"+port,6,false,30); + xfzTcpClient = new TCPClient(); + xfzTcpClient.init(host, port,listener); + xfzTcpClient.start(); + } + + /** + * 每半小时转发GNSS解算结果 + */ + @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 + private void forwardGnss() { + logger.info("xfz forwardGnss"); + forwardCurrentGnss(); + } + @Override + int send(String projectId, List records, LocalDateTime sentTime){ + int sendNum = 0; + if(records.size() == 0) return 0; + + XFZData xfzTcpMessage = new XFZData(); + xfzTcpMessage.setProjectID(projectId); + xfzTcpMessage.setWorkPointID(projectId); + + List dataList = new ArrayList<>(records.size()); + xfzTcpMessage.setData(dataList); + + for(GnssCalcData locationRecord: records) { + XFZData.Data data = new XFZData.Data(); + dataList.add(data); + data.setDataTime(locationRecord.getCreatetime().format(dateFormatter)); + data.setDevNum(locationRecord.getDeviceid()); + data.setDevtype("GNSS"); + // 单位由mm转化为m + data.setX(NumberUtils.scale(locationRecord.getRpose() * 0.001, 5)); + data.setY(NumberUtils.scale(locationRecord.getRposn() * 0.001, 5)); + data.setZ(NumberUtils.scale(locationRecord.getRposd() * 0.001, 5)); + sendNum++; + } + String json = "#" + GsonUtil.toJson(xfzTcpMessage) + "!"; + logger.info("project " + projectId + ": push calculation result to XFZ"); + logger.info(json); + try { + listener.clear(); + xfzTcpClient.writeAndFlush(json); + //等待应答 + if(!checkResult()) sendNum = 0; + } catch (Exception e1) { + sendNum = 0; + e1.printStackTrace(); + } + return sendNum; + } + + boolean checkResult() throws InterruptedException { + // 等待应答,最多等1s + for(int i=0; i<10; i++){ + Thread.sleep(100); + if(listener.state == XFZTCPListener.STATE_OK) return true; + else if(listener.state == XFZTCPListener.STATE_FAILED) return false; + } + return false; + } + +}