From 256eaa351b58d15951ad8e2e32201ec2c3519f67 Mon Sep 17 00:00:00 2001 From: weidong Date: Tue, 23 Sep 2025 15:29:32 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E8=B4=B5=E5=B7=9E=E6=B5=8B=E8=AF=95=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beidou_fwd/task/GZYMqttTestForwarder.java | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMqttTestForwarder.java diff --git a/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMqttTestForwarder.java b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMqttTestForwarder.java new file mode 100644 index 00000000..e3180804 --- /dev/null +++ b/sec-beidou-fwd/src/main/java/com/imdroid/beidou_fwd/task/GZYMqttTestForwarder.java @@ -0,0 +1,155 @@ +package com.imdroid.beidou_fwd.task; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.imdroid.beidou_fwd.entity.GZYMQTTAngle; +import com.imdroid.beidou_fwd.entity.GZYMQTTData; +import com.imdroid.beidou_fwd.service.MQTTClient; +import com.imdroid.common.util.GsonUtil; +import com.imdroid.common.util.NumberUtils; +import com.imdroid.secapi.dto.GnssCalcData; +import com.imdroid.secapi.dto.GnssStatusMsg; +import com.imdroid.secapi.dto.GnssStatusMsgMapper; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.springframework.beans.factory.annotation.Autowired; +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.util.HashMap; +import java.util.List; + +@Component +@Configuration +@EnableScheduling +public class GZYMqttTestForwarder extends Forwarder { + static final String FORWARDER_NAME = "贵州交勘院MQTT"; + @Value("${gzymqtttest.server.brokerUrl}") + private String brokerUrl; + @Value("${gzymqtttest.server.username}") + private String username; + @Value("${gzymqtttest.server.password}") + private String password; + @Value("${gzymqtttest.server.clientid}") + private String clientid; + @Value("${gzymqtttest.server.topic}") + private String topic; + //@Value("${gzymqtt.server.enabled}") + private boolean enabled=true; + @Autowired + GnssStatusMsgMapper statusMsgMapper; + MQTTClient mqttClient; + + @PostConstruct + void registerMe() throws MqttException { + init(FORWARDER_NAME, "MQTT "+brokerUrl,2,FWD_DEVICE_ALIAS_NAME,30); + mqttClient = new MQTTClient(brokerUrl, username, password,clientid); + if(!enabled) return; + try{ + mqttClient.connect(); + } + catch (Exception e){ + logger.error("gzy mqtt connect failed: {}",e.toString()); + } + } + + /** + * 每半小时转发GNSS解算结果 + */ + //@Scheduled(cron = "0 0 0/1 * * ?") // 每小时执行一次 + @Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次 + private void forwardGnss() { + if(!enabled) return; + logger.debug("gzy mqtt test forwardGnss"); + if(mqttClient.isConnected()) { + forwardCurrentGnss(); + //forwardAngleData(); + } + else{ + try{ + mqttClient.connect(); + } + catch (Exception e){ + logger.error("gzy mqtt connect failed: {}",e.toString()); + } + } + } +/* + @Scheduled(cron = "0 0/5 * * * ?") // 每30分钟执行一次 + void forwardHistoryGnss() { + super.forwardHistoryGnss(); + }*/ + + @Override + int send(String projectId, List records, LocalDateTime sentTime) { + int sendNum = 0; + + for (GnssCalcData locationRecord : records) { + GZYMQTTData tranData = new GZYMQTTData(); + tranData.setCollectTime(locationRecord.getCreatetime().format(formatter)); + double n = NumberUtils.scale(locationRecord.getRposn(), 2); + double e = NumberUtils.scale(locationRecord.getRpose(), 2); + double d = NumberUtils.scale(locationRecord.getRposd(), 2); + tranData.setX(n); + tranData.setY(e); + tranData.setZ(d); + tranData.setDeviceType(2); + tranData.setDeviceSn(locationRecord.getDeviceid()); + String json = GsonUtil.toJson(tranData); + logger.debug("forward to GZY mqtt Test: {}",json); + try { + if(!mqttClient.publish(topic, json)) break; + Thread.sleep(50); + } catch (Exception e1) { + e1.printStackTrace(); + } + sendNum++; + } + + return sendNum; + } + + void forwardAngleData() { + // 获取最近半小时的状态消息 + LocalDateTime sentTime = LocalDateTime.now(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tenantid",tenantId); + queryWrapper.le("createtime",sentTime); + queryWrapper.ge("createtime",sentTime.minusMinutes(fwdCycleMinutes)); + queryWrapper.orderByDesc("createtime"); + HashMap sendDeviceMap = new HashMap<>(); + List statusMsgs = statusMsgMapper.selectList(queryWrapper); + int sendNum = 0; + for(GnssStatusMsg msg:statusMsgs){ + if(sendDeviceMap.get(msg.getDeviceid())!=null) continue; + sendDeviceMap.put(msg.getDeviceid(),msg.getDeviceid()); + + GZYMQTTAngle tranData = new GZYMQTTAngle(); + tranData.setDeviceSn(msg.getDeviceid()); + tranData.setCollectTime(msg.getCreatetime().format(formatter)); + float x = msg.getRoll()==null?0:msg.getRoll(); + float y = msg.getPitch()==null?0:msg.getPitch(); + float az = msg.getYaw()==null?0:msg.getYaw(); + tranData.setAngleX(NumberUtils.scale((double) x,2)); + tranData.setAngleY(NumberUtils.scale((double) y,2)); + tranData.setAngleAz(NumberUtils.scale((double) az,2)); + + String json = GsonUtil.toJson(tranData); + logger.debug("forward to GZY mqtt angles: {}",json); + try { + if(!mqttClient.publish(topic, json)) break; + Thread.sleep(10); + } catch (Exception e1) { + e1.printStackTrace(); + } + sendNum++; + } + logger.debug("total number of angles sent to GZY: {}",sendNum); + + } + +}