diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { 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 74c3218..9a5ac07 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 @@ -5,10 +5,7 @@ import com.casic.missiles.modular.system.dto.ShipDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.model.RegionPlan; -import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RoutePlan; -import com.casic.missiles.modular.system.model.ShelterPosition; +import com.casic.missiles.modular.system.model.*; import com.casic.missiles.modular.system.service.*; import com.casic.missiles.modular.system.utils.Constant; import com.casic.missiles.modular.system.utils.DecodeData; @@ -37,19 +34,22 @@ private final IShelterPositionService shelterPositionService; private final IRegionPlanService regionPlanService; private final IRoutePlanService routePlanService; + private final ITaskService taskService; public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService, IShipService shipService, IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService, - IRoutePlanService routePlanService) { + IRoutePlanService routePlanService, + ITaskService taskService) { this.robotService = robotService; this.typhoonService = typhoonService; this.shipService = shipService; this.shelterPositionService = shelterPositionService; this.regionPlanService = regionPlanService; this.routePlanService = routePlanService; + this.taskService = taskService; } private boolean isCorrectData(byte[] bytes) { @@ -99,8 +99,8 @@ break; case 0x02: //算法结果 - int taskType = data[3]; - switch (taskType) { + int planType = data[3]; + switch (planType) { case 0x01: String robotRegion = DecodeData.decodeRobotRegion(data); log.info("区域覆盖 ===> " + robotRegion); @@ -126,7 +126,59 @@ break; case 0x03: //任务数据还需要细分 - + int taskType = data[3]; + Task task = new Task(); + task.setRobotId(robotId); + task.setCreateTime(TimeUtil.getCurrentTime()); + switch (taskType) { + case 0x01: + //定向任务开始 + String directedTask = DecodeData.decodeDirectedTask(data); + log.info("定向任务开始 ===> " + directedTask); + task.setTaskType("1"); + task.setTaskData(directedTask); + taskService.save(task); + break; + case 0x02: + //航路点任务开始 + String routeTask = DecodeData.decodeTaskRoute(data); + log.info("航路点任务开始 ===> " + routeTask); + task.setTaskType("2"); + task.setTaskData(routeTask); + taskService.save(task); + break; + case 0x03: + //定深直航任务开始 + String flightTask = DecodeData.decodeDirectFlightTask(data); + log.info("定深直航任务开始 ===> " + flightTask); + task.setTaskType("3"); + task.setTaskData(flightTask); + taskService.save(task); + break; + case 0x04: + //驻留任务开始 + String resideTask = DecodeData.decodeResideTask(data); + log.info("驻留任务开始 ===> " + resideTask); + task.setTaskType("4"); + task.setTaskData(resideTask); + taskService.save(task); + break; + case 0x05: + //投放任务开始 + String putTask = DecodeData.decodePutTask(data); + log.info("投放任务开始 ===> " + putTask); + task.setTaskType("5"); + task.setTaskData(putTask); + taskService.save(task); + break; + case 0x0F: + //任务终止 + log.info("任务终止 ===> robotId: " + robotId); + taskService.updateTaskById(robotId); + break; + default: + break; + } break; case 0x04: /** diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { 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 74c3218..9a5ac07 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 @@ -5,10 +5,7 @@ import com.casic.missiles.modular.system.dto.ShipDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.model.RegionPlan; -import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RoutePlan; -import com.casic.missiles.modular.system.model.ShelterPosition; +import com.casic.missiles.modular.system.model.*; import com.casic.missiles.modular.system.service.*; import com.casic.missiles.modular.system.utils.Constant; import com.casic.missiles.modular.system.utils.DecodeData; @@ -37,19 +34,22 @@ private final IShelterPositionService shelterPositionService; private final IRegionPlanService regionPlanService; private final IRoutePlanService routePlanService; + private final ITaskService taskService; public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService, IShipService shipService, IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService, - IRoutePlanService routePlanService) { + IRoutePlanService routePlanService, + ITaskService taskService) { this.robotService = robotService; this.typhoonService = typhoonService; this.shipService = shipService; this.shelterPositionService = shelterPositionService; this.regionPlanService = regionPlanService; this.routePlanService = routePlanService; + this.taskService = taskService; } private boolean isCorrectData(byte[] bytes) { @@ -99,8 +99,8 @@ break; case 0x02: //算法结果 - int taskType = data[3]; - switch (taskType) { + int planType = data[3]; + switch (planType) { case 0x01: String robotRegion = DecodeData.decodeRobotRegion(data); log.info("区域覆盖 ===> " + robotRegion); @@ -126,7 +126,59 @@ break; case 0x03: //任务数据还需要细分 - + int taskType = data[3]; + Task task = new Task(); + task.setRobotId(robotId); + task.setCreateTime(TimeUtil.getCurrentTime()); + switch (taskType) { + case 0x01: + //定向任务开始 + String directedTask = DecodeData.decodeDirectedTask(data); + log.info("定向任务开始 ===> " + directedTask); + task.setTaskType("1"); + task.setTaskData(directedTask); + taskService.save(task); + break; + case 0x02: + //航路点任务开始 + String routeTask = DecodeData.decodeTaskRoute(data); + log.info("航路点任务开始 ===> " + routeTask); + task.setTaskType("2"); + task.setTaskData(routeTask); + taskService.save(task); + break; + case 0x03: + //定深直航任务开始 + String flightTask = DecodeData.decodeDirectFlightTask(data); + log.info("定深直航任务开始 ===> " + flightTask); + task.setTaskType("3"); + task.setTaskData(flightTask); + taskService.save(task); + break; + case 0x04: + //驻留任务开始 + String resideTask = DecodeData.decodeResideTask(data); + log.info("驻留任务开始 ===> " + resideTask); + task.setTaskType("4"); + task.setTaskData(resideTask); + taskService.save(task); + break; + case 0x05: + //投放任务开始 + String putTask = DecodeData.decodePutTask(data); + log.info("投放任务开始 ===> " + putTask); + task.setTaskType("5"); + task.setTaskData(putTask); + taskService.save(task); + break; + case 0x0F: + //任务终止 + log.info("任务终止 ===> robotId: " + robotId); + taskService.updateTaskById(robotId); + break; + default: + break; + } break; case 0x04: /** diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java new file mode 100644 index 0000000..faa3bba --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Task; +import org.apache.ibatis.annotations.Param; + +/** + * @author a203 + */ +public interface TaskMapper extends BaseMapper { + + /** + * 获取最新的规划结果 + * + * @param robotId 机器人ID + * @return {@link Task} + */ + Task selectTaskById(@Param("robotId") Integer robotId); +} diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { 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 74c3218..9a5ac07 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 @@ -5,10 +5,7 @@ import com.casic.missiles.modular.system.dto.ShipDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.model.RegionPlan; -import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RoutePlan; -import com.casic.missiles.modular.system.model.ShelterPosition; +import com.casic.missiles.modular.system.model.*; import com.casic.missiles.modular.system.service.*; import com.casic.missiles.modular.system.utils.Constant; import com.casic.missiles.modular.system.utils.DecodeData; @@ -37,19 +34,22 @@ private final IShelterPositionService shelterPositionService; private final IRegionPlanService regionPlanService; private final IRoutePlanService routePlanService; + private final ITaskService taskService; public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService, IShipService shipService, IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService, - IRoutePlanService routePlanService) { + IRoutePlanService routePlanService, + ITaskService taskService) { this.robotService = robotService; this.typhoonService = typhoonService; this.shipService = shipService; this.shelterPositionService = shelterPositionService; this.regionPlanService = regionPlanService; this.routePlanService = routePlanService; + this.taskService = taskService; } private boolean isCorrectData(byte[] bytes) { @@ -99,8 +99,8 @@ break; case 0x02: //算法结果 - int taskType = data[3]; - switch (taskType) { + int planType = data[3]; + switch (planType) { case 0x01: String robotRegion = DecodeData.decodeRobotRegion(data); log.info("区域覆盖 ===> " + robotRegion); @@ -126,7 +126,59 @@ break; case 0x03: //任务数据还需要细分 - + int taskType = data[3]; + Task task = new Task(); + task.setRobotId(robotId); + task.setCreateTime(TimeUtil.getCurrentTime()); + switch (taskType) { + case 0x01: + //定向任务开始 + String directedTask = DecodeData.decodeDirectedTask(data); + log.info("定向任务开始 ===> " + directedTask); + task.setTaskType("1"); + task.setTaskData(directedTask); + taskService.save(task); + break; + case 0x02: + //航路点任务开始 + String routeTask = DecodeData.decodeTaskRoute(data); + log.info("航路点任务开始 ===> " + routeTask); + task.setTaskType("2"); + task.setTaskData(routeTask); + taskService.save(task); + break; + case 0x03: + //定深直航任务开始 + String flightTask = DecodeData.decodeDirectFlightTask(data); + log.info("定深直航任务开始 ===> " + flightTask); + task.setTaskType("3"); + task.setTaskData(flightTask); + taskService.save(task); + break; + case 0x04: + //驻留任务开始 + String resideTask = DecodeData.decodeResideTask(data); + log.info("驻留任务开始 ===> " + resideTask); + task.setTaskType("4"); + task.setTaskData(resideTask); + taskService.save(task); + break; + case 0x05: + //投放任务开始 + String putTask = DecodeData.decodePutTask(data); + log.info("投放任务开始 ===> " + putTask); + task.setTaskType("5"); + task.setTaskData(putTask); + taskService.save(task); + break; + case 0x0F: + //任务终止 + log.info("任务终止 ===> robotId: " + robotId); + taskService.updateTaskById(robotId); + break; + default: + break; + } break; case 0x04: /** diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java new file mode 100644 index 0000000..faa3bba --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Task; +import org.apache.ibatis.annotations.Param; + +/** + * @author a203 + */ +public interface TaskMapper extends BaseMapper { + + /** + * 获取最新的规划结果 + * + * @param robotId 机器人ID + * @return {@link Task} + */ + Task selectTaskById(@Param("robotId") Integer robotId); +} diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml new file mode 100644 index 0000000..bd29bee --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml @@ -0,0 +1,24 @@ + + + + + + + ID AS id, + ROBOT_ID AS robotId, + CREATE_TIME AS createTime, + END_TIME AS endTime, + TASK_TYPE AS taskType, + TASK_DATA AS taskData + + + + + \ No newline at end of file diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { 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 74c3218..9a5ac07 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 @@ -5,10 +5,7 @@ import com.casic.missiles.modular.system.dto.ShipDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.model.RegionPlan; -import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RoutePlan; -import com.casic.missiles.modular.system.model.ShelterPosition; +import com.casic.missiles.modular.system.model.*; import com.casic.missiles.modular.system.service.*; import com.casic.missiles.modular.system.utils.Constant; import com.casic.missiles.modular.system.utils.DecodeData; @@ -37,19 +34,22 @@ private final IShelterPositionService shelterPositionService; private final IRegionPlanService regionPlanService; private final IRoutePlanService routePlanService; + private final ITaskService taskService; public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService, IShipService shipService, IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService, - IRoutePlanService routePlanService) { + IRoutePlanService routePlanService, + ITaskService taskService) { this.robotService = robotService; this.typhoonService = typhoonService; this.shipService = shipService; this.shelterPositionService = shelterPositionService; this.regionPlanService = regionPlanService; this.routePlanService = routePlanService; + this.taskService = taskService; } private boolean isCorrectData(byte[] bytes) { @@ -99,8 +99,8 @@ break; case 0x02: //算法结果 - int taskType = data[3]; - switch (taskType) { + int planType = data[3]; + switch (planType) { case 0x01: String robotRegion = DecodeData.decodeRobotRegion(data); log.info("区域覆盖 ===> " + robotRegion); @@ -126,7 +126,59 @@ break; case 0x03: //任务数据还需要细分 - + int taskType = data[3]; + Task task = new Task(); + task.setRobotId(robotId); + task.setCreateTime(TimeUtil.getCurrentTime()); + switch (taskType) { + case 0x01: + //定向任务开始 + String directedTask = DecodeData.decodeDirectedTask(data); + log.info("定向任务开始 ===> " + directedTask); + task.setTaskType("1"); + task.setTaskData(directedTask); + taskService.save(task); + break; + case 0x02: + //航路点任务开始 + String routeTask = DecodeData.decodeTaskRoute(data); + log.info("航路点任务开始 ===> " + routeTask); + task.setTaskType("2"); + task.setTaskData(routeTask); + taskService.save(task); + break; + case 0x03: + //定深直航任务开始 + String flightTask = DecodeData.decodeDirectFlightTask(data); + log.info("定深直航任务开始 ===> " + flightTask); + task.setTaskType("3"); + task.setTaskData(flightTask); + taskService.save(task); + break; + case 0x04: + //驻留任务开始 + String resideTask = DecodeData.decodeResideTask(data); + log.info("驻留任务开始 ===> " + resideTask); + task.setTaskType("4"); + task.setTaskData(resideTask); + taskService.save(task); + break; + case 0x05: + //投放任务开始 + String putTask = DecodeData.decodePutTask(data); + log.info("投放任务开始 ===> " + putTask); + task.setTaskType("5"); + task.setTaskData(putTask); + taskService.save(task); + break; + case 0x0F: + //任务终止 + log.info("任务终止 ===> robotId: " + robotId); + taskService.updateTaskById(robotId); + break; + default: + break; + } break; case 0x04: /** diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java new file mode 100644 index 0000000..faa3bba --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Task; +import org.apache.ibatis.annotations.Param; + +/** + * @author a203 + */ +public interface TaskMapper extends BaseMapper { + + /** + * 获取最新的规划结果 + * + * @param robotId 机器人ID + * @return {@link Task} + */ + Task selectTaskById(@Param("robotId") Integer robotId); +} diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml new file mode 100644 index 0000000..bd29bee --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml @@ -0,0 +1,24 @@ + + + + + + + ID AS id, + ROBOT_ID AS robotId, + CREATE_TIME AS createTime, + END_TIME AS endTime, + TASK_TYPE AS taskType, + TASK_DATA AS taskData + + + + + \ No newline at end of file diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java b/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java new file mode 100644 index 0000000..8541fc5 --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.Task; + +/** + * 任务 服务类 + * + * @author a203 + */ +public interface ITaskService extends IService { + /** + * 根据机器人ID查找到未完成任务的Task + * + * @param robotId + */ + void updateTaskById(int robotId); +} diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java new file mode 100644 index 0000000..3b5043d --- /dev/null +++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Task.java @@ -0,0 +1,53 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; + +/** + * @author a203 + */ +@Data +@TableName("bus_task") +public class Task extends Model { + private static final long serialVersionUID = 1L; + + /** + * 数据库主键 + */ + @TableId(value = "ID", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 机器人ID + */ + @TableField("ROBOT_ID") + private Integer robotId; + + /** + * 任务生成的时间 + */ + @TableField("CREATE_TIME") + private String createTime; + + /** + * 任务结束的时间 + */ + @TableField("END_TIME") + private String endTime; + + /** + * 任务类型 + */ + @TableField("TASK_TYPE") + private String taskType; + + /** + * 任务数据 + */ + @TableField("TASK_DATA") + private String taskData; +} 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 3a8e261..0b22caf 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 @@ -4,7 +4,6 @@ import com.casic.missiles.modular.system.dto.PointDTO; import com.casic.missiles.modular.system.model.RobotInfo; import com.casic.missiles.modular.system.model.ShelterPosition; -import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; @@ -16,10 +15,9 @@ * * @author a203 */ -@Slf4j public class DecodeData { /** - * 水下机器人信息 + * 水下机器人信息-已校验 */ public static RobotInfo decodeRobotInfo(byte[] bytes) { RobotInfo robot = new RobotInfo(); @@ -169,101 +167,101 @@ } /** - * 定向任务 + * 定向任务-已校验 */ public static String decodeDirectedTask(byte[] bytes) { Map taskMap = new HashMap<>(2); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); return JSON.toJSONString(taskMap); } /** - * 航路点任务 + * 航路点任务-已校验 */ public static String decodeTaskRoute(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); - int count = bytes[6]; + int count = bytes[7]; taskMap.put("routeCount", count); //经度(4)、纬度(4) int routeSize = count * (4 + 4); byte[] routeBytes = new byte[routeSize]; - System.arraycopy(bytes, 7, routeBytes, 0, routeSize); + System.arraycopy(bytes, 8, routeBytes, 0, routeSize); taskMap.put("robotRoutes", formatLngLat(routeBytes)); return JSON.toJSONString(taskMap); } /** - * 定深直航任务 + * 定深直航任务-已校验 */ public static String decodeDirectFlightTask(byte[] bytes) { Map taskMap = new HashMap<>(3); byte[] depthBytes = new byte[2]; - System.arraycopy(bytes, 4, depthBytes, 0, 2); + System.arraycopy(bytes, 5, depthBytes, 0, 2); taskMap.put("taskDepth", covertDepth(depthBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 6, angleBytes, 0, 2); + System.arraycopy(bytes, 7, angleBytes, 0, 2); taskMap.put("headingAngle", covertHeadingAngle(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 8, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 9, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 驻留任务 + * 驻留任务-已校验 */ public static String decodeResideTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); byte[] angleBytes = new byte[2]; - System.arraycopy(bytes, 12, angleBytes, 0, 2); + System.arraycopy(bytes, 13, angleBytes, 0, 2); taskMap.put("depth", covertDepth(angleBytes)); byte[] timesBytes = new byte[2]; - System.arraycopy(bytes, 14, timesBytes, 0, 2); - taskMap.put("time", covertToDec(timesBytes)); + System.arraycopy(bytes, 15, timesBytes, 0, 2); + taskMap.put("duration", covertToDec(timesBytes)); return JSON.toJSONString(taskMap); } /** - * 投放任务 + * 投放任务-已校验 */ public static String decodePutTask(byte[] bytes) { Map taskMap = new HashMap<>(4); byte[] lngBytes = new byte[4]; - System.arraycopy(bytes, 4, lngBytes, 0, 4); + System.arraycopy(bytes, 5, lngBytes, 0, 4); taskMap.put("lng", covertLngLat(lngBytes)); byte[] latBytes = new byte[4]; - System.arraycopy(bytes, 8, latBytes, 0, 4); + System.arraycopy(bytes, 9, latBytes, 0, 4); taskMap.put("lat", covertLngLat(latBytes)); - int count = bytes[12]; + int count = bytes[13]; taskMap.put("count", count); byte[] idsBytes = new byte[count]; - System.arraycopy(bytes, 13, idsBytes, 0, count); + System.arraycopy(bytes, 14, idsBytes, 0, count); StringBuilder builder = new StringBuilder(); for (int i = 0; i < idsBytes.length; i++) { if (i != idsBytes.length - 1) { 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 74c3218..9a5ac07 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 @@ -5,10 +5,7 @@ import com.casic.missiles.modular.system.dto.ShipDTO; import com.casic.missiles.modular.system.dto.TyphoonDTO; import com.casic.missiles.modular.system.dto.TyphoonDetailDTO; -import com.casic.missiles.modular.system.model.RegionPlan; -import com.casic.missiles.modular.system.model.RobotInfo; -import com.casic.missiles.modular.system.model.RoutePlan; -import com.casic.missiles.modular.system.model.ShelterPosition; +import com.casic.missiles.modular.system.model.*; import com.casic.missiles.modular.system.service.*; import com.casic.missiles.modular.system.utils.Constant; import com.casic.missiles.modular.system.utils.DecodeData; @@ -37,19 +34,22 @@ private final IShelterPositionService shelterPositionService; private final IRegionPlanService regionPlanService; private final IRoutePlanService routePlanService; + private final ITaskService taskService; public SocketServiceImpl(IRobotService robotService, ITyphoonService typhoonService, IShipService shipService, IShelterPositionService shelterPositionService, IRegionPlanService regionPlanService, - IRoutePlanService routePlanService) { + IRoutePlanService routePlanService, + ITaskService taskService) { this.robotService = robotService; this.typhoonService = typhoonService; this.shipService = shipService; this.shelterPositionService = shelterPositionService; this.regionPlanService = regionPlanService; this.routePlanService = routePlanService; + this.taskService = taskService; } private boolean isCorrectData(byte[] bytes) { @@ -99,8 +99,8 @@ break; case 0x02: //算法结果 - int taskType = data[3]; - switch (taskType) { + int planType = data[3]; + switch (planType) { case 0x01: String robotRegion = DecodeData.decodeRobotRegion(data); log.info("区域覆盖 ===> " + robotRegion); @@ -126,7 +126,59 @@ break; case 0x03: //任务数据还需要细分 - + int taskType = data[3]; + Task task = new Task(); + task.setRobotId(robotId); + task.setCreateTime(TimeUtil.getCurrentTime()); + switch (taskType) { + case 0x01: + //定向任务开始 + String directedTask = DecodeData.decodeDirectedTask(data); + log.info("定向任务开始 ===> " + directedTask); + task.setTaskType("1"); + task.setTaskData(directedTask); + taskService.save(task); + break; + case 0x02: + //航路点任务开始 + String routeTask = DecodeData.decodeTaskRoute(data); + log.info("航路点任务开始 ===> " + routeTask); + task.setTaskType("2"); + task.setTaskData(routeTask); + taskService.save(task); + break; + case 0x03: + //定深直航任务开始 + String flightTask = DecodeData.decodeDirectFlightTask(data); + log.info("定深直航任务开始 ===> " + flightTask); + task.setTaskType("3"); + task.setTaskData(flightTask); + taskService.save(task); + break; + case 0x04: + //驻留任务开始 + String resideTask = DecodeData.decodeResideTask(data); + log.info("驻留任务开始 ===> " + resideTask); + task.setTaskType("4"); + task.setTaskData(resideTask); + taskService.save(task); + break; + case 0x05: + //投放任务开始 + String putTask = DecodeData.decodePutTask(data); + log.info("投放任务开始 ===> " + putTask); + task.setTaskType("5"); + task.setTaskData(putTask); + taskService.save(task); + break; + case 0x0F: + //任务终止 + log.info("任务终止 ===> robotId: " + robotId); + taskService.updateTaskById(robotId); + break; + default: + break; + } break; case 0x04: /** diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java new file mode 100644 index 0000000..faa3bba --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/TaskMapper.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Task; +import org.apache.ibatis.annotations.Param; + +/** + * @author a203 + */ +public interface TaskMapper extends BaseMapper { + + /** + * 获取最新的规划结果 + * + * @param robotId 机器人ID + * @return {@link Task} + */ + Task selectTaskById(@Param("robotId") Integer robotId); +} diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml new file mode 100644 index 0000000..bd29bee --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/dao/mapping/TaskMapper.xml @@ -0,0 +1,24 @@ + + + + + + + ID AS id, + ROBOT_ID AS robotId, + CREATE_TIME AS createTime, + END_TIME AS endTime, + TASK_TYPE AS taskType, + TASK_DATA AS taskData + + + + + \ No newline at end of file diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java b/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java new file mode 100644 index 0000000..8541fc5 --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/service/ITaskService.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.system.model.Task; + +/** + * 任务 服务类 + * + * @author a203 + */ +public interface ITaskService extends IService { + /** + * 根据机器人ID查找到未完成任务的Task + * + * @param robotId + */ + void updateTaskById(int robotId); +} diff --git a/casic-task/src/main/java/com/casic/missiles/modular/system/service/impl/TaskServiceImpl.java b/casic-task/src/main/java/com/casic/missiles/modular/system/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..855fe8e --- /dev/null +++ b/casic-task/src/main/java/com/casic/missiles/modular/system/service/impl/TaskServiceImpl.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.TaskMapper; +import com.casic.missiles.modular.system.model.Task; +import com.casic.missiles.modular.system.service.ITaskService; +import com.casic.missiles.modular.system.utils.TimeUtil; +import org.springframework.stereotype.Service; + +/** + * @author a203 + */ +@Service +public class TaskServiceImpl extends ServiceImpl implements ITaskService { + + public TaskServiceImpl() { + + } + + @Override + public void updateTaskById(int robotId) { + Task task = this.baseMapper.selectTaskById(robotId); + task.setEndTime(TimeUtil.getCurrentTime()); + updateById(task); + } +}