WebSocketController.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package com.ruoyi.websocket.controller;
  2. import com.ruoyi.common.core.domain.AjaxResult;
  3. import io.swagger.annotations.Api;
  4. import io.swagger.annotations.ApiOperation;
  5. import io.swagger.annotations.ApiParam;
  6. import org.springframework.messaging.handler.annotation.MessageMapping;
  7. import org.springframework.messaging.handler.annotation.Payload;
  8. import org.springframework.messaging.handler.annotation.SendTo;
  9. import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
  10. import org.springframework.web.bind.annotation.*;
  11. import com.alibaba.fastjson2.JSONObject;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. import java.util.concurrent.ConcurrentHashMap;
  15. /**
  16. * WebSocket控制器
  17. * 处理前端通过WebSocket发送的消息(如订阅设备、发送指令等)
  18. */
  19. @Api(tags = "WebSocket机器人控制")
  20. @RestController
  21. @RequestMapping("/ws/robot")
  22. public class WebSocketController {
  23. /**
  24. * 记录当前连接的设备ID(设备ID -> SessionID)
  25. */
  26. private final Map<String, String> deviceSessions = new ConcurrentHashMap<>();
  27. /**
  28. * 测试WebSocket连接是否正常
  29. */
  30. @ApiOperation("测试WebSocket连接")
  31. @GetMapping("/test")
  32. public AjaxResult test() {
  33. return AjaxResult.success("WebSocket连接正常", null);
  34. }
  35. /**
  36. * 客户端通过WebSocket发送消息(STOMP协议)
  37. * 客户端发送格式:/app/message
  38. * { "deviceId": "ld000001", "action": "subscribe", "data": {} }
  39. */
  40. @ApiOperation("处理WebSocket消息")
  41. @MessageMapping("/message")
  42. @SendTo("/topic/robot/response")
  43. public Map<String, Object> handleMessage(
  44. @Payload Map<String, Object> message,
  45. SimpMessageHeaderAccessor headerAccessor
  46. ) {
  47. Map<String, Object> response = new HashMap<>();
  48. String deviceId = (String) message.get("deviceId");
  49. String action = (String) message.get("action");
  50. response.put("success", true);
  51. response.put("deviceId", deviceId);
  52. response.put("action", action);
  53. response.put("timestamp", System.currentTimeMillis());
  54. // 记录设备会话
  55. if (deviceId != null && headerAccessor.getSessionId() != null) {
  56. deviceSessions.put(deviceId, headerAccessor.getSessionId());
  57. response.put("message", "设备 " + deviceId + " 已注册");
  58. }
  59. return response;
  60. }
  61. /**
  62. * 注册设备(HTTP接口,用于前端主动注册)
  63. */
  64. @ApiOperation("注册设备连接")
  65. @PostMapping("/register")
  66. public AjaxResult registerDevice(
  67. @ApiParam("设备ID") @RequestParam String deviceId,
  68. @ApiParam("会话ID") @RequestParam(required = false) String sessionId
  69. ) {
  70. if (sessionId != null) {
  71. deviceSessions.put(deviceId, sessionId);
  72. }
  73. return AjaxResult.success("设备注册成功", deviceId);
  74. }
  75. /**
  76. * 获取当前在线的设备列表
  77. */
  78. @ApiOperation("获取在线设备列表")
  79. @GetMapping("/online")
  80. public AjaxResult getOnlineDevices() {
  81. return AjaxResult.success(deviceSessions.keySet());
  82. }
  83. /**
  84. * 心跳检测
  85. */
  86. @ApiOperation("心跳检测")
  87. @PostMapping("/ping")
  88. public AjaxResult ping(@ApiParam("设备ID") @RequestParam String deviceId) {
  89. Map<String, Object> data = new HashMap<>();
  90. data.put("deviceId", deviceId);
  91. data.put("status", "online");
  92. data.put("timestamp", System.currentTimeMillis());
  93. return AjaxResult.success("心跳正常", data);
  94. }
  95. }