From ab55c60112c72fcfe7836a91a278f316cddd7c00 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Thu, 20 Feb 2025 16:58:07 +0800
Subject: [PATCH] 添加无人机控制权申请、处理、释放
---
ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java | 26 +++++++++++++++-----------
ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java | 5 ++---
ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java | 5 +++++
ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java | 4 ++--
ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java | 3 ---
5 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java b/ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java
index f32b4c3..d08e499 100644
--- a/ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java
+++ b/ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java
@@ -1,5 +1,10 @@
package com.ard.common.exception;
+/**
+ * 无人机权限异常
+ *
+ * @author ruoyi
+ */
public class NoPermissionException extends RuntimeException {
public NoPermissionException(String message) {
super(message);
diff --git a/ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java b/ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java
index 4726437..7ec6163 100644
--- a/ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java
+++ b/ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java
@@ -57,8 +57,8 @@
String boxSn = getBoxSn(arg);
if (boxSn != null) {
//判断无人机控制者是否为当前登录用户
- Long currentControllerId = UavControlManager.droneControlMap.get(boxSn);
- if (currentControllerId != null && currentControllerId.equals(SecurityUtils.getUserId())) {
+ Long controller = UavControlManager.droneControlMap.get(boxSn);
+ if (controller != null && controller.equals(SecurityUtils.getUserId())) {
return true;
}
}
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java b/ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java
index 31d6be5..908a009 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java
+++ b/ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java
@@ -3,7 +3,7 @@
import com.alibaba.fastjson2.JSON;
import com.ard.common.exception.NoPermissionException;
import com.ard.common.utils.SecurityUtils;
-import com.ard.tianyu.websocket.domain.ControlRequestMessage;
+import com.ard.tianyu.websocket.domain.ControlMessage;
import com.ard.tianyu.websocket.domain.WsMessage;
import com.ard.tianyu.websocket.utils.WebSocketUtil;
import lombok.extern.slf4j.Slf4j;
@@ -22,14 +22,14 @@
public static final ConcurrentHashMap<String, Long> controlRequestMap = new ConcurrentHashMap<>();
// 发送通知(通过 WebSocket推送)
- public void notifyMessage(String boxSn, String action, Long controller, Long requester) {
- ControlRequestMessage controlRequestMessage = ControlRequestMessage.builder()
+ public void notifyMessage(String boxSn, String action, Long source, Long target) {
+ ControlMessage controlMessage = ControlMessage.builder()
.boxSn(boxSn)
- .requester(requester)
+ .userId(source)
.action(action)
.build();
- WsMessage<ControlRequestMessage> wsMessage = new WsMessage<>("controlRequest", controlRequestMessage);
- WebSocketUtil.sendMessage(controller.toString(), JSON.toJSONString(wsMessage));
+ WsMessage<ControlMessage> wsMessage = new WsMessage<>("controlRequest", controlMessage);
+ WebSocketUtil.sendMessage(target.toString(), JSON.toJSONString(wsMessage));
}
// 申请控制
@@ -42,11 +42,13 @@
}
// 如果无人机已经有控制者,则发送申请给当前控制者
Long controller = droneControlMap.get(boxSn);
- if(!controller.equals(requester)) {
+ if (!controller.equals(requester)) {
// 则将控制请求加入请求队列
controlRequestMap.put(boxSn, requester);
// 通知当前控制者,有新的控制请求
- notifyMessage(boxSn, "request", controller, requester);
+ notifyMessage(boxSn, "request", requester, controller);
+ } else {
+ throw new NoPermissionException("当前已经获取控制权,无需重复申请");
}
return false; // 等待当前控制者的同意
}
@@ -60,15 +62,17 @@
if (approve) {
// 同意控制,将控制权赋予请求者
droneControlMap.put(boxSn, requester);
- notifyMessage(boxSn, "approve", requester, controller);
+ notifyMessage(boxSn, "approve", controller, requester);
} else {
- notifyMessage(boxSn, "reject", requester, controller);
+ notifyMessage(boxSn, "reject", controller, requester);
}
// 无论同意还是拒绝,都移除控制请求
controlRequestMap.remove(boxSn);
return true;
}
- return false;
+ else {
+ throw new NoPermissionException("无申请不需要处理控制权");
+ }
}
// 释放控制
diff --git a/ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlRequestMessage.java b/ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java
similarity index 72%
rename from ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlRequestMessage.java
rename to ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java
index db12a5b..c3ad0a7 100644
--- a/ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlRequestMessage.java
+++ b/ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java
@@ -9,11 +9,10 @@
@Builder
@AllArgsConstructor
@NoArgsConstructor
-public class ControlRequestMessage {
+public class ControlMessage {
private String boxSn; // 盒子编号
- private Long controller; // 当前控制者ID
- private Long requester; // 请求控制者ID
+ private Long userId; // 消息发送者
private String action; // 操作类型:request(请求),approve(同意),reject(拒绝)
}
diff --git a/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java b/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
index 09a708e..6c6f007 100644
--- a/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
+++ b/ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
@@ -1,9 +1,6 @@
package com.ard.tianyu.websocket.handler;
-import com.ard.tianyu.websocket.domain.ControlRequestMessage;
-import com.ard.tianyu.websocket.domain.WsMessage;
import com.ard.tianyu.websocket.utils.WebSocketUtil;
-import com.ard.tianyu.websocket.utils.WsMessageConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
--
Gitblit v1.9.3