Browse Source

与前端的ws通信,接收前端指令

master
白凤吉 6 months ago
parent
commit
7c8ca9ac70
  1. 92
      src/main/java/com/qyft/gd/common/constant/Commands.java
  2. 28
      src/main/java/com/qyft/gd/common/result/CMDResultCode.java
  3. 2
      src/main/java/com/qyft/gd/config/WebSocketConfig.java
  4. 46
      src/main/java/com/qyft/gd/controller/CMDController.java
  5. 7
      src/main/java/com/qyft/gd/controller/WebSocketController.java
  6. 10
      src/main/java/com/qyft/gd/device/service/DeviceService.java
  7. 23
      src/main/java/com/qyft/gd/model/form/CMDForm.java
  8. 20
      src/main/java/com/qyft/gd/model/vo/ExecutionResult.java
  9. 41
      src/main/java/com/qyft/gd/service/CMDService.java

92
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";
}

28
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;
}

2
src/main/java/com/qyft/gd/system/config/WebSocketConfig.java → src/main/java/com/qyft/gd/config/WebSocketConfig.java

@ -1,4 +1,4 @@
package com.qyft.gd.system.config;
package com.qyft.gd.config;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

46
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<String> 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("执行失败");
}
}
}

7
src/main/java/com/qyft/gd/system/controller/WebSocketController.java → src/main/java/com/qyft/gd/controller/WebSocketController.java

@ -1,15 +1,19 @@
package com.qyft.gd.system.controller;
package com.qyft.gd.controller;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import java.security.Principal;
@Controller @Controller
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class WebSocketController { public class WebSocketController {
private final SimpMessagingTemplate messagingTemplate;
@MessageMapping("/hello") @MessageMapping("/hello")
@SendTo("/topic/greetings") @SendTo("/topic/greetings")
@ -17,4 +21,5 @@ public class WebSocketController {
// 处理收到的消息并发送到主题 "/topic/greetings" // 处理收到的消息并发送到主题 "/topic/greetings"
return "Hello, " + message; return "Hello, " + message;
} }
} }

10
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 {
}

23
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<String, Object> params;
}

20
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;
}

41
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);
}
}
Loading…
Cancel
Save