From 7c8ca9ac70ff7144ea5a924dc6241bb8c8cd13c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Wed, 12 Feb 2025 17:31:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8E=E5=89=8D=E7=AB=AF=E7=9A=84ws=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=EF=BC=8C=E6=8E=A5=E6=94=B6=E5=89=8D=E7=AB=AF=E6=8C=87?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/qyft/gd/common/constant/Commands.java | 92 ++++++++++++++++++++++ .../com/qyft/gd/common/result/CMDResultCode.java | 28 +++++++ .../java/com/qyft/gd/config/WebSocketConfig.java | 30 +++++++ .../java/com/qyft/gd/controller/CMDController.java | 46 +++++++++++ .../qyft/gd/controller/WebSocketController.java | 25 ++++++ .../com/qyft/gd/device/service/DeviceService.java | 10 +++ src/main/java/com/qyft/gd/model/form/CMDForm.java | 23 ++++++ .../java/com/qyft/gd/model/vo/ExecutionResult.java | 20 +++++ src/main/java/com/qyft/gd/service/CMDService.java | 41 ++++++++++ .../com/qyft/gd/system/config/WebSocketConfig.java | 30 ------- .../gd/system/controller/WebSocketController.java | 20 ----- 11 files changed, 315 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/qyft/gd/common/constant/Commands.java create mode 100644 src/main/java/com/qyft/gd/common/result/CMDResultCode.java create mode 100644 src/main/java/com/qyft/gd/config/WebSocketConfig.java create mode 100644 src/main/java/com/qyft/gd/controller/CMDController.java create mode 100644 src/main/java/com/qyft/gd/controller/WebSocketController.java create mode 100644 src/main/java/com/qyft/gd/device/service/DeviceService.java create mode 100644 src/main/java/com/qyft/gd/model/form/CMDForm.java create mode 100644 src/main/java/com/qyft/gd/model/vo/ExecutionResult.java create mode 100644 src/main/java/com/qyft/gd/service/CMDService.java delete mode 100644 src/main/java/com/qyft/gd/system/config/WebSocketConfig.java delete mode 100644 src/main/java/com/qyft/gd/system/controller/WebSocketController.java diff --git a/src/main/java/com/qyft/gd/common/constant/Commands.java b/src/main/java/com/qyft/gd/common/constant/Commands.java new file mode 100644 index 0000000..7f6f666 --- /dev/null +++ b/src/main/java/com/qyft/gd/common/constant/Commands.java @@ -0,0 +1,92 @@ +package com.qyft.gd.common.constant; + +/** + * 操作指令 + */ +public class Commands { + /** + * 抬起托盘 + */ + public static final String UP_TRAY = "upTray"; + + /** + * 降下托盘 + */ + public static final String DOWN_TRAY = "downTray"; + + /** + * 添加溶液 + */ + public static final String INJECT_FLUID = "injectFluid"; + + /** + * 恒温 + */ + public static final String KEEP_HEAT = "keepHeat"; + + /** + * 移至加液 + */ + public static final String MOVE_TO_ACTION_AREA = "moveToActionArea"; + + /** + * 检查加液位状态(是否被占用) + */ + public static final String CHECK_ACTION_AREA = "checkActionArea"; + + /** + * 摇匀试管架 + */ + public static final String SHAKE_UP = "shakeUp"; + + /** + * 开始加热 + */ + public static final String START_HEAT = "startHeat"; + + /** + * 停止加热 + */ + public static final String STOP_HEAT = "stopHeat"; + + /** + * 拍照 + */ + public static final String TAKE_PHOTO = "takePhoto"; + + /** + * 移至异常区 + */ + public static final String MOVE_TO_UNUSUAL = "moveToUnusual"; + + /** + * 从异常区移回加热区 + */ + public static final String MOVE_TO_HEAT_AREA = "moveToHeatArea"; + + /** + * 取试管架盖 + */ + public static final String TAKE_OFF_CAP = "takeOffCap"; + + /** + * 装回试管架盖 + */ + public static final String PUT_BACK_CAP = "putBackCap"; + + /** + * 机械臂移动至指定坐标(x, y, z) + */ + public static final String MOVE_MACHINE_ARM = "moveMachineArm"; + + /** + * 获取当前某种溶液的数量 + */ + public static final String GET_LIQUID_AMOUNT = "getLiquidAmount"; + + /** + * 移动单个试管 + */ + public static final String MOVE_TUBE = "moveTube"; + +} diff --git a/src/main/java/com/qyft/gd/common/result/CMDResultCode.java b/src/main/java/com/qyft/gd/common/result/CMDResultCode.java new file mode 100644 index 0000000..b2294f8 --- /dev/null +++ b/src/main/java/com/qyft/gd/common/result/CMDResultCode.java @@ -0,0 +1,28 @@ +package com.qyft.gd.common.result; + +import com.qyft.gd.system.common.result.IResultCode; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@AllArgsConstructor +@NoArgsConstructor +public enum CMDResultCode implements IResultCode, Serializable { + SUCCESS("D0000", "执行完毕"), + FAILURE("D0000", "执行失败"); + + @Override + public String getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } + + private String code; + + private String msg; +} \ No newline at end of file diff --git a/src/main/java/com/qyft/gd/config/WebSocketConfig.java b/src/main/java/com/qyft/gd/config/WebSocketConfig.java new file mode 100644 index 0000000..81049f1 --- /dev/null +++ b/src/main/java/com/qyft/gd/config/WebSocketConfig.java @@ -0,0 +1,30 @@ +package com.qyft.gd.config; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +@RequiredArgsConstructor +@Slf4j +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 配置消息代理 + registry.enableSimpleBroker("/topic"); // 消息广播前缀 + registry.setApplicationDestinationPrefixes("/app"); // 客户端发送消息的前缀 + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + // 使用相对路径注册 WebSocket 端点 + registry.addEndpoint("/ws") + .setAllowedOriginPatterns("*") + .withSockJS(); + } +} diff --git a/src/main/java/com/qyft/gd/controller/CMDController.java b/src/main/java/com/qyft/gd/controller/CMDController.java new file mode 100644 index 0000000..a762ce9 --- /dev/null +++ b/src/main/java/com/qyft/gd/controller/CMDController.java @@ -0,0 +1,46 @@ +package com.qyft.gd.controller; + +import cn.hutool.json.JSONUtil; +import com.qyft.gd.model.form.CMDForm; +import com.qyft.gd.service.CMDService; +import com.qyft.gd.system.common.result.Result; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.UUID; + +@Tag(name = "控制指令") +@RestController +@RequestMapping("/api/cmd") +@RequiredArgsConstructor +@Slf4j +public class CMDController { + + private final CMDService cmdService; + + @Operation(summary = "发送指令") + @PostMapping("/") + public Result send(@RequestBody CMDForm cmdForm) { + try { + String commandId = UUID.randomUUID().toString(); + if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) { + cmdForm.setCommandId(commandId); + } + log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm)); + if (cmdService.executeCommand(cmdForm)) { + return Result.success(commandId); + } else { + return Result.failed("无效命令"); + } + } catch (Exception e) { + log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e); + return Result.failed("执行失败"); + } + } +} diff --git a/src/main/java/com/qyft/gd/controller/WebSocketController.java b/src/main/java/com/qyft/gd/controller/WebSocketController.java new file mode 100644 index 0000000..d4b5f50 --- /dev/null +++ b/src/main/java/com/qyft/gd/controller/WebSocketController.java @@ -0,0 +1,25 @@ +package com.qyft.gd.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Controller; + +import java.security.Principal; + +@Controller +@RequiredArgsConstructor +@Slf4j +public class WebSocketController { + private final SimpMessagingTemplate messagingTemplate; + + @MessageMapping("/hello") + @SendTo("/topic/greetings") + public String sendGreeting(String message) throws Exception { + // 处理收到的消息并发送到主题 "/topic/greetings" + return "Hello, " + message; + } + +} diff --git a/src/main/java/com/qyft/gd/device/service/DeviceService.java b/src/main/java/com/qyft/gd/device/service/DeviceService.java new file mode 100644 index 0000000..3f5273e --- /dev/null +++ b/src/main/java/com/qyft/gd/device/service/DeviceService.java @@ -0,0 +1,10 @@ +package com.qyft.gd.device.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DeviceService { + +} diff --git a/src/main/java/com/qyft/gd/model/form/CMDForm.java b/src/main/java/com/qyft/gd/model/form/CMDForm.java new file mode 100644 index 0000000..961f845 --- /dev/null +++ b/src/main/java/com/qyft/gd/model/form/CMDForm.java @@ -0,0 +1,23 @@ +package com.qyft.gd.model.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.util.Map; + +@Schema(description = "指令") +@Data +public class CMDForm { + + @Schema(description = "指令id,不指定后台会自动生成uuid") + private String commandId; + + @NotBlank() + @Schema(description = "指令类型", example = "upTray") + private String command; + + @Schema(description = "参数") + private Map params; + +} diff --git a/src/main/java/com/qyft/gd/model/vo/ExecutionResult.java b/src/main/java/com/qyft/gd/model/vo/ExecutionResult.java new file mode 100644 index 0000000..7aa004f --- /dev/null +++ b/src/main/java/com/qyft/gd/model/vo/ExecutionResult.java @@ -0,0 +1,20 @@ +package com.qyft.gd.model.vo; + +import lombok.Data; + +@Data +public class ExecutionResult { + /** + * 任务id + */ + private String commandId; + /** + * 执行结果 + */ + private String status; + /** + * 结果描述 + */ + private String message; + +} diff --git a/src/main/java/com/qyft/gd/service/CMDService.java b/src/main/java/com/qyft/gd/service/CMDService.java new file mode 100644 index 0000000..1aed353 --- /dev/null +++ b/src/main/java/com/qyft/gd/service/CMDService.java @@ -0,0 +1,41 @@ +package com.qyft.gd.service; + +import com.qyft.gd.common.constant.Commands; +import com.qyft.gd.common.result.CMDResultCode; +import com.qyft.gd.device.service.DeviceService; +import com.qyft.gd.model.form.CMDForm; +import com.qyft.gd.model.vo.ExecutionResult; +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CMDService { + + DeviceService deviceService; + + private final SimpMessagingTemplate messagingTemplate; + + public boolean executeCommand(CMDForm cmdForm) { + switch (cmdForm.getCommand()) { + case Commands.UP_TRAY: + upTray(cmdForm); + break; + case Commands.DOWN_TRAY: + break; + default: + return false; + } + return true; + } + + private void upTray(CMDForm cmdForm) { + ExecutionResult executionResult = new ExecutionResult(); + executionResult.setCommandId(cmdForm.getCommandId()); + executionResult.setStatus(CMDResultCode.SUCCESS.getCode()); + executionResult.setMessage(CMDResultCode.SUCCESS.getMsg()); + messagingTemplate.convertAndSend("/topic/cmd", executionResult); + } + +} diff --git a/src/main/java/com/qyft/gd/system/config/WebSocketConfig.java b/src/main/java/com/qyft/gd/system/config/WebSocketConfig.java deleted file mode 100644 index 663c17a..0000000 --- a/src/main/java/com/qyft/gd/system/config/WebSocketConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.qyft.gd.system.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; -import org.springframework.web.socket.config.annotation.StompEndpointRegistry; -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; - -@Configuration -@EnableWebSocketMessageBroker -@RequiredArgsConstructor -@Slf4j -public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - @Override - public void configureMessageBroker(MessageBrokerRegistry registry) { - // 配置消息代理 - registry.enableSimpleBroker("/topic"); // 消息广播前缀 - registry.setApplicationDestinationPrefixes("/app"); // 客户端发送消息的前缀 - } - - @Override - public void registerStompEndpoints(StompEndpointRegistry registry) { - // 使用相对路径注册 WebSocket 端点 - registry.addEndpoint("/ws") - .setAllowedOriginPatterns("*") - .withSockJS(); - } -} diff --git a/src/main/java/com/qyft/gd/system/controller/WebSocketController.java b/src/main/java/com/qyft/gd/system/controller/WebSocketController.java deleted file mode 100644 index 75aecc1..0000000 --- a/src/main/java/com/qyft/gd/system/controller/WebSocketController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.qyft.gd.system.controller; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.messaging.handler.annotation.MessageMapping; -import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.stereotype.Controller; - -@Controller -@RequiredArgsConstructor -@Slf4j -public class WebSocketController { - - @MessageMapping("/hello") - @SendTo("/topic/greetings") - public String sendGreeting(String message) throws Exception { - // 处理收到的消息并发送到主题 "/topic/greetings" - return "Hello, " + message; - } -}