diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 2afae14..6d3c2af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -15,7 +15,9 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; @@ -189,4 +192,19 @@ query.eq("robot_id", robotId); return getOne(query); } + + @Override + public void saveSpeed(String robotId, MqttMessage message) { + String json = new String(message.getPayload()); + RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("速度信息保存:{}", responseDTO.getMsg()); + UpdateWrapper query = new UpdateWrapper<>(); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); + update(query); + } + } } \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 2afae14..6d3c2af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -15,7 +15,9 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; @@ -189,4 +192,19 @@ query.eq("robot_id", robotId); return getOne(query); } + + @Override + public void saveSpeed(String robotId, MqttMessage message) { + String json = new String(message.getPayload()); + RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("速度信息保存:{}", responseDTO.getMsg()); + UpdateWrapper query = new UpdateWrapper<>(); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); + update(query); + } + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java index 3b25b14..374c7e0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java @@ -1,12 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RobotInfo; -import cn.hutool.core.util.StrUtil; - -import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * 机器人信息管理对象VO @@ -18,15 +16,17 @@ public class RobotInfoVO { private static final long serialVersionUID = 1L; - /** 机器人名称 */ - @ApiModelProperty(value = "机器人名称" , dataType = "String") - private String robotName; + /** + * 机器人名称 + */ + @ApiModelProperty(value = "机器人名称", dataType = "String") + private String robotName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (StrUtil.isNotEmpty(robotName)) { - query.like("robot_name",robotName); -} + if (StrUtil.isNotEmpty(robotName)) { + query.like("robot_name", robotName); + } return query; } } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 2afae14..6d3c2af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -15,7 +15,9 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; @@ -189,4 +192,19 @@ query.eq("robot_id", robotId); return getOne(query); } + + @Override + public void saveSpeed(String robotId, MqttMessage message) { + String json = new String(message.getPayload()); + RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("速度信息保存:{}", responseDTO.getMsg()); + UpdateWrapper query = new UpdateWrapper<>(); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); + update(query); + } + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java index 3b25b14..374c7e0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java @@ -1,12 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RobotInfo; -import cn.hutool.core.util.StrUtil; - -import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * 机器人信息管理对象VO @@ -18,15 +16,17 @@ public class RobotInfoVO { private static final long serialVersionUID = 1L; - /** 机器人名称 */ - @ApiModelProperty(value = "机器人名称" , dataType = "String") - private String robotName; + /** + * 机器人名称 + */ + @ApiModelProperty(value = "机器人名称", dataType = "String") + private String robotName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (StrUtil.isNotEmpty(robotName)) { - query.like("robot_name",robotName); -} + if (StrUtil.isNotEmpty(robotName)) { + query.like("robot_name", robotName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java index b1f64ca..ee733f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RouteInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,31 @@ public class RouteInfoVO { private static final long serialVersionUID = 1L; - /** 任务类型(1巡检任务) */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") - private Integer taskType; - /** 路径名称 */ - @ApiModelProperty(value = "路径名称" , dataType = "String") - private String routeName; + /** + * 任务类型(1巡检任务) + */ + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") + private Integer taskType; + /** + * 路径名称 + */ + @ApiModelProperty(value = "路径名称", dataType = "String") + private String routeName; + + @ApiModelProperty(value = "机器人ID", dataType = "String") + private String robotId; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (taskType!=null) { - query.eq("task_type",taskType); -} -if (StrUtil.isNotEmpty(routeName)) { - query.like("route_name",routeName); -} + if (taskType != null) { + query.eq("task_type", taskType); + } + if (StrUtil.isNotEmpty(routeName)) { + query.like("route_name", routeName); + } + if (StrUtil.isNotEmpty(robotId)) { + query.like("robot_id", robotId); + } return query; } } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 2afae14..6d3c2af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -15,7 +15,9 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; @@ -189,4 +192,19 @@ query.eq("robot_id", robotId); return getOne(query); } + + @Override + public void saveSpeed(String robotId, MqttMessage message) { + String json = new String(message.getPayload()); + RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("速度信息保存:{}", responseDTO.getMsg()); + UpdateWrapper query = new UpdateWrapper<>(); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); + update(query); + } + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java index 3b25b14..374c7e0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java @@ -1,12 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RobotInfo; -import cn.hutool.core.util.StrUtil; - -import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * 机器人信息管理对象VO @@ -18,15 +16,17 @@ public class RobotInfoVO { private static final long serialVersionUID = 1L; - /** 机器人名称 */ - @ApiModelProperty(value = "机器人名称" , dataType = "String") - private String robotName; + /** + * 机器人名称 + */ + @ApiModelProperty(value = "机器人名称", dataType = "String") + private String robotName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (StrUtil.isNotEmpty(robotName)) { - query.like("robot_name",robotName); -} + if (StrUtil.isNotEmpty(robotName)) { + query.like("robot_name", robotName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java index b1f64ca..ee733f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RouteInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,31 @@ public class RouteInfoVO { private static final long serialVersionUID = 1L; - /** 任务类型(1巡检任务) */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") - private Integer taskType; - /** 路径名称 */ - @ApiModelProperty(value = "路径名称" , dataType = "String") - private String routeName; + /** + * 任务类型(1巡检任务) + */ + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") + private Integer taskType; + /** + * 路径名称 + */ + @ApiModelProperty(value = "路径名称", dataType = "String") + private String routeName; + + @ApiModelProperty(value = "机器人ID", dataType = "String") + private String robotId; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (taskType!=null) { - query.eq("task_type",taskType); -} -if (StrUtil.isNotEmpty(routeName)) { - query.like("route_name",routeName); -} + if (taskType != null) { + query.eq("task_type", taskType); + } + if (StrUtil.isNotEmpty(routeName)) { + query.like("route_name", routeName); + } + if (StrUtil.isNotEmpty(robotId)) { + query.like("robot_id", robotId); + } return query; } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 77aed17..0549422 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -10,7 +10,7 @@ casic-web 2.0.0 - war + jar casic-web casic web启动入口 diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index d1cff15..89b2341 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -34,7 +35,7 @@ private final IDeviceOperationService operationService; private final IDeviceInfoSupportService infoSupportService; - public PtzNetController(IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { + public PtzNetController(@Lazy IHCNetService ihcNetService, IDeviceOperationService operationService, IDeviceInfoSupportService infoSupportService) { this.ihcNetService = ihcNetService; this.operationService = operationService; this.infoSupportService = infoSupportService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index dd20c76..0ce9e22 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -19,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - + @Lazy private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 37202e8..9e2bc4a 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -70,6 +70,10 @@ casic-job-quartz ${extension.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java new file mode 100644 index 0000000..85cb3d8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -0,0 +1,93 @@ +package com.casic.missiles.common; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { +// System.out.println("【websocket消息】广播消息:"+message); + try { + synchronized (webSocket.session) { + webSocket.session.getBasicRemote().sendText(message); +// webSocket.session.getAsyncRemote().sendText(message); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + /** + * 发送列表消息 + * + * @param userIds 用户集合 + * @param message 消息体 + */ + public void sendListMessage(List userIds, String message) { + System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java index 77ed723..c88d4e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotInfoController.java @@ -54,15 +54,6 @@ return ResponseDataDTO.success(super.packForBT(page)); } - /** - * 机器人速度设置 - */ - @ApiOperation(value = "机器人设置", hidden = true) - @PostMapping(value = "/setConfig") - public ResponseDataDTO setConfig(@RequestBody RobotInfo robotInfo) { - robotInfoService.updateSpeed(robotInfo); - return ResponseDataDTO.success(); - } /** * 新增机器人信息管理 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 6e959bf..5ddb98f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; @@ -87,6 +88,16 @@ } /** + * 机器人速度设置 + */ + @ApiOperation(value = "机器人设置") + @PostMapping(value = "/setConfig") + public ResponseDataDTO setConfig(@RequestBody RobotInfoSetDTO robotInfo) { + robotInfoService.updateSpeed(robotInfo); + return ResponseDataDTO.success(); + } + + /** * 机器人循迹路线读取 * * @param request 循迹路线读取 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java index ab6659c..27b6aca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotTrajectoryInfoController.java @@ -4,25 +4,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; -import org.springframework.web.bind.annotation.*; +import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import com.casic.missiles.core.page.PageInfoBT; +import org.springframework.web.bind.annotation.*; import java.util.List; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; -import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; -import com.casic.missiles.modular.robot.vo.RobotTrajectoryInfoVO; - /** * 机器人轨迹信息Controller * * @author lwh * @date 2023-10-30 */ -@Api(tags = "机器人轨迹信息") +@Api(tags = "机器人历史轨迹") @RestController @RequestMapping("/robot/trajectoryInfo") public class RobotTrajectoryInfoController extends BaseController { @@ -36,7 +35,7 @@ /** * 机器人轨迹信息列表 */ - @ApiOperation("列表查询") + @ApiOperation(value = "列表查询") @GetMapping(value = "/list") public ResponseDataDTO> list(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { QueryWrapper query = robotTrajectoryInfoVO.genQuery(); @@ -46,7 +45,7 @@ /** * 机器人轨迹信息分页列表 */ - @ApiOperation("分页查询") + @ApiOperation(value = "分页查询", hidden = true) @GetMapping(value = "/listPage") public ResponseDataDTO> listPage(RobotTrajectoryInfoVO robotTrajectoryInfoVO) { Page page = PageFactory.defaultPage(); @@ -58,37 +57,37 @@ /** * 新增机器人轨迹信息 */ - @ApiOperation("新增接口") + @ApiOperation(value = "新增接口", hidden = true) @PostMapping(value = "/add") - public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.save(robotTrajectoryInfo); + public ResponseDataDTO add(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { + robotTrajectoryInfoService.save(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 修改机器人轨迹信息 */ - @ApiOperation("修改接口") + @ApiOperation(value = "修改接口", hidden = true) @PostMapping(value = "/update") public ResponseDataDTO update(@RequestBody RobotTrajectoryInfo robotTrajectoryInfo) { - robotTrajectoryInfoService.updateById(robotTrajectoryInfo); + robotTrajectoryInfoService.updateById(robotTrajectoryInfo); return ResponseDataDTO.success(); } /** * 删除机器人轨迹信息 */ - @ApiOperation("删除接口") + @ApiOperation(value = "删除接口", hidden = true) @GetMapping(value = "/delete") public ResponseDataDTO delete(String id) { - robotTrajectoryInfoService.removeById(id); + robotTrajectoryInfoService.removeById(id); return ResponseDataDTO.success(); } /** * 机器人轨迹信息详情 */ - @ApiOperation("详情查询") + @ApiOperation(value = "详情查询", hidden = true) @GetMapping(value = "/detail") public ResponseDataDTO detail(String id) { return ResponseDataDTO.success(robotTrajectoryInfoService.getById(id)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java new file mode 100644 index 0000000..ab22e20 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/RobotInfoSetDTO.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RobotInfoSetDTO { + /** + * 主键 + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long id; + /** + * 设置线速度 + */ + @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + private BigDecimal confV; + + /** + * 设置角速度 + */ + @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + private BigDecimal confW; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index 2d8d705..191dd22 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -244,6 +244,14 @@ @ApiModelProperty(value = "当前任务信息ID", dataType = "Long") @TableField("curr_task_id") private Long currTaskId; + + @ApiModelProperty(value = "电量", dataType = "Integer") + @TableField("electricity_quantity") + private Integer electricityQuantity; + + @ApiModelProperty(value = "电压", dataType = "Integer") + private BigDecimal voltage; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java new file mode 100644 index 0000000..211f0e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppCmdVelMsgHandler.java @@ -0,0 +1,33 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.handler.IBaseMsgHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机器人控制响应handler + */ +@Slf4j +@Component("/app_cmd_vel_response") +public class AppCmdVelMsgHandler implements IBaseMsgHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + static { + index.put("index", 0); + } + + public AppCmdVelMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + statusInfoService.saveSpeed(robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 5f77817..accef13 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.opt.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.casic.missiles.core.util.SpringContextHolder; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.IBaseRobotService; @@ -83,6 +84,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); MessageRequestDTO messageDTO = new MessageRequestDTO(); messageDTO.setMsg(request); + System.out.println(JSON.toJSONString(messageDTO)); ResponseDataDTO list = robotRouteOptService.robotCmd(info, InstructCodeEnums.START_TRACK, messageDTO); //增加循迹任务记录 @@ -91,6 +93,12 @@ return list; } + /** + * 机器人实时控制接口 + * + * @param request 请求体 + * @return + */ @Override public ResponseDataDTO appCmdVel(AppCmdVelRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); @@ -98,6 +106,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); + return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java index 8f66f8d..4f71f0f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotRouteOptServiceImpl.java @@ -56,7 +56,7 @@ messageDTO.setMsg(request); RobotMsgResponseDTO> result = MsgUtils.senMsg(mqttClient, InstructCodeEnums.TRACK_LIST, messageDTO); - if (result != null&&result.getMsg()!=null) { + if (result != null && result.getMsg() != null) { //机器人路线更新至表中 return ResponseDataDTO.success(routeInfoService.saveListByRouteTargetIds(robotInfo, result.getMsg().getResult())); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java deleted file mode 100644 index cb2a843..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotMsgResponseDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotMsgResponseDTO { - /** - * 是否异常 - */ - private Boolean isSuccess; - private RobotMsgDTO msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java deleted file mode 100644 index 57551f0..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/RobotResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.base; - -import lombok.Data; - -/** - * 机器人消息响应 - */ -@Data -public class RobotResponseDTO { - private T msg; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java new file mode 100644 index 0000000..b1b6a1c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotMsgResponseDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人响应消息体 + */ +@Data +public class RobotMsgResponseDTO implements RobotBaseMsg { + /** + * 是否异常 + */ + private Boolean isSuccess; + private RobotMsgDTO msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java new file mode 100644 index 0000000..f395c4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/base/dto/RobotResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.base.dto; + +import com.casic.missiles.modular.robot.opt.instruct.base.RobotBaseMsg; +import lombok.Data; + +/** + * 机器人消息响应 + */ +@Data +public class RobotResponseDTO implements RobotBaseMsg { + private T msg; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java new file mode 100644 index 0000000..d749c12 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index e3bb91c..2f8eba5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import java.util.List; @@ -27,5 +28,5 @@ * * @param robotInfo 机器信息 */ - void updateSpeed(RobotInfo robotInfo); + void updateSpeed(RobotInfoSetDTO robotInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 4cfeccf..1f725a5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -69,8 +69,15 @@ * @param currRouteId 当前路线信息 * @param currTaskId 当前任务信息 */ - void updateCurrTask(String robotId,Long currRouteId, Long currTaskId); + void updateCurrTask(String robotId, Long currRouteId, Long currTaskId); RobotStatusInfo getStatusByRobotId(String robotId); + /** + * 机器人速度读取 + * + * @param robotId 机器ID + * @param message 速度响应 + */ + void saveSpeed(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c405c9b..a97031e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotInfoMapper; +import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.service.IRobotInfoService; @@ -16,6 +17,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; @@ -45,7 +47,14 @@ } @Override - public void updateSpeed(RobotInfo robotInfo) { + public RobotInfo getById(Serializable id) { + RobotInfo robotInfo = super.getById(id); + wrapRobotInfo(robotInfo); + return robotInfo; + } + + @Override + public void updateSpeed(RobotInfoSetDTO robotInfo) { UpdateWrapper update = new UpdateWrapper<>(); update.set("conf_v", robotInfo.getConfV()); update.set("conf_w", robotInfo.getConfW()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 2afae14..6d3c2af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -15,7 +15,9 @@ import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; @@ -189,4 +192,19 @@ query.eq("robot_id", robotId); return getOne(query); } + + @Override + public void saveSpeed(String robotId, MqttMessage message) { + String json = new String(message.getPayload()); + RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("速度信息保存:{}", responseDTO.getMsg()); + UpdateWrapper query = new UpdateWrapper<>(); + query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id", robotId); + update(query); + } + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java index 3b25b14..374c7e0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotInfoVO.java @@ -1,12 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RobotInfo; -import cn.hutool.core.util.StrUtil; - -import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** * 机器人信息管理对象VO @@ -18,15 +16,17 @@ public class RobotInfoVO { private static final long serialVersionUID = 1L; - /** 机器人名称 */ - @ApiModelProperty(value = "机器人名称" , dataType = "String") - private String robotName; + /** + * 机器人名称 + */ + @ApiModelProperty(value = "机器人名称", dataType = "String") + private String robotName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (StrUtil.isNotEmpty(robotName)) { - query.like("robot_name",robotName); -} + if (StrUtil.isNotEmpty(robotName)) { + query.like("robot_name", robotName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java index b1f64ca..ee733f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RouteInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.RouteInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,31 @@ public class RouteInfoVO { private static final long serialVersionUID = 1L; - /** 任务类型(1巡检任务) */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") - private Integer taskType; - /** 路径名称 */ - @ApiModelProperty(value = "路径名称" , dataType = "String") - private String routeName; + /** + * 任务类型(1巡检任务) + */ + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") + private Integer taskType; + /** + * 路径名称 + */ + @ApiModelProperty(value = "路径名称", dataType = "String") + private String routeName; + + @ApiModelProperty(value = "机器人ID", dataType = "String") + private String robotId; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (taskType!=null) { - query.eq("task_type",taskType); -} -if (StrUtil.isNotEmpty(routeName)) { - query.like("route_name",routeName); -} + if (taskType != null) { + query.eq("task_type", taskType); + } + if (StrUtil.isNotEmpty(routeName)) { + query.like("route_name", routeName); + } + if (StrUtil.isNotEmpty(robotId)) { + query.like("robot_id", robotId); + } return query; } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 77aed17..0549422 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -10,7 +10,7 @@ casic-web 2.0.0 - war + jar casic-web casic web启动入口 diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 46da4c3..ca932a2 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -37,7 +37,10 @@ session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 no-login-urls: /user/login,/kaptcha,/config/baseConfig - hiklib: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\\HCNetSDK.dll + hiklib: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ - config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ \ No newline at end of file + config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ +server: + servlet: + context-path: /casic-robot \ No newline at end of file