diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java new file mode 100644 index 0000000..95e8368 --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class EnvironmentDTO { + /** + * 台风中心经度 + */ + private Double typhoonLng; + + /** + * 台风中心纬度 + */ + private Double typhoonLat; + + /** + * 台风风力 + */ + private Integer typhoonPower; + + /** + * 台风半径 + */ + private Double typhoonRadius; + + /** + * 机器人与台风中心距离 + */ + private Double distance; + + /** + * 机器人与台风的方位角 + */ + private Double azimuth; + + /** + * 洋流数据 + */ + private OceanDetailDTO oceanDetail; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java new file mode 100644 index 0000000..95e8368 --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class EnvironmentDTO { + /** + * 台风中心经度 + */ + private Double typhoonLng; + + /** + * 台风中心纬度 + */ + private Double typhoonLat; + + /** + * 台风风力 + */ + private Integer typhoonPower; + + /** + * 台风半径 + */ + private Double typhoonRadius; + + /** + * 机器人与台风中心距离 + */ + private Double distance; + + /** + * 机器人与台风的方位角 + */ + private Double azimuth; + + /** + * 洋流数据 + */ + private OceanDetailDTO oceanDetail; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java index b54618b..a63c74c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -31,11 +31,31 @@ private Double swellHeight; /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; + + /** * 海流速度, 单位: m/s */ private Double speed; @@ -73,6 +93,11 @@ private Double swellDir; /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; @@ -81,6 +106,11 @@ * 风浪方向, 单位: 度[0,360] */ private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; } public OceanDetailDTO(OceanDetailRemoteData remoteData) { @@ -92,7 +122,11 @@ this.altitude = formatData(0.00); this.pressure = formatData(ytxBean.getSurfPres()); this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.swellDir = formatData(ytxBean.getSwellDir()); + this.swellPrd = formatData(ytxBean.getSwellPrd()); this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.waveDir = formatData(ytxBean.getWaveDir()); + this.wavePrd = formatData(ytxBean.getWavePrd()); this.speed = formatData(ytxBean.getWindMag()); this.oceanDir = formatData(ytxBean.getCurrentDir()); this.windSpeed = formatData(ytxBean.getWindMag()); @@ -102,8 +136,10 @@ if (meteoBean != null) { bean.swellHeight = formatData(meteoBean.getSwellHgt()); bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.swellPrd = formatData(meteoBean.getSwellPrd()); bean.waveHeight = formatData(meteoBean.getWaveHgt()); bean.waveDir = formatData(meteoBean.getWaveDir()); + bean.wavePrd = formatData(meteoBean.getWavePrd()); } this.forecast = bean; } diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java new file mode 100644 index 0000000..95e8368 --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class EnvironmentDTO { + /** + * 台风中心经度 + */ + private Double typhoonLng; + + /** + * 台风中心纬度 + */ + private Double typhoonLat; + + /** + * 台风风力 + */ + private Integer typhoonPower; + + /** + * 台风半径 + */ + private Double typhoonRadius; + + /** + * 机器人与台风中心距离 + */ + private Double distance; + + /** + * 机器人与台风的方位角 + */ + private Double azimuth; + + /** + * 洋流数据 + */ + private OceanDetailDTO oceanDetail; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java index b54618b..a63c74c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -31,11 +31,31 @@ private Double swellHeight; /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; + + /** * 海流速度, 单位: m/s */ private Double speed; @@ -73,6 +93,11 @@ private Double swellDir; /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; @@ -81,6 +106,11 @@ * 风浪方向, 单位: 度[0,360] */ private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; } public OceanDetailDTO(OceanDetailRemoteData remoteData) { @@ -92,7 +122,11 @@ this.altitude = formatData(0.00); this.pressure = formatData(ytxBean.getSurfPres()); this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.swellDir = formatData(ytxBean.getSwellDir()); + this.swellPrd = formatData(ytxBean.getSwellPrd()); this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.waveDir = formatData(ytxBean.getWaveDir()); + this.wavePrd = formatData(ytxBean.getWavePrd()); this.speed = formatData(ytxBean.getWindMag()); this.oceanDir = formatData(ytxBean.getCurrentDir()); this.windSpeed = formatData(ytxBean.getWindMag()); @@ -102,8 +136,10 @@ if (meteoBean != null) { bean.swellHeight = formatData(meteoBean.getSwellHgt()); bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.swellPrd = formatData(meteoBean.getSwellPrd()); bean.waveHeight = formatData(meteoBean.getWaveHgt()); bean.waveDir = formatData(meteoBean.getWaveDir()); + bean.wavePrd = formatData(meteoBean.getWavePrd()); } this.forecast = bean; } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java index eeba903..0b4ac1b 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java @@ -1,12 +1,9 @@ package com.casic.missiles.modular.system.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.modular.system.constants.ShipConstant; import com.casic.missiles.modular.system.constants.TyphoonConstant; import com.casic.missiles.modular.system.dao.TyphoonMapper; import com.casic.missiles.modular.system.dto.*; @@ -19,7 +16,6 @@ import com.casic.missiles.modular.system.service.ITyphoonPointService; import com.casic.missiles.modular.system.service.ITyphoonService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; -import okhttp3.Request; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,7 +52,7 @@ * 获取台风接口数据 * */ String res = HttpRequestHelper.doGet(TyphoonConstant.TYPHOON_LIST + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); //先清空之前的台风表,再保存最新的台风 @@ -96,7 +92,7 @@ String res = HttpRequestHelper.doGet( TyphoonConstant.TYPHOON_DETAIL.replace("ID", typhoon.getTyphoonId()) + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonDetailRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); TyphoonDetailRemoteData.ShowapiResBodyBean.ObjBean objBean = remoteData.getShowapi_res_body().getObj(); @@ -183,78 +179,16 @@ @Override public OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour) { - /** - * 获取洋流数据Token - * */ - JSONObject object = new JSONObject(); - try { - object.put("appId", ShipConstant.OCEAN_APPID); - object.put("appKey", ShipConstant.OCEAN_APP_KEY); - } catch (JSONException e) { - e.printStackTrace(); - } - Request tokenRequest = new Request.Builder() - .url(ShipConstant.OCEAN_TOKEN) - .post(HttpRequestHelper.createRequestBody(object.toJSONString())) - .build(); - String tokenJson = HttpRequestHelper.doPost(tokenRequest); - if ("".equals(tokenJson)) { - return null; - } - /** - * 解析token - * */ - JSONObject tokenObject = JSON.parseObject(tokenJson); - JSONObject dataObject = tokenObject.getJSONObject("data"); - String token = dataObject.getString("token"); - /** - * 封装请求参数 - * */ - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("lon", lng); - jsonObject.put("lat", lat); - jsonObject.put("date", date); - jsonObject.put("hour", days); - jsonObject.put("days", hour); - } catch (JSONException e) { - e.printStackTrace(); - } - /** - * 获取洋流数据 - * */ - Request request = new Request.Builder() - .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) - .url(ShipConstant.OCEAN_DETAIL) - .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) - .build(); - String oceanData = HttpRequestHelper.doPost(request); + String oceanData = HttpRequestHelper.obtainOceanData(lng, lat, date, days, hour); /** * 解析洋流数据返回给前端 * */ OceanDetailDTO oceanDetailDTO = null; - if (SUCCESS_CODE.equals(getOceanCode(oceanData))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getOceanCode(oceanData))) { OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { }); oceanDetailDTO = new OceanDetailDTO(remoteData); } return oceanDetailDTO; } - - public String getAisCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - return jsonObject.getString("showapi_res_code"); - } - - public String getOceanCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - Integer code = jsonObject.getInteger("code"); - return String.valueOf(code); - } } diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java new file mode 100644 index 0000000..95e8368 --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class EnvironmentDTO { + /** + * 台风中心经度 + */ + private Double typhoonLng; + + /** + * 台风中心纬度 + */ + private Double typhoonLat; + + /** + * 台风风力 + */ + private Integer typhoonPower; + + /** + * 台风半径 + */ + private Double typhoonRadius; + + /** + * 机器人与台风中心距离 + */ + private Double distance; + + /** + * 机器人与台风的方位角 + */ + private Double azimuth; + + /** + * 洋流数据 + */ + private OceanDetailDTO oceanDetail; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java index b54618b..a63c74c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -31,11 +31,31 @@ private Double swellHeight; /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; + + /** * 海流速度, 单位: m/s */ private Double speed; @@ -73,6 +93,11 @@ private Double swellDir; /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; @@ -81,6 +106,11 @@ * 风浪方向, 单位: 度[0,360] */ private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; } public OceanDetailDTO(OceanDetailRemoteData remoteData) { @@ -92,7 +122,11 @@ this.altitude = formatData(0.00); this.pressure = formatData(ytxBean.getSurfPres()); this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.swellDir = formatData(ytxBean.getSwellDir()); + this.swellPrd = formatData(ytxBean.getSwellPrd()); this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.waveDir = formatData(ytxBean.getWaveDir()); + this.wavePrd = formatData(ytxBean.getWavePrd()); this.speed = formatData(ytxBean.getWindMag()); this.oceanDir = formatData(ytxBean.getCurrentDir()); this.windSpeed = formatData(ytxBean.getWindMag()); @@ -102,8 +136,10 @@ if (meteoBean != null) { bean.swellHeight = formatData(meteoBean.getSwellHgt()); bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.swellPrd = formatData(meteoBean.getSwellPrd()); bean.waveHeight = formatData(meteoBean.getWaveHgt()); bean.waveDir = formatData(meteoBean.getWaveDir()); + bean.wavePrd = formatData(meteoBean.getWavePrd()); } this.forecast = bean; } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java index eeba903..0b4ac1b 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java @@ -1,12 +1,9 @@ package com.casic.missiles.modular.system.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.modular.system.constants.ShipConstant; import com.casic.missiles.modular.system.constants.TyphoonConstant; import com.casic.missiles.modular.system.dao.TyphoonMapper; import com.casic.missiles.modular.system.dto.*; @@ -19,7 +16,6 @@ import com.casic.missiles.modular.system.service.ITyphoonPointService; import com.casic.missiles.modular.system.service.ITyphoonService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; -import okhttp3.Request; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,7 +52,7 @@ * 获取台风接口数据 * */ String res = HttpRequestHelper.doGet(TyphoonConstant.TYPHOON_LIST + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); //先清空之前的台风表,再保存最新的台风 @@ -96,7 +92,7 @@ String res = HttpRequestHelper.doGet( TyphoonConstant.TYPHOON_DETAIL.replace("ID", typhoon.getTyphoonId()) + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonDetailRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); TyphoonDetailRemoteData.ShowapiResBodyBean.ObjBean objBean = remoteData.getShowapi_res_body().getObj(); @@ -183,78 +179,16 @@ @Override public OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour) { - /** - * 获取洋流数据Token - * */ - JSONObject object = new JSONObject(); - try { - object.put("appId", ShipConstant.OCEAN_APPID); - object.put("appKey", ShipConstant.OCEAN_APP_KEY); - } catch (JSONException e) { - e.printStackTrace(); - } - Request tokenRequest = new Request.Builder() - .url(ShipConstant.OCEAN_TOKEN) - .post(HttpRequestHelper.createRequestBody(object.toJSONString())) - .build(); - String tokenJson = HttpRequestHelper.doPost(tokenRequest); - if ("".equals(tokenJson)) { - return null; - } - /** - * 解析token - * */ - JSONObject tokenObject = JSON.parseObject(tokenJson); - JSONObject dataObject = tokenObject.getJSONObject("data"); - String token = dataObject.getString("token"); - /** - * 封装请求参数 - * */ - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("lon", lng); - jsonObject.put("lat", lat); - jsonObject.put("date", date); - jsonObject.put("hour", days); - jsonObject.put("days", hour); - } catch (JSONException e) { - e.printStackTrace(); - } - /** - * 获取洋流数据 - * */ - Request request = new Request.Builder() - .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) - .url(ShipConstant.OCEAN_DETAIL) - .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) - .build(); - String oceanData = HttpRequestHelper.doPost(request); + String oceanData = HttpRequestHelper.obtainOceanData(lng, lat, date, days, hour); /** * 解析洋流数据返回给前端 * */ OceanDetailDTO oceanDetailDTO = null; - if (SUCCESS_CODE.equals(getOceanCode(oceanData))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getOceanCode(oceanData))) { OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { }); oceanDetailDTO = new OceanDetailDTO(remoteData); } return oceanDetailDTO; } - - public String getAisCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - return jsonObject.getString("showapi_res_code"); - } - - public String getOceanCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - Integer code = jsonObject.getInteger("code"); - return String.valueOf(code); - } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java index 0c2c3e1..6ccc73c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java @@ -1,13 +1,19 @@ package com.casic.missiles.modular.system.utils; import com.alibaba.fastjson.JSON; -import com.casic.missiles.modular.system.constants.CheckCode; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.system.dto.AisDTO; +import com.casic.missiles.modular.system.dto.EnvironmentDTO; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; +import com.casic.missiles.modular.system.dto.OceanDetailRemoteData; import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RobotRegion; import org.locationtech.spatial4j.distance.DistanceUtils; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 西工大数据解析协议 @@ -98,13 +104,13 @@ /** * 区域覆盖 */ - public static RobotRegion decodeRobotRegion(int[] bytes) { - RobotRegion region = new RobotRegion(); + public static String decodeRobotRegion(int[] bytes) { if (!isCorrectData(bytes)) { - return region; + return ""; } + Map regionMap = new HashMap<>(); int count = bytes[4]; - region.setRobotCount(count); + regionMap.put("count", String.valueOf(count)); int[] idsBytes = new int[count]; System.arraycopy(bytes, 5, idsBytes, 0, count); @@ -116,26 +122,26 @@ builder.append(idsBytes[i]); } } - region.setRobotIds(builder.toString()); + regionMap.put("robotIds", builder.toString()); //经度和纬度,所以需要*2 int targetSize = count * 2 * 4; int[] targetBytes = new int[targetSize]; //起始4个字节,机器人个数1个字节 System.arraycopy(bytes, 5 + idsBytes.length, targetBytes, 0, targetSize); - region.setRobotTargets(formatLanLat(targetBytes)); + regionMap.put("robotTargets", formatLanLat(targetBytes)); - region.setPointCount(bytes[5 + idsBytes.length + targetBytes.length]); + regionMap.put("pointCount", String.valueOf(bytes[5 + idsBytes.length + targetBytes.length])); int[] radiusBytes = new int[2]; System.arraycopy(bytes, 5 + idsBytes.length + targetBytes.length + 1, radiusBytes, 0, 2); - region.setRegionRadius(covertTargetDistance(radiusBytes)); + regionMap.put("regionRadius", covertTargetDistance(radiusBytes)); int aByte = bytes[5 + idsBytes.length + targetBytes.length + 1 + radiusBytes.length]; if (aByte == 0) { - region.setContour("轮廓标志位:多边形," + count + "个轮廓点"); + regionMap.put("contour", "轮廓标志位:多边形," + count + "个轮廓点"); } else { - region.setContour("轮廓标志位:圆形," + count + "个轮廓点"); + regionMap.put("contour", "轮廓标志位:圆形," + count + "个轮廓点"); } //经度和纬度,所以需要*2 @@ -144,8 +150,8 @@ System.arraycopy(bytes, 5 + idsBytes.length + targetBytes.length + 1 + radiusBytes.length + 1, pointBytes, 0, pointSize); - region.setRobotPoints(formatLanLat(pointBytes)); - return region; + regionMap.put("robotPoints", formatLanLat(pointBytes)); + return JSON.toJSONString(regionMap); } /** @@ -470,296 +476,96 @@ return 180 * per; } - /*****数据转换为16进制*********************************************/ - /** * 环境数据 */ - public static String encodeEnvironment(String data) { - //包含除校验位之前的所有数据 - List dataLinkedList = createDataHead("01"); + public static Map encodeEnvironment(String data) { + Map resultMap = createDataHead("AIS"); + resultMap.put("type", "Env"); - /** - * 组合帧数据 - * */ + EnvironmentDTO dto = new EnvironmentDTO(); //台风中心经度 double lng = 109.322222; - int[] lngBytes = lnglatToHex(lng); - for (int lngByte : lngBytes) { - dataLinkedList.add(hex(lngByte)); - } + dto.setTyphoonLng(lng); //台风中心纬度 double lat = 17.392232; - int[] latBytes = lnglatToHex(lat); - for (int latByte : latBytes) { - dataLinkedList.add(hex(latByte)); - } + dto.setTyphoonLat(lat); //台风风力 int power = 14; - dataLinkedList.add(hex(power)); + dto.setTyphoonPower(power); //台风半径 double radius = 155.56; - int[] radiusBytes = radiusToHex(radius); - for (int radiusByte : radiusBytes) { - dataLinkedList.add(hex(radiusByte)); - } + dto.setTyphoonRadius(radius); //机器人与台风中心距离 double distance = distance(115.6314213, 12.9691386, 112.0623457, 19.9936680); - int[] distanceBytes = radiusToHex(distance); - for (int distanceByte : distanceBytes) { - dataLinkedList.add(hex(distanceByte)); - } + dto.setDistance(distance); //机器人与台风的方位角 double angle = azimuth(115.6314213, 12.9691386, 112.0623457, 19.9936680); - int[] angleBytes = angleToHex(angle); - for (int angleByte : angleBytes) { - dataLinkedList.add(hex(angleByte)); + dto.setAzimuth(angle); + + //洋流数据 + String oceanData = HttpRequestHelper.obtainOceanData(115.6314213, 12.9691386, "2021-10-22", "0", "10"); + OceanDetailDTO oceanDetailDTO = null; + if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) { + OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { + }); + oceanDetailDTO = new OceanDetailDTO(remoteData); } + dto.setOceanDetail(oceanDetailDTO); - //洋流大小 - double oceanValue = 1.85; - dataLinkedList.add(hex((int) (oceanValue * 100))); - - //洋流方向 - double oceanAngle = 170.85; - int[] oceanAngleBytes = angleToHex(oceanAngle); - for (int oceanAngleByte : oceanAngleBytes) { - dataLinkedList.add(hex(oceanAngleByte)); - } - - //风向 - double windDirection = 170.85; - int[] windDirectionBytes = angleToHex(windDirection); - for (int windDirectionByte : windDirectionBytes) { - dataLinkedList.add(hex(windDirectionByte)); - } - - //风速 - double windSpeed = 170.85; - int[] windSpeedBytes = radiusToHex(windSpeed); - for (int windSpeedByte : windSpeedBytes) { - dataLinkedList.add(hex(windSpeedByte)); - } - - //浪高 - double waveHigh = 12.5; - dataLinkedList.add(hex((int) (waveHigh * 10))); - - //温度,TODO 可能需要调整 - double temperature = 5.5; - dataLinkedList.add(hex((int) (temperature * 10))); - - //水深 - double depth = 2125.8; - int[] depthBytes = depthToHex(depth); - for (int depthByte : depthBytes) { - dataLinkedList.add(hex(depthByte)); - } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + resultMap.put("data", dto); + return resultMap; } /** * AIS数据 */ - public static String encodeAIS(String data) { - List dataLinkedList = createDataHead("02"); - + public static Map encodeAIS(String data) { + Map resultMap = createDataHead("AIS"); + resultMap.put("type", "AIS"); //船只数量 int shipCount = 2; - dataLinkedList.add(hex(shipCount)); - + List positionBeans = new ArrayList<>(); for (int i = 0; i < shipCount; i++) { + AisDTO ais = new AisDTO(); + ais.setCourse(187.2); + ais.setHeading(189.0); //船只经度 double lng = 109.322222; - int[] lngBytes = lnglatToHex(lng); - for (int lngByte : lngBytes) { - dataLinkedList.add(hex(lngByte)); - } - + ais.setLng(lng); //船只纬度 double lat = 17.392232; - int[] latBytes = lnglatToHex(lat); - for (int latByte : latBytes) { - dataLinkedList.add(hex(latByte)); - } + ais.setLat(lat); + ais.setPositionTime("2021-09-29 16:12:25"); + ais.setSpeed(16.3); + + positionBeans.add(ais); } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + resultMap.put("data", positionBeans); + return resultMap; } /** * 短信数据 */ - public static String encodeSMS(String data) { - List dataLinkedList = createDataHead("03"); - - //短信内容 - byte[] msgBytes = data.getBytes(); - for (byte msgByte : msgBytes) { - dataLinkedList.add(hex(msgByte)); - } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + public static Map encodeSMS(String data) { + Map resultMap = createDataHead("SMS"); + resultMap.put("data", data); + return resultMap; } - /** - * 创建帧数据头 - */ - private static List createDataHead(String type) { - List head = new LinkedList<>(); - head.add("2B"); - //先设定数据长度为256 - head.add("FF"); - head.add(type); - //TODO 可能是缺省项 - head.add("00"); - //机器人ID固定是0x00 - head.add("00"); - return head; - } - - /** - * 格式化帧数据为String - */ - private static String formatData(List value) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < value.size(); i++) { - if (i != value.size() - 1) { - builder.append(value.get(i)).append(" "); - } else { - builder.append(value.get(i)); - } - } - return builder.toString(); - } - - /** - * 计算CRC16校验码 - */ - private static int CRC16(List value) { - int crcHigh = 0xFF; - int crcLow = 0xFF; - int uIndex; - for (String s : value) { - uIndex = (crcLow ^ Integer.parseInt(s, 16)); - crcLow = crcHigh ^ CheckCode.CRC_HIGH[uIndex]; - crcHigh = CheckCode.CRC_LOW[uIndex]; - } - return (crcHigh << 8 | crcLow); - } - - /** - * 首位补零并转换为大写 - */ - private static String hex(int value) { - String hexString; - if (value <= 15) { - hexString = "0" + Integer.toHexString(value); - } else { - hexString = Integer.toHexString(value); - } - return hexString.toUpperCase(Locale.ROOT); - } - - /** - * CRC编码值转16进制数组 - */ - private static int[] crc16ToHex(int value) { - int[] tempBytes = new int[2]; - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 深度转16进制数组 - */ - private static int[] depthToHex(double depth) { - int[] tempBytes = new int[2]; - int value = (int) (depth * 10); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 角度转16进制数组 - */ - private static int[] angleToHex(double angle) { - int[] tempBytes = new int[2]; - int value = (int) (angle * 100); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 距离半径转16进制数组 - */ - private static int[] radiusToHex(double radius) { - int[] tempBytes = new int[2]; - int value = (int) (radius * 100); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 经纬度转16进制数组 - */ - private static int[] lnglatToHex(double lnglat) { - int per = (int) (lnglat / 180.0 * (Math.pow(2, 31) - 1)); - int[] tempBytes = new int[4]; - tempBytes[0] = (per >> 24) & 0xFF; - tempBytes[1] = (per >> 16) & 0xFF; - tempBytes[2] = (per >> 8) & 0xFF; - tempBytes[3] = (per) & 0xFF; - return tempBytes; + private static Map createDataHead(String type) { + Map resultMap = new HashMap<>(8); + resultMap.put("code", 200); + resultMap.put("type", type); + resultMap.put("message", "请求成功"); + resultMap.put("success", true); + return resultMap; } /** diff --git a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java deleted file mode 100644 index f4e7bf0..0000000 --- a/casic-ship/src/main/java/com/casic/missiles/Job/TyphoonQuartzJob.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.casic.missiles.Job; - -import com.casic.missiles.modular.system.service.ITyphoonService; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * @author lwh - * 台风数据定时任务,每小时执行一次 - * @ClassName TyphoonQuartzJob - * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling - */ -@Component -public class TyphoonQuartzJob { - - private final ITyphoonService typhoonService; - - public TyphoonQuartzJob(ITyphoonService typhoonService) { - this.typhoonService = typhoonService; - } - - @Scheduled(cron = "0 0 */1 * * ?") - public void execute() { - typhoonService.saveTyphoonList(); - typhoonService.updateTyphoonDetail(); - } -} diff --git a/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java new file mode 100644 index 0000000..aed13de --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/job/TyphoonQuartzJob.java @@ -0,0 +1,27 @@ +package com.casic.missiles.job; + +import com.casic.missiles.modular.system.service.ITyphoonService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author lwh + * 台风数据定时任务,每小时执行一次 + * @ClassName TyphoonQuartzJob + * @Description 依赖casic-job-quartz,并在CasicApplication上增加注解 @EnableScheduling + */ +@Component +public class TyphoonQuartzJob { + + private final ITyphoonService typhoonService; + + public TyphoonQuartzJob(ITyphoonService typhoonService) { + this.typhoonService = typhoonService; + } + + @Scheduled(cron = "0 0 */1 * * ?") + public void execute() { + typhoonService.saveTyphoonList(); + typhoonService.updateTyphoonDetail(); + } +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java new file mode 100644 index 0000000..ed88a2f --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class AisDTO { + private Double course; + private Double heading; + private Double lng; + private Double lat; + private String positionTime; + private Double speed; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java new file mode 100644 index 0000000..95e8368 --- /dev/null +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.dto; + +import lombok.Data; + +/** + * 给西工大的Json数据模型 + * + * @author a203 + */ +@Data +public class EnvironmentDTO { + /** + * 台风中心经度 + */ + private Double typhoonLng; + + /** + * 台风中心纬度 + */ + private Double typhoonLat; + + /** + * 台风风力 + */ + private Integer typhoonPower; + + /** + * 台风半径 + */ + private Double typhoonRadius; + + /** + * 机器人与台风中心距离 + */ + private Double distance; + + /** + * 机器人与台风的方位角 + */ + private Double azimuth; + + /** + * 洋流数据 + */ + private OceanDetailDTO oceanDetail; +} diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java index b54618b..a63c74c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/dto/OceanDetailDTO.java @@ -31,11 +31,31 @@ private Double swellHeight; /** + * 涌浪方向, 单位: 度[0,360] + */ + private Double swellDir; + + /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; /** + * 风浪方向, 单位: 度[0,360] + */ + private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; + + /** * 海流速度, 单位: m/s */ private Double speed; @@ -73,6 +93,11 @@ private Double swellDir; /** + * 涌浪周期, 单位: s(秒) + */ + private Double swellPrd; + + /** * 风浪高度, 单位: m(米) */ private Double waveHeight; @@ -81,6 +106,11 @@ * 风浪方向, 单位: 度[0,360] */ private Double waveDir; + + /** + * 风浪周期, 单位: s(秒) + */ + private Double wavePrd; } public OceanDetailDTO(OceanDetailRemoteData remoteData) { @@ -92,7 +122,11 @@ this.altitude = formatData(0.00); this.pressure = formatData(ytxBean.getSurfPres()); this.swellHeight = formatData(ytxBean.getSwellHgt()); + this.swellDir = formatData(ytxBean.getSwellDir()); + this.swellPrd = formatData(ytxBean.getSwellPrd()); this.waveHeight = formatData(ytxBean.getWaveHgt()); + this.waveDir = formatData(ytxBean.getWaveDir()); + this.wavePrd = formatData(ytxBean.getWavePrd()); this.speed = formatData(ytxBean.getWindMag()); this.oceanDir = formatData(ytxBean.getCurrentDir()); this.windSpeed = formatData(ytxBean.getWindMag()); @@ -102,8 +136,10 @@ if (meteoBean != null) { bean.swellHeight = formatData(meteoBean.getSwellHgt()); bean.swellDir = formatData(meteoBean.getSwellDir()); + bean.swellPrd = formatData(meteoBean.getSwellPrd()); bean.waveHeight = formatData(meteoBean.getWaveHgt()); bean.waveDir = formatData(meteoBean.getWaveDir()); + bean.wavePrd = formatData(meteoBean.getWavePrd()); } this.forecast = bean; } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java index eeba903..0b4ac1b 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/service/impl/TyphoonServiceImpl.java @@ -1,12 +1,9 @@ package com.casic.missiles.modular.system.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.casic.missiles.modular.system.constants.ShipConstant; import com.casic.missiles.modular.system.constants.TyphoonConstant; import com.casic.missiles.modular.system.dao.TyphoonMapper; import com.casic.missiles.modular.system.dto.*; @@ -19,7 +16,6 @@ import com.casic.missiles.modular.system.service.ITyphoonPointService; import com.casic.missiles.modular.system.service.ITyphoonService; import com.casic.missiles.modular.system.utils.HttpRequestHelper; -import okhttp3.Request; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -56,7 +52,7 @@ * 获取台风接口数据 * */ String res = HttpRequestHelper.doGet(TyphoonConstant.TYPHOON_LIST + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); //先清空之前的台风表,再保存最新的台风 @@ -96,7 +92,7 @@ String res = HttpRequestHelper.doGet( TyphoonConstant.TYPHOON_DETAIL.replace("ID", typhoon.getTyphoonId()) + System.currentTimeMillis()); - if (SUCCESS_CODE.equals(getAisCode(res))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getAisCode(res))) { TyphoonDetailRemoteData remoteData = JSON.parseObject(res, new TypeReference() { }); TyphoonDetailRemoteData.ShowapiResBodyBean.ObjBean objBean = remoteData.getShowapi_res_body().getObj(); @@ -183,78 +179,16 @@ @Override public OceanDetailDTO oceanDetail(double lng, double lat, String date, String days, String hour) { - /** - * 获取洋流数据Token - * */ - JSONObject object = new JSONObject(); - try { - object.put("appId", ShipConstant.OCEAN_APPID); - object.put("appKey", ShipConstant.OCEAN_APP_KEY); - } catch (JSONException e) { - e.printStackTrace(); - } - Request tokenRequest = new Request.Builder() - .url(ShipConstant.OCEAN_TOKEN) - .post(HttpRequestHelper.createRequestBody(object.toJSONString())) - .build(); - String tokenJson = HttpRequestHelper.doPost(tokenRequest); - if ("".equals(tokenJson)) { - return null; - } - /** - * 解析token - * */ - JSONObject tokenObject = JSON.parseObject(tokenJson); - JSONObject dataObject = tokenObject.getJSONObject("data"); - String token = dataObject.getString("token"); - /** - * 封装请求参数 - * */ - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("lon", lng); - jsonObject.put("lat", lat); - jsonObject.put("date", date); - jsonObject.put("hour", days); - jsonObject.put("days", hour); - } catch (JSONException e) { - e.printStackTrace(); - } - /** - * 获取洋流数据 - * */ - Request request = new Request.Builder() - .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) - .url(ShipConstant.OCEAN_DETAIL) - .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) - .build(); - String oceanData = HttpRequestHelper.doPost(request); + String oceanData = HttpRequestHelper.obtainOceanData(lng, lat, date, days, hour); /** * 解析洋流数据返回给前端 * */ OceanDetailDTO oceanDetailDTO = null; - if (SUCCESS_CODE.equals(getOceanCode(oceanData))) { + if (SUCCESS_CODE.equals(HttpRequestHelper.getOceanCode(oceanData))) { OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { }); oceanDetailDTO = new OceanDetailDTO(remoteData); } return oceanDetailDTO; } - - public String getAisCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - return jsonObject.getString("showapi_res_code"); - } - - public String getOceanCode(String value) { - if ("".equals(value)) { - return value; - } - JSONObject jsonObject = JSON.parseObject(value); - Integer code = jsonObject.getInteger("code"); - return String.valueOf(code); - } } diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java index 0c2c3e1..6ccc73c 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/DataParser.java @@ -1,13 +1,19 @@ package com.casic.missiles.modular.system.utils; import com.alibaba.fastjson.JSON; -import com.casic.missiles.modular.system.constants.CheckCode; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.system.dto.AisDTO; +import com.casic.missiles.modular.system.dto.EnvironmentDTO; +import com.casic.missiles.modular.system.dto.OceanDetailDTO; +import com.casic.missiles.modular.system.dto.OceanDetailRemoteData; import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RobotRegion; import org.locationtech.spatial4j.distance.DistanceUtils; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 西工大数据解析协议 @@ -98,13 +104,13 @@ /** * 区域覆盖 */ - public static RobotRegion decodeRobotRegion(int[] bytes) { - RobotRegion region = new RobotRegion(); + public static String decodeRobotRegion(int[] bytes) { if (!isCorrectData(bytes)) { - return region; + return ""; } + Map regionMap = new HashMap<>(); int count = bytes[4]; - region.setRobotCount(count); + regionMap.put("count", String.valueOf(count)); int[] idsBytes = new int[count]; System.arraycopy(bytes, 5, idsBytes, 0, count); @@ -116,26 +122,26 @@ builder.append(idsBytes[i]); } } - region.setRobotIds(builder.toString()); + regionMap.put("robotIds", builder.toString()); //经度和纬度,所以需要*2 int targetSize = count * 2 * 4; int[] targetBytes = new int[targetSize]; //起始4个字节,机器人个数1个字节 System.arraycopy(bytes, 5 + idsBytes.length, targetBytes, 0, targetSize); - region.setRobotTargets(formatLanLat(targetBytes)); + regionMap.put("robotTargets", formatLanLat(targetBytes)); - region.setPointCount(bytes[5 + idsBytes.length + targetBytes.length]); + regionMap.put("pointCount", String.valueOf(bytes[5 + idsBytes.length + targetBytes.length])); int[] radiusBytes = new int[2]; System.arraycopy(bytes, 5 + idsBytes.length + targetBytes.length + 1, radiusBytes, 0, 2); - region.setRegionRadius(covertTargetDistance(radiusBytes)); + regionMap.put("regionRadius", covertTargetDistance(radiusBytes)); int aByte = bytes[5 + idsBytes.length + targetBytes.length + 1 + radiusBytes.length]; if (aByte == 0) { - region.setContour("轮廓标志位:多边形," + count + "个轮廓点"); + regionMap.put("contour", "轮廓标志位:多边形," + count + "个轮廓点"); } else { - region.setContour("轮廓标志位:圆形," + count + "个轮廓点"); + regionMap.put("contour", "轮廓标志位:圆形," + count + "个轮廓点"); } //经度和纬度,所以需要*2 @@ -144,8 +150,8 @@ System.arraycopy(bytes, 5 + idsBytes.length + targetBytes.length + 1 + radiusBytes.length + 1, pointBytes, 0, pointSize); - region.setRobotPoints(formatLanLat(pointBytes)); - return region; + regionMap.put("robotPoints", formatLanLat(pointBytes)); + return JSON.toJSONString(regionMap); } /** @@ -470,296 +476,96 @@ return 180 * per; } - /*****数据转换为16进制*********************************************/ - /** * 环境数据 */ - public static String encodeEnvironment(String data) { - //包含除校验位之前的所有数据 - List dataLinkedList = createDataHead("01"); + public static Map encodeEnvironment(String data) { + Map resultMap = createDataHead("AIS"); + resultMap.put("type", "Env"); - /** - * 组合帧数据 - * */ + EnvironmentDTO dto = new EnvironmentDTO(); //台风中心经度 double lng = 109.322222; - int[] lngBytes = lnglatToHex(lng); - for (int lngByte : lngBytes) { - dataLinkedList.add(hex(lngByte)); - } + dto.setTyphoonLng(lng); //台风中心纬度 double lat = 17.392232; - int[] latBytes = lnglatToHex(lat); - for (int latByte : latBytes) { - dataLinkedList.add(hex(latByte)); - } + dto.setTyphoonLat(lat); //台风风力 int power = 14; - dataLinkedList.add(hex(power)); + dto.setTyphoonPower(power); //台风半径 double radius = 155.56; - int[] radiusBytes = radiusToHex(radius); - for (int radiusByte : radiusBytes) { - dataLinkedList.add(hex(radiusByte)); - } + dto.setTyphoonRadius(radius); //机器人与台风中心距离 double distance = distance(115.6314213, 12.9691386, 112.0623457, 19.9936680); - int[] distanceBytes = radiusToHex(distance); - for (int distanceByte : distanceBytes) { - dataLinkedList.add(hex(distanceByte)); - } + dto.setDistance(distance); //机器人与台风的方位角 double angle = azimuth(115.6314213, 12.9691386, 112.0623457, 19.9936680); - int[] angleBytes = angleToHex(angle); - for (int angleByte : angleBytes) { - dataLinkedList.add(hex(angleByte)); + dto.setAzimuth(angle); + + //洋流数据 + String oceanData = HttpRequestHelper.obtainOceanData(115.6314213, 12.9691386, "2021-10-22", "0", "10"); + OceanDetailDTO oceanDetailDTO = null; + if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) { + OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { + }); + oceanDetailDTO = new OceanDetailDTO(remoteData); } + dto.setOceanDetail(oceanDetailDTO); - //洋流大小 - double oceanValue = 1.85; - dataLinkedList.add(hex((int) (oceanValue * 100))); - - //洋流方向 - double oceanAngle = 170.85; - int[] oceanAngleBytes = angleToHex(oceanAngle); - for (int oceanAngleByte : oceanAngleBytes) { - dataLinkedList.add(hex(oceanAngleByte)); - } - - //风向 - double windDirection = 170.85; - int[] windDirectionBytes = angleToHex(windDirection); - for (int windDirectionByte : windDirectionBytes) { - dataLinkedList.add(hex(windDirectionByte)); - } - - //风速 - double windSpeed = 170.85; - int[] windSpeedBytes = radiusToHex(windSpeed); - for (int windSpeedByte : windSpeedBytes) { - dataLinkedList.add(hex(windSpeedByte)); - } - - //浪高 - double waveHigh = 12.5; - dataLinkedList.add(hex((int) (waveHigh * 10))); - - //温度,TODO 可能需要调整 - double temperature = 5.5; - dataLinkedList.add(hex((int) (temperature * 10))); - - //水深 - double depth = 2125.8; - int[] depthBytes = depthToHex(depth); - for (int depthByte : depthBytes) { - dataLinkedList.add(hex(depthByte)); - } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + resultMap.put("data", dto); + return resultMap; } /** * AIS数据 */ - public static String encodeAIS(String data) { - List dataLinkedList = createDataHead("02"); - + public static Map encodeAIS(String data) { + Map resultMap = createDataHead("AIS"); + resultMap.put("type", "AIS"); //船只数量 int shipCount = 2; - dataLinkedList.add(hex(shipCount)); - + List positionBeans = new ArrayList<>(); for (int i = 0; i < shipCount; i++) { + AisDTO ais = new AisDTO(); + ais.setCourse(187.2); + ais.setHeading(189.0); //船只经度 double lng = 109.322222; - int[] lngBytes = lnglatToHex(lng); - for (int lngByte : lngBytes) { - dataLinkedList.add(hex(lngByte)); - } - + ais.setLng(lng); //船只纬度 double lat = 17.392232; - int[] latBytes = lnglatToHex(lat); - for (int latByte : latBytes) { - dataLinkedList.add(hex(latByte)); - } + ais.setLat(lat); + ais.setPositionTime("2021-09-29 16:12:25"); + ais.setSpeed(16.3); + + positionBeans.add(ais); } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + resultMap.put("data", positionBeans); + return resultMap; } /** * 短信数据 */ - public static String encodeSMS(String data) { - List dataLinkedList = createDataHead("03"); - - //短信内容 - byte[] msgBytes = data.getBytes(); - for (byte msgByte : msgBytes) { - dataLinkedList.add(hex(msgByte)); - } - - //重新设置数据长度,不包括CRC16数据长度但需要加上帧尾长度(1字节) - int length = dataLinkedList.size() + 1; - dataLinkedList.set(1, hex(length)); - - //计算CRC16校验码 - int crc = CRC16(dataLinkedList); - int[] crcBytes = crc16ToHex(crc); - for (int crcByte : crcBytes) { - dataLinkedList.add(hex(crcByte)); - } - - //帧尾 - dataLinkedList.add("0A"); - return formatData(dataLinkedList); + public static Map encodeSMS(String data) { + Map resultMap = createDataHead("SMS"); + resultMap.put("data", data); + return resultMap; } - /** - * 创建帧数据头 - */ - private static List createDataHead(String type) { - List head = new LinkedList<>(); - head.add("2B"); - //先设定数据长度为256 - head.add("FF"); - head.add(type); - //TODO 可能是缺省项 - head.add("00"); - //机器人ID固定是0x00 - head.add("00"); - return head; - } - - /** - * 格式化帧数据为String - */ - private static String formatData(List value) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < value.size(); i++) { - if (i != value.size() - 1) { - builder.append(value.get(i)).append(" "); - } else { - builder.append(value.get(i)); - } - } - return builder.toString(); - } - - /** - * 计算CRC16校验码 - */ - private static int CRC16(List value) { - int crcHigh = 0xFF; - int crcLow = 0xFF; - int uIndex; - for (String s : value) { - uIndex = (crcLow ^ Integer.parseInt(s, 16)); - crcLow = crcHigh ^ CheckCode.CRC_HIGH[uIndex]; - crcHigh = CheckCode.CRC_LOW[uIndex]; - } - return (crcHigh << 8 | crcLow); - } - - /** - * 首位补零并转换为大写 - */ - private static String hex(int value) { - String hexString; - if (value <= 15) { - hexString = "0" + Integer.toHexString(value); - } else { - hexString = Integer.toHexString(value); - } - return hexString.toUpperCase(Locale.ROOT); - } - - /** - * CRC编码值转16进制数组 - */ - private static int[] crc16ToHex(int value) { - int[] tempBytes = new int[2]; - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 深度转16进制数组 - */ - private static int[] depthToHex(double depth) { - int[] tempBytes = new int[2]; - int value = (int) (depth * 10); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 角度转16进制数组 - */ - private static int[] angleToHex(double angle) { - int[] tempBytes = new int[2]; - int value = (int) (angle * 100); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 距离半径转16进制数组 - */ - private static int[] radiusToHex(double radius) { - int[] tempBytes = new int[2]; - int value = (int) (radius * 100); - tempBytes[0] = value / 256; - tempBytes[1] = value % 256; - return tempBytes; - } - - /** - * 经纬度转16进制数组 - */ - private static int[] lnglatToHex(double lnglat) { - int per = (int) (lnglat / 180.0 * (Math.pow(2, 31) - 1)); - int[] tempBytes = new int[4]; - tempBytes[0] = (per >> 24) & 0xFF; - tempBytes[1] = (per >> 16) & 0xFF; - tempBytes[2] = (per >> 8) & 0xFF; - tempBytes[3] = (per) & 0xFF; - return tempBytes; + private static Map createDataHead(String type) { + Map resultMap = new HashMap<>(8); + resultMap.put("code", 200); + resultMap.put("type", type); + resultMap.put("message", "请求成功"); + resultMap.put("success", true); + return resultMap; } /** diff --git a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java index 26438b1..d6215bd 100644 --- a/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java +++ b/casic-ship/src/main/java/com/casic/missiles/modular/system/utils/HttpRequestHelper.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.utils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; import com.casic.missiles.modular.system.constants.ShipConstant; import lombok.NonNull; import okhttp3.*; @@ -44,4 +47,70 @@ } return ""; } + + public static String obtainOceanData(double lng, double lat, String date, String days, String hour) { + /** + * 获取洋流数据Token + * */ + JSONObject object = new JSONObject(); + try { + object.put("appId", ShipConstant.OCEAN_APPID); + object.put("appKey", ShipConstant.OCEAN_APP_KEY); + } catch (JSONException e) { + e.printStackTrace(); + } + Request tokenRequest = new Request.Builder() + .url(ShipConstant.OCEAN_TOKEN) + .post(HttpRequestHelper.createRequestBody(object.toJSONString())) + .build(); + String tokenJson = HttpRequestHelper.doPost(tokenRequest); + if ("".equals(tokenJson)) { + return null; + } + /** + * 解析token + * */ + JSONObject tokenObject = JSON.parseObject(tokenJson); + JSONObject dataObject = tokenObject.getJSONObject("data"); + String token = dataObject.getString("token"); + /** + * 封装请求参数 + * */ + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("lon", lng); + jsonObject.put("lat", lat); + jsonObject.put("date", date); + jsonObject.put("hour", days); + jsonObject.put("days", hour); + } catch (JSONException e) { + e.printStackTrace(); + } + /** + * 获取洋流数据 + * */ + Request request = new Request.Builder() + .addHeader(ShipConstant.OCEAN_HEADER_NAME, token) + .url(ShipConstant.OCEAN_DETAIL) + .post(HttpRequestHelper.createRequestBody(jsonObject.toJSONString())) + .build(); + return HttpRequestHelper.doPost(request); + } + + public static String getAisCode(String value) { + if ("".equals(value)) { + return value; + } + JSONObject jsonObject = JSON.parseObject(value); + return jsonObject.getString("showapi_res_code"); + } + + public static String getOceanCode(String value) { + if ("".equals(value)) { + return value; + } + JSONObject jsonObject = JSON.parseObject(value); + Integer code = jsonObject.getInteger("code"); + return String.valueOf(code); + } }