diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java index ed88a2f..bd4f685 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -9,10 +9,10 @@ */ @Data public class AisDTO { - private Double course; - private Double heading; + private Float course; + private Integer heading; private Double lng; private Double lat; private String positionTime; - private Double speed; + private Float speed; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java index ed88a2f..bd4f685 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -9,10 +9,10 @@ */ @Data public class AisDTO { - private Double course; - private Double heading; + private Float course; + private Integer heading; private Double lng; private Double lat; private String positionTime; - private Double speed; + private Float speed; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java index 95e8368..94a1c86 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -25,9 +25,23 @@ private Integer typhoonPower; /** - * 台风半径 + * 台风7级风力半径 */ - private Double typhoonRadius; + private String radius7; + + /** + * 台风10级风力半径 + */ + private String radius10; + + /** + * 台风整体移动速度,单位【公里/小时】 + */ + private String moveSpeed; + /** + * 台风未来移动方向 + */ + private String moveDirection; /** * 机器人与台风中心距离 diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java index ed88a2f..bd4f685 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -9,10 +9,10 @@ */ @Data public class AisDTO { - private Double course; - private Double heading; + private Float course; + private Integer heading; private Double lng; private Double lat; private String positionTime; - private Double speed; + private Float speed; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java index 95e8368..94a1c86 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -25,9 +25,23 @@ private Integer typhoonPower; /** - * 台风半径 + * 台风7级风力半径 */ - private Double typhoonRadius; + private String radius7; + + /** + * 台风10级风力半径 + */ + private String radius10; + + /** + * 台风整体移动速度,单位【公里/小时】 + */ + private String moveSpeed; + /** + * 台风未来移动方向 + */ + private String moveDirection; /** * 机器人与台风中心距离 diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java index c06ee68..ba1a62e 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java @@ -295,30 +295,43 @@ /** * 环境数据请求-已校验 */ -// public static String decodeEnvRequest(byte[] bytes) { -// -// } + public static String decodeEnvRequest(byte[] bytes) { + Map envMap = new HashMap<>(4); + if (bytes[5] <= 0) { + envMap.put("hour", "0"); + } + if (bytes[5] >= 24) { + envMap.put("hour", "24"); + } + envMap.put("hour", String.valueOf(bytes[5])); + + byte[] lngBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); + envMap.put("lng", covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); + envMap.put("lat", covertLngLat(latBytes)); + + return JSON.toJSONString(envMap); + } /** * AIS数据请求-已校验 */ public static String decodeAISRequest(byte[] bytes) { - Map aisMap = new HashMap<>(2); - byte[] radiusBytes = new byte[2]; - System.arraycopy(bytes, 5, radiusBytes, 0, 2); - aisMap.put("radius", covertToDec(radiusBytes)); + Map aisMap = new HashMap<>(4); + aisMap.put("radius", bytes[5]); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length, lngBytes, 0, 4); + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); aisMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length, latBytes, 0, 4); + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); aisMap.put("lat", covertLngLat(latBytes)); - byte[] ageBytes = new byte[2]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length + latBytes.length, ageBytes, 0, 2); - aisMap.put("age", covertToDec(ageBytes)); + aisMap.put("age", bytes[5 + 1 + lngBytes.length + latBytes.length]); return JSON.toJSONString(aisMap); } @@ -345,22 +358,20 @@ /** * 生成经纬度对象点 + * 经度(4)、纬度(4) */ public static List formatLngLat(byte[] targetBytes) { - List lnglat = new ArrayList<>(); - for (int i = 0; i < targetBytes.length; i += 4) { - byte[] target = new byte[4]; - System.arraycopy(targetBytes, i, target, 0, 4); - //每4个字节转换一次经纬度 - lnglat.add(covertLngLat(target)); - } List pointList = new ArrayList<>(); - for (int i = 0; i < lnglat.size(); i += 2) { + for (int i = 0; i < targetBytes.length; i += 8) { PointDTO point = new PointDTO(); - for (int j = 0; j < 2; j++) { - point.setLng(lnglat.get(i)); - point.setLat(lnglat.get(i + 1)); - } + byte[] lngBytes = new byte[4]; + System.arraycopy(targetBytes, i, lngBytes, 0, 4); + point.setLng(covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(targetBytes, lngBytes.length, latBytes, 0, 4); + point.setLat(covertLngLat(latBytes)); + pointList.add(point); } return pointList; diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java index ed88a2f..bd4f685 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -9,10 +9,10 @@ */ @Data public class AisDTO { - private Double course; - private Double heading; + private Float course; + private Integer heading; private Double lng; private Double lat; private String positionTime; - private Double speed; + private Float speed; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java index 95e8368..94a1c86 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -25,9 +25,23 @@ private Integer typhoonPower; /** - * 台风半径 + * 台风7级风力半径 */ - private Double typhoonRadius; + private String radius7; + + /** + * 台风10级风力半径 + */ + private String radius10; + + /** + * 台风整体移动速度,单位【公里/小时】 + */ + private String moveSpeed; + /** + * 台风未来移动方向 + */ + private String moveDirection; /** * 机器人与台风中心距离 diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java index c06ee68..ba1a62e 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java @@ -295,30 +295,43 @@ /** * 环境数据请求-已校验 */ -// public static String decodeEnvRequest(byte[] bytes) { -// -// } + public static String decodeEnvRequest(byte[] bytes) { + Map envMap = new HashMap<>(4); + if (bytes[5] <= 0) { + envMap.put("hour", "0"); + } + if (bytes[5] >= 24) { + envMap.put("hour", "24"); + } + envMap.put("hour", String.valueOf(bytes[5])); + + byte[] lngBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); + envMap.put("lng", covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); + envMap.put("lat", covertLngLat(latBytes)); + + return JSON.toJSONString(envMap); + } /** * AIS数据请求-已校验 */ public static String decodeAISRequest(byte[] bytes) { - Map aisMap = new HashMap<>(2); - byte[] radiusBytes = new byte[2]; - System.arraycopy(bytes, 5, radiusBytes, 0, 2); - aisMap.put("radius", covertToDec(radiusBytes)); + Map aisMap = new HashMap<>(4); + aisMap.put("radius", bytes[5]); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length, lngBytes, 0, 4); + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); aisMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length, latBytes, 0, 4); + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); aisMap.put("lat", covertLngLat(latBytes)); - byte[] ageBytes = new byte[2]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length + latBytes.length, ageBytes, 0, 2); - aisMap.put("age", covertToDec(ageBytes)); + aisMap.put("age", bytes[5 + 1 + lngBytes.length + latBytes.length]); return JSON.toJSONString(aisMap); } @@ -345,22 +358,20 @@ /** * 生成经纬度对象点 + * 经度(4)、纬度(4) */ public static List formatLngLat(byte[] targetBytes) { - List lnglat = new ArrayList<>(); - for (int i = 0; i < targetBytes.length; i += 4) { - byte[] target = new byte[4]; - System.arraycopy(targetBytes, i, target, 0, 4); - //每4个字节转换一次经纬度 - lnglat.add(covertLngLat(target)); - } List pointList = new ArrayList<>(); - for (int i = 0; i < lnglat.size(); i += 2) { + for (int i = 0; i < targetBytes.length; i += 8) { PointDTO point = new PointDTO(); - for (int j = 0; j < 2; j++) { - point.setLng(lnglat.get(i)); - point.setLat(lnglat.get(i + 1)); - } + byte[] lngBytes = new byte[4]; + System.arraycopy(targetBytes, i, lngBytes, 0, 4); + point.setLng(covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(targetBytes, lngBytes.length, latBytes, 0, 4); + point.setLat(covertLngLat(latBytes)); + pointList.add(point); } return pointList; diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java index 8b95501..e61d80e 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java @@ -2,17 +2,13 @@ import com.alibaba.fastjson.JSON; 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.*; import com.casic.missiles.modular.system.dto.remote.OceanDetailRemoteData; import org.locationtech.spatial4j.distance.DistanceUtils; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; /** * 203所数据编码 @@ -26,40 +22,38 @@ private static final double EARTH_RADIUS = 6371.393; /** - * 环境数据 + * 环境数据-已校验 */ - public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) { + public static Map encodeEnvironment(int robotId, double robotLng, double robotLat, + TyphoonDTO typhoon, String date, String days, String hour) { Map resultMap = createDataHead("AIS"); resultMap.put("type", "Env"); resultMap.put("robotID", robotId); EnvironmentDTO dto = new EnvironmentDTO(); - //台风中心经度 - double lng = 109.322222; - dto.setTyphoonLng(lng); + if (typhoon != null) { + double lng = typhoon.getLng(); + double lat = typhoon.getLat(); - //台风中心纬度 - double lat = 17.392232; - dto.setTyphoonLat(lat); + dto.setTyphoonLng(lng); + dto.setTyphoonLat(lat); + dto.setTyphoonPower(typhoon.getPower()); + dto.setRadius7(typhoon.getRadius7()); + dto.setRadius10(typhoon.getRadius10()); + dto.setMoveSpeed(typhoon.getMoveSpeed()); + dto.setMoveDirection(typhoon.getMoveDirection()); - //台风风力 - int power = 14; - dto.setTyphoonPower(power); + //机器人与台风中心距离 + double distance = distance(lng, lat, robotLng, robotLat); + dto.setDistance(distance); - //台风半径 - double radius = 155.56; - dto.setTyphoonRadius(radius); - - //机器人与台风中心距离 - double distance = distance(115.6314213, 12.9691386, 112.0623457, 19.9936680); - dto.setDistance(distance); - - //机器人与台风的方位角 - double angle = azimuth(115.6314213, 12.9691386, 112.0623457, 19.9936680); - dto.setAzimuth(angle); + //机器人与台风的方位角 + double angle = azimuth(lng, lat, robotLng, robotLat); + dto.setAzimuth(angle); + } //洋流数据 - String oceanData = HttpRequestHelper.obtainOceanData(115.6314213, 12.9691386, date, days, hour); + String oceanData = HttpRequestHelper.obtainOceanData(robotLng, robotLat, date, days, hour); OceanDetailDTO oceanDetailDTO = null; if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) { OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { @@ -73,27 +67,26 @@ } /** - * AIS数据 + * AIS数据-已校验 */ - public static Map encodeAIS(int robotId, String data) { + public static Map encodeAIS(int robotId, List ships) { Map resultMap = createDataHead("AIS"); resultMap.put("type", "AIS"); resultMap.put("robotID", robotId); //船只数量 - int shipCount = 2; List positionBeans = new ArrayList<>(); - for (int i = 0; i < shipCount; i++) { + for (ShipDTO ship : ships) { AisDTO ais = new AisDTO(); - ais.setCourse(187.2); - ais.setHeading(189.0); + ais.setCourse(ship.getCourse()); + ais.setHeading(ship.getHeading()); //船只经度 - double lng = 109.322222; - ais.setLng(lng); + ais.setLng(ship.getLng()); //船只纬度 - double lat = 17.392232; - ais.setLat(lat); - ais.setPositionTime("2021-09-29 16:12:25"); - ais.setSpeed(16.3); + ais.setLat(ship.getLat()); + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); + ais.setPositionTime(dateFormat.format(new Date())); + ais.setSpeed(ship.getSpeed()); positionBeans.add(ais); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java index ed88a2f..bd4f685 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/AisDTO.java @@ -9,10 +9,10 @@ */ @Data public class AisDTO { - private Double course; - private Double heading; + private Float course; + private Integer heading; private Double lng; private Double lat; private String positionTime; - private Double speed; + private Float speed; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java index 95e8368..94a1c86 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/dto/EnvironmentDTO.java @@ -25,9 +25,23 @@ private Integer typhoonPower; /** - * 台风半径 + * 台风7级风力半径 */ - private Double typhoonRadius; + private String radius7; + + /** + * 台风10级风力半径 + */ + private String radius10; + + /** + * 台风整体移动速度,单位【公里/小时】 + */ + private String moveSpeed; + /** + * 台风未来移动方向 + */ + private String moveDirection; /** * 机器人与台风中心距离 diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java index c06ee68..ba1a62e 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/DecodeData.java @@ -295,30 +295,43 @@ /** * 环境数据请求-已校验 */ -// public static String decodeEnvRequest(byte[] bytes) { -// -// } + public static String decodeEnvRequest(byte[] bytes) { + Map envMap = new HashMap<>(4); + if (bytes[5] <= 0) { + envMap.put("hour", "0"); + } + if (bytes[5] >= 24) { + envMap.put("hour", "24"); + } + envMap.put("hour", String.valueOf(bytes[5])); + + byte[] lngBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); + envMap.put("lng", covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); + envMap.put("lat", covertLngLat(latBytes)); + + return JSON.toJSONString(envMap); + } /** * AIS数据请求-已校验 */ public static String decodeAISRequest(byte[] bytes) { - Map aisMap = new HashMap<>(2); - byte[] radiusBytes = new byte[2]; - System.arraycopy(bytes, 5, radiusBytes, 0, 2); - aisMap.put("radius", covertToDec(radiusBytes)); + Map aisMap = new HashMap<>(4); + aisMap.put("radius", bytes[5]); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length, lngBytes, 0, 4); + System.arraycopy(bytes, 5 + 1, lngBytes, 0, 4); aisMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length, latBytes, 0, 4); + System.arraycopy(bytes, 5 + 1 + lngBytes.length, latBytes, 0, 4); aisMap.put("lat", covertLngLat(latBytes)); - byte[] ageBytes = new byte[2]; - System.arraycopy(bytes, 5 + radiusBytes.length + lngBytes.length + latBytes.length, ageBytes, 0, 2); - aisMap.put("age", covertToDec(ageBytes)); + aisMap.put("age", bytes[5 + 1 + lngBytes.length + latBytes.length]); return JSON.toJSONString(aisMap); } @@ -345,22 +358,20 @@ /** * 生成经纬度对象点 + * 经度(4)、纬度(4) */ public static List formatLngLat(byte[] targetBytes) { - List lnglat = new ArrayList<>(); - for (int i = 0; i < targetBytes.length; i += 4) { - byte[] target = new byte[4]; - System.arraycopy(targetBytes, i, target, 0, 4); - //每4个字节转换一次经纬度 - lnglat.add(covertLngLat(target)); - } List pointList = new ArrayList<>(); - for (int i = 0; i < lnglat.size(); i += 2) { + for (int i = 0; i < targetBytes.length; i += 8) { PointDTO point = new PointDTO(); - for (int j = 0; j < 2; j++) { - point.setLng(lnglat.get(i)); - point.setLat(lnglat.get(i + 1)); - } + byte[] lngBytes = new byte[4]; + System.arraycopy(targetBytes, i, lngBytes, 0, 4); + point.setLng(covertLngLat(lngBytes)); + + byte[] latBytes = new byte[4]; + System.arraycopy(targetBytes, lngBytes.length, latBytes, 0, 4); + point.setLat(covertLngLat(latBytes)); + pointList.add(point); } return pointList; diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java index 8b95501..e61d80e 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/EncodeData.java @@ -2,17 +2,13 @@ import com.alibaba.fastjson.JSON; 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.*; import com.casic.missiles.modular.system.dto.remote.OceanDetailRemoteData; import org.locationtech.spatial4j.distance.DistanceUtils; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; /** * 203所数据编码 @@ -26,40 +22,38 @@ private static final double EARTH_RADIUS = 6371.393; /** - * 环境数据 + * 环境数据-已校验 */ - public static Map encodeEnvironment(int robotId, String data, String date, String days, String hour) { + public static Map encodeEnvironment(int robotId, double robotLng, double robotLat, + TyphoonDTO typhoon, String date, String days, String hour) { Map resultMap = createDataHead("AIS"); resultMap.put("type", "Env"); resultMap.put("robotID", robotId); EnvironmentDTO dto = new EnvironmentDTO(); - //台风中心经度 - double lng = 109.322222; - dto.setTyphoonLng(lng); + if (typhoon != null) { + double lng = typhoon.getLng(); + double lat = typhoon.getLat(); - //台风中心纬度 - double lat = 17.392232; - dto.setTyphoonLat(lat); + dto.setTyphoonLng(lng); + dto.setTyphoonLat(lat); + dto.setTyphoonPower(typhoon.getPower()); + dto.setRadius7(typhoon.getRadius7()); + dto.setRadius10(typhoon.getRadius10()); + dto.setMoveSpeed(typhoon.getMoveSpeed()); + dto.setMoveDirection(typhoon.getMoveDirection()); - //台风风力 - int power = 14; - dto.setTyphoonPower(power); + //机器人与台风中心距离 + double distance = distance(lng, lat, robotLng, robotLat); + dto.setDistance(distance); - //台风半径 - double radius = 155.56; - dto.setTyphoonRadius(radius); - - //机器人与台风中心距离 - double distance = distance(115.6314213, 12.9691386, 112.0623457, 19.9936680); - dto.setDistance(distance); - - //机器人与台风的方位角 - double angle = azimuth(115.6314213, 12.9691386, 112.0623457, 19.9936680); - dto.setAzimuth(angle); + //机器人与台风的方位角 + double angle = azimuth(lng, lat, robotLng, robotLat); + dto.setAzimuth(angle); + } //洋流数据 - String oceanData = HttpRequestHelper.obtainOceanData(115.6314213, 12.9691386, date, days, hour); + String oceanData = HttpRequestHelper.obtainOceanData(robotLng, robotLat, date, days, hour); OceanDetailDTO oceanDetailDTO = null; if ("0".equals(HttpRequestHelper.getOceanCode(oceanData))) { OceanDetailRemoteData remoteData = JSON.parseObject(oceanData, new TypeReference() { @@ -73,27 +67,26 @@ } /** - * AIS数据 + * AIS数据-已校验 */ - public static Map encodeAIS(int robotId, String data) { + public static Map encodeAIS(int robotId, List ships) { Map resultMap = createDataHead("AIS"); resultMap.put("type", "AIS"); resultMap.put("robotID", robotId); //船只数量 - int shipCount = 2; List positionBeans = new ArrayList<>(); - for (int i = 0; i < shipCount; i++) { + for (ShipDTO ship : ships) { AisDTO ais = new AisDTO(); - ais.setCourse(187.2); - ais.setHeading(189.0); + ais.setCourse(ship.getCourse()); + ais.setHeading(ship.getHeading()); //船只经度 - double lng = 109.322222; - ais.setLng(lng); + ais.setLng(ship.getLng()); //船只纬度 - double lat = 17.392232; - ais.setLat(lat); - ais.setPositionTime("2021-09-29 16:12:25"); - ais.setSpeed(16.3); + ais.setLat(ship.getLat()); + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); + ais.setPositionTime(dateFormat.format(new Date())); + ais.setSpeed(ship.getSpeed()); positionBeans.add(ais); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java index 71ad079..2298f2a 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java @@ -140,18 +140,48 @@ break; case 0x05: //环境数据请求 -// String envRequest = DecodeData.decodeEnvRequest(data); + String envRequest = DecodeData.decodeEnvRequest(data); + //{"hour":"12","lng":109.32222199129043,"lat":17.39223199775081} + log.info("envRequest ===> " + envRequest); + JSONObject envJsonObject = JSON.parseObject(envRequest); + + String hour = envJsonObject.getString("hour"); + double envLng = envJsonObject.getDouble("lng"); + double envLat = envJsonObject.getDouble("lat"); List typhoonList = typhoonService.currentTyphoonList(); - /** - * 如果有多个台风,只返回距离当前机器人或者方舱最近的台风信息 - * */ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA); String date = dateFormat.format(new Date()); - Map objectMap = EncodeData.encodeEnvironment( - robotId, JSON.toJSONString(typhoonList), - date, "0", "10"); + Map objectMap; + if (typhoonList.isEmpty()) { + objectMap = EncodeData.encodeEnvironment(robotId, envLng, envLat, null, date, "0", hour); + } else if (typhoonList.size() == 1) { + objectMap = EncodeData.encodeEnvironment(robotId, envLng, envLat, typhoonList.get(0), + date, "0", hour); + } else { + /** + * 如果有多个台风,只返回距离当前机器人或者方舱最近的台风信息 + * */ + //记录每个台风和当前机器人之间的距离 + List disLinkedList = new LinkedList<>(); + for (TyphoonDTO dto : typhoonList) { + double distance = EncodeData.distance(dto.getLng(), dto.getLat(), envLng, envLat); + disLinkedList.add(distance); + } + //找出LinkedList中的最小值所在的位置 + double min = disLinkedList.get(0); + int pos = 0; + for (int i = 0; i < disLinkedList.size(); i++) { + if (disLinkedList.get(i) < min) { + min = disLinkedList.get(i); + pos = i; + } + } + objectMap = EncodeData.encodeEnvironment(robotId, envLng, envLat, typhoonList.get(pos), + date, "0", hour); + } ctx.writeAndFlush(JSON.toJSONString(objectMap)); break; case 0x06: @@ -159,25 +189,26 @@ String aisRequest = DecodeData.decodeAISRequest(data); log.info("aisRequest ===> " + aisRequest); //{"radius":58,"lng":109.32222199129043,"lat":17.39223199775081,"age":12} - JSONObject jsonObject = JSON.parseObject(aisRequest); + JSONObject aisJsonObject = JSON.parseObject(aisRequest); - int radius = jsonObject.getInteger("radius"); + int radius = aisJsonObject.getInteger("radius"); if (radius > Constant.MAX_RADIUS) { radius = Constant.MAX_RADIUS; } - double lat = jsonObject.getDouble("lat"); - double lng = jsonObject.getDouble("lng"); - int age = jsonObject.getInteger("age"); + double aisLat = aisJsonObject.getDouble("lat"); + double aisLng = aisJsonObject.getDouble("lng"); + int age = aisJsonObject.getInteger("age"); if (age > Constant.MAX_AGE) { age = Constant.MAX_AGE; } if (age < Constant.MIN_AGE) { age = Constant.MIN_AGE; } - String requestValue = lat * 600000 + "," + lng * 600000 + "," + radius; + String requestValue = aisLat * 600000 + "," + aisLng * 600000 + "," + radius; List ships = shipService.shipsInCircle(requestValue, age); - Map map = EncodeData.encodeAIS(robotId, JSON.toJSONString(ships)); + log.info(JSON.toJSONString(ships)); + Map map = EncodeData.encodeAIS(robotId, ships); ctx.writeAndFlush(JSON.toJSONString(map)); break; case 0x07: