diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 28e66c7..2038832 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -6,21 +6,14 @@
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
@@ -40,6 +33,11 @@
+
@@ -79,40 +77,40 @@
- {
- "keyToString": {
- "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
- "Application.test.executor": "Debug",
- "HTTP Request.MiddlePlatformApplication | #1.executor": "Run",
- "HTTP Request.MiddlePlatformApplication | #2.executor": "Run",
- "HTTP Request.MiddlePlatformApplication | #3.executor": "Run",
- "Maven.MiddlePlatform [clean].executor": "Run",
- "Maven.MiddlePlatform [install].executor": "Run",
- "Maven.maibu-netty-server [clean].executor": "Run",
- "ModuleVcsDetector.initialDetectionPerformed": "true",
- "RequestMappingsPanelOrder0": "0",
- "RequestMappingsPanelOrder1": "1",
- "RequestMappingsPanelWidth0": "75",
- "RequestMappingsPanelWidth1": "75",
- "RunOnceActivity.MCP Project settings loaded": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
- "RunOnceActivity.git.unshallow": "true",
- "RunOnceActivity.typescript.service.memoryLimit.init": "true",
- "Spring Boot.MiddlePlatformApplication.executor": "Debug",
- "git-widget-placeholder": "main",
- "kotlin-language-version-configured": "true",
- "last_opened_file_path": "/home/maibu/Test/MiddlePlatform/maibu-external/src/main/java/com/maibu/uav",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "onboarding.tips.debug.path": "D:/code/MiddlePlatform/maibu-service/maibu-system-service/src/main/java/com/maibu/Main.java",
- "settings.editor.selected.configurable": "project.propVCSSupport.CommitDialog",
- "vue.rearranger.settings.migration": "true"
+
+}]]>
@@ -190,17 +188,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -725,7 +712,7 @@
file://$PROJECT_DIR$/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/IOTWorkOrderController.java
58
-
+
diff --git a/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java b/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java
index fafdb05..5e2d945 100644
--- a/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java
+++ b/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java
@@ -58,8 +58,8 @@ public class NettyDevice extends Connector {
// todo 注册的时候更新 siteId
private Device device;
- //todo 假如设置一个当前控制的token
- private String currentControlToken;
+ //todo 当前登录的账号的token 以token为控制的权限
+ private String token;
@JsonIgnore
private DevicePlanTaskMapper devicePlanTaskMapper = SpringUtils.getBean(DevicePlanTaskMapper.class);
diff --git a/maibu-common/src/main/java/com/maibu/memory/DeviceSessionManager.java b/maibu-common/src/main/java/com/maibu/memory/DeviceSessionManager.java
index 3bf3056..1397845 100644
--- a/maibu-common/src/main/java/com/maibu/memory/DeviceSessionManager.java
+++ b/maibu-common/src/main/java/com/maibu/memory/DeviceSessionManager.java
@@ -30,6 +30,9 @@ public class DeviceSessionManager {
// 设备ID -> 设备对象(业务实体)
private final ConcurrentHashMap deviceMap = new ConcurrentHashMap<>();
+ //当前设备的控制权在哪 登录的账号 deviceId(下位机) -> token key 唯一保证一个deviceId 只有一个控制权
+ private final ConcurrentHashMap controllerMap = new ConcurrentHashMap<>();
+
// 设备ID -> Channel(通信通道)
private final ConcurrentHashMap channelMap = new ConcurrentHashMap<>();
@@ -105,6 +108,64 @@ public class DeviceSessionManager {
return deviceMap.get(deviceId);
}
+ /**
+ * 获取有控制权的 客户端
+ */
+ public String getMaster(String deviceId) {
+ return controllerMap.get(deviceId);
+ }
+
+ /**
+ * 获取客户端当前 控制的设备
+ */
+ public String getControl(String token) {
+ for (String key : controllerMap.keySet()) {
+ if (controllerMap.get(key).equals(token)) {
+ return controllerMap.get(token);
+ }
+ }
+ return null;
+ }
+
+ public void lock(String deviceId, String token) {
+ if (!StringUtils.isEmpty(deviceId) && !StringUtils.isEmpty(token)) {
+ controllerMap.put(deviceId, token);
+ }
+ }
+
+
+ public boolean unLock(String token) {
+ if (!StringUtils.isEmpty(token)) {
+ Iterator iterator = controllerMap.keySet().iterator();
+ while (iterator.hasNext()) {
+ String key = iterator.next();
+ if (controllerMap.get(key).equals(token)) {
+ iterator.remove();
+ }
+ }
+ }
+ return true;
+ }
+
+ public boolean unLock(String deviceId, String token, boolean force) {
+ if (!StringUtils.isEmpty(deviceId)) {
+ if (force) {
+ controllerMap.remove(deviceId);
+ return true;
+ } else {
+ String nowToken = controllerMap.get(deviceId);
+ if (!StringUtils.isEmpty(token) && nowToken.equals(token)) {
+ controllerMap.remove(deviceId);
+ return true;
+ }
+
+ }
+ }
+ return false;
+
+ }
+
+
// 模糊匹配
public List getDevicesLike(String query) {
return deviceMap.values().stream()
diff --git a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceBindDTO.java b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceBindDTO.java
index 6853ad4..467768d 100644
--- a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceBindDTO.java
+++ b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceBindDTO.java
@@ -24,4 +24,6 @@ public class DeviceBindDTO {
private Integer type; // releaseControl 1 完全释放 2 释放控制权 可监听数据
+ private String token;
+
}
diff --git a/maibu-netty-server/src/main/java/com/maibu/netty/handler/CommandForwardHandler.java b/maibu-netty-server/src/main/java/com/maibu/netty/handler/CommandForwardHandler.java
index 2575929..c6c6ca1 100644
--- a/maibu-netty-server/src/main/java/com/maibu/netty/handler/CommandForwardHandler.java
+++ b/maibu-netty-server/src/main/java/com/maibu/netty/handler/CommandForwardHandler.java
@@ -64,6 +64,12 @@ public class CommandForwardHandler extends SimpleChannelInboundHandler {
}
if (ConnectorType.MASTER.equals(senderNettyDevice.getDeviceType())) {
+
+
+
+ //TODO 有控制权才能发
+
+
Set connectedDevices = senderNettyDevice.getConnectedConnectors();
if (connectedDevices == null || connectedDevices.isEmpty()) {
logger.debug("发送拒绝master:{},该设备没有关联的设备", senderDeviceId);
diff --git a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java
index 9544cdb..81c1ff6 100644
--- a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java
+++ b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java
@@ -115,6 +115,8 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
logger.info("{}: 设备断开 status: {}", deviceId, ConnectorStatus.DISABLED);
// updateLogoutSingle(deviceId);
// todo 自动切换到其他?
+
+ sessionManager.unLock(deviceId);
}
if (nettyDevice != null && nettyDevice.getDeviceType() == ConnectorType.SLAVE) {
nettyDevice.setOnlineStatus(0);
@@ -155,7 +157,7 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
}
@Override
- protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
+ protected void channelRead0(ChannelHandlerContext ctx, String msg) {
try {
byte[] bytes = Hex.decodeHex(msg.toCharArray());
@@ -181,86 +183,11 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
logger.info("上位机连接 sessionId: {}", sessionId);
logger.info("上位机连接 userName: {}", userName);
logger.info("上位机连接 type: {}", parts[1]);
- SysUser sysUser = userService.selectUserByUserName(userName);
- if (sysUser != null) {
- sysUserClientService.insertUserClient(sysUser.getUserId(), userName, deviceId, "", 0);
- }
- // 如果 当前角色存在sessionId同时和当前的穿过来不同则下发剔除指令
- boolean t = false;
- if (StringUtils.isEmpty(sessionId) || sysUser == null) {
- t = true;
- }
- if (sysUser != null && !StringUtils.isEmpty(sessionId)
- && !StringUtils.isEmpty(sysUser.getSessionId())) {
- if (!sysUser.getSessionId().equals(sessionId)) {
- t = true;
- }
- }
- if (t) {
- // 发送已登录状态到客户端
- if ("web".equals(parts[1])) {
- NettyDevice device = sessionManager.getDevice(deviceId);
- logger.info("web 上位机连接重连: {}", JsonUtils.toJsonString(device));
- if (device != null && !StringUtils.isEmpty(device.getCurrentSlaveId())) {
- logger.info("上位机连接重连: {}", deviceId);
- } else {
- // 判断是否账号在控制空 如果在控制设置账号为非active
- List userClients = sysUserClientService
- .selectUserClientByUserName(userName);
- ConnectorStatus status = ConnectorStatus.ACTIVE;
- logger.info("web 上位机连接重连2: {}", JsonUtils.toJsonString(userClients));
- UserClient nowClient = null;
- if (!CollectionUtils.isEmpty(userClients)) {
- long count = userClients.stream().filter(
- x -> x.getIsAlive() == 1 && !deviceId.equals(x.getClientName()))
- .count();
- if (count > 0) {
- status = ConnectorStatus.RECEIVER;
- }
- nowClient = userClients.stream().filter(
- x -> x.getIsAlive() == 1 && deviceId.equals(x.getClientName()))
- .findFirst().orElse(null);
- }
- logger.info("web 上位机连接重连3: {}", JsonUtils.toJsonString(status));
- if (!ConnectorStatus.ACTIVE.equals(status)) {
- handleMasterConnect(ctx, deviceId, null, status);
- } else {
- logger.info("web 上位机连接重连4: {}", JsonUtils.toJsonString(nowClient));
- if (nowClient != null) {
- handleMasterConnect(ctx, deviceId, nowClient.getDeviceName(), status);
- } else {
- handleMasterConnect(ctx, deviceId, null, status);
- }
- }
- }
- } else {
- DeviceLoginResponseDTO responseDTO = new DeviceLoginResponseDTO();
- responseDTO.setRespond(RespondCode.have_logged_in);
- ByteBuf buf = ctx.alloc().buffer();
- CommandUtils.buildCommand(buf, responseDTO, CommandConstant.interaction);
- ctx.channel().writeAndFlush(buf);
- }
- } else {
- // 判断是否账号在控制空 如果在控制设置账号为非active
- List userClients = sysUserClientService
- .selectUserClientByUserName(userName);
- ConnectorStatus status = ConnectorStatus.ACTIVE;
- if (!CollectionUtils.isEmpty(userClients)) {
- long count = userClients.stream()
- .filter(x -> x.getIsAlive() == 1 && !deviceId.equals(x.getClientName()))
- .count();
- if (count > 0) {
- status = ConnectorStatus.RECEIVER;
- }
- }
- logger.info("上位机上线:{}", status);
- // if (ConnectorStatus.ACTIVE.equals(status)) {
- // //todo 设置当前控制的token
- // sysUser.setSessionId(sessionId);
- // userService.updateUserProfile(sysUser);
- // }
- handleMasterConnect(ctx, deviceId, null, status);
+ NettyDevice masterDevice = sessionManager.getDevice(sessionId);
+ if (masterDevice == null) {
+// sessionManager.getControl(sessionId);
+ handleMasterConnect(ctx, sessionId, null, ConnectorStatus.ACTIVE);
}
}
} else {
@@ -428,17 +355,19 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
logger.info("12指令切换权限,c:{}", c.getConnectorId());
if (!c.getConnectorId().equals(masterId)) {
// c.setCurrentSlaveId(null);
- c.removeConnectedDevice(slaveDevice);
+// c.removeConnectedDevice(slaveDevice);
c.setConnectorStatus(ConnectorStatus.RECEIVER);
- sysUserClientService.updateAliveStatus(c.getConnectorId(), slaveId, 2);
+ sessionManager.unLock(c.getConnectorId());
+// sysUserClientService.updateAliveStatus(c.getConnectorId(), slaveId, 2);
}
});
}
logger.info("12指令解析,切换权限,slaveId:{},masterId :{}", slaveId, masterId);
+ sessionManager.lock(slaveId, masterId);
masterDevice.setCurrentSlaveId(slaveId);
masterDevice.setConnectorStatus(ConnectorStatus.ACTIVE);
masterDevice.addConnectedDevice(slaveDevice);
- sysUserClientService.updateAliveStatus(masterDevice.getConnectorId(), slaveId, 1);
+// sysUserClientService.updateAliveStatus(masterDevice.getConnectorId(), slaveId, 1);
} else {
logger.info("权限切换请求被拒绝");
}
@@ -469,6 +398,74 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
}
}
+// /**
+// * 找到当前设备控制的主机 转发控制请求
+// */
+// private void handlePermissionRequest(DeviceRequestDTO requestDTO, byte[] bytes, ChannelHandlerContext ctx) {
+// logger.info("转发控制请求 :{}", JsonUtils.toJsonString(requestDTO));
+// String slaveId = requestDTO.getDeviceId();
+// List controlList = sessionManager.getSlaveControl(slaveId);
+// String masterId = requestDTO.getUserId() + ":" + requestDTO.getPlatform();
+// logger.info("转发控制请求 controlList :{}", JsonUtils.toJsonString(controlList));
+// if (!CollectionUtils.isEmpty(controlList)) {
+// // 如果当前设备有控制
+// logger.info("转发控制请求 发送报文");
+// NettyDevice controlDevice = controlList.get(0);
+// if (controlDevice != null && controlDevice.getChannel() != null && controlDevice.getChannel().isActive()) {
+// controlDevice.getChannel().writeAndFlush(Unpooled.wrappedBuffer(bytes));
+// logger.info("转发控制请求 发送报文结束 deviceId :{}", controlDevice.getConnectorId());
+// controlRequestMap.put(masterId, slaveId);
+// logger.info("转发控制请求 controlRequestMap:{}", JsonUtils.toJsonString(controlRequestMap));
+// }
+//
+// } else {
+// // 判断直接给权限 还是 判断是否有该账号其他端的的控制有权限
+// NettyDevice activeDevice = sessionManager.getUserControl(requestDTO.getUserId());
+// boolean sendMes = true;
+// if (activeDevice == null) {
+// sendMes = false;
+// } else {
+// if (activeDevice.getConnectorId().equals(masterId)) {
+// sendMes = false;
+// }
+// }
+// if (sendMes) {
+// if (activeDevice.getChannel() != null && activeDevice.getChannel().isActive()) {
+// activeDevice.getChannel().writeAndFlush(Unpooled.wrappedBuffer(bytes));
+// logger.info("转发控制请求2 发送报文结束 deviceId :{}", activeDevice.getConnectorId());
+// controlRequestMap.put(masterId, slaveId);
+// logger.info("转发控制请求2 controlRequestMap:{}", JsonUtils.toJsonString(controlRequestMap));
+// }
+// } else {
+// NettyDevice masterDevice = sessionManager.getDevice(masterId);
+// if (masterDevice != null) {
+// NettyDevice slaveDevice = sessionManager.getDevice(slaveId);
+// masterDevice.setCurrentSlaveId(slaveId);
+// masterDevice.setConnectorStatus(ConnectorStatus.ACTIVE);
+// masterDevice.addConnectedDevice(slaveDevice);
+//
+// sysUserClientService.updateAliveStatus(masterDevice.getConnectorId(), slaveId, 1);
+// if (masterDevice.getChannel() != null && masterDevice.getChannel().isActive()) {
+// DeviceRequestDTO reDto = new DeviceRequestDTO();
+// reDto.setPlatform(requestDTO.getPlatform());
+// DeviceRespondDTO respond = new DeviceRespondDTO();
+// respond.setSwitchResult(true);
+// respond.setHolder("you");
+// respond.setDeviceId(slaveId);
+// reDto.setRespond(respond);
+// ByteBuf buf = ctx.alloc().buffer();
+// CommandUtils.buildCommand(buf, reDto, CommandConstant.interaction);
+// String content = buf.toString(CharsetUtil.UTF_8);
+// masterDevice.getChannel().writeAndFlush(buf);
+// logger.info("转发控制请求设置当前控制2 发送报文:{} deviceId :{}", content, masterId);
+// }
+// } else {
+//
+// }
+// }
+// }
+// }
+
/**
* 找到当前设备控制的主机 转发控制请求
*/
@@ -476,62 +473,43 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler {
logger.info("转发控制请求 :{}", JsonUtils.toJsonString(requestDTO));
String slaveId = requestDTO.getDeviceId();
List controlList = sessionManager.getSlaveControl(slaveId);
- String masterId = requestDTO.getUserId() + ":" + requestDTO.getPlatform();
+ String token = requestDTO.getToken();
+// String masterId = requestDTO.getUserId() + ":" + requestDTO.getPlatform();
logger.info("转发控制请求 controlList :{}", JsonUtils.toJsonString(controlList));
- if (!CollectionUtils.isEmpty(controlList)) {
+
+ String master = sessionManager.getMaster(slaveId);
+ if (!StringUtils.isEmpty(master)) {
// 如果当前设备有控制
logger.info("转发控制请求 发送报文");
- NettyDevice controlDevice = controlList.get(0);
+ NettyDevice controlDevice = sessionManager.getDevice(master);
if (controlDevice != null && controlDevice.getChannel() != null && controlDevice.getChannel().isActive()) {
controlDevice.getChannel().writeAndFlush(Unpooled.wrappedBuffer(bytes));
logger.info("转发控制请求 发送报文结束 deviceId :{}", controlDevice.getConnectorId());
- controlRequestMap.put(masterId, slaveId);
+ controlRequestMap.put(token, slaveId);
logger.info("转发控制请求 controlRequestMap:{}", JsonUtils.toJsonString(controlRequestMap));
}
-
} else {
- // 判断直接给权限 还是 判断是否有该账号其他端的的控制有权限
- NettyDevice activeDevice = sessionManager.getUserControl(requestDTO.getUserId());
- boolean sendMes = true;
- if (activeDevice == null) {
- sendMes = false;
- } else {
- if (activeDevice.getConnectorId().equals(masterId)) {
- sendMes = false;
- }
- }
- if (sendMes) {
- if (activeDevice.getChannel() != null && activeDevice.getChannel().isActive()) {
- activeDevice.getChannel().writeAndFlush(Unpooled.wrappedBuffer(bytes));
- logger.info("转发控制请求2 发送报文结束 deviceId :{}", activeDevice.getConnectorId());
- controlRequestMap.put(masterId, slaveId);
- logger.info("转发控制请求2 controlRequestMap:{}", JsonUtils.toJsonString(controlRequestMap));
- }
- } else {
- NettyDevice masterDevice = sessionManager.getDevice(masterId);
- if (masterDevice != null) {
- NettyDevice slaveDevice = sessionManager.getDevice(slaveId);
- masterDevice.setCurrentSlaveId(slaveId);
- masterDevice.setConnectorStatus(ConnectorStatus.ACTIVE);
- masterDevice.addConnectedDevice(slaveDevice);
-
- sysUserClientService.updateAliveStatus(masterDevice.getConnectorId(), slaveId, 1);
- if (masterDevice.getChannel() != null && masterDevice.getChannel().isActive()) {
- DeviceRequestDTO reDto = new DeviceRequestDTO();
- reDto.setPlatform(requestDTO.getPlatform());
- DeviceRespondDTO respond = new DeviceRespondDTO();
- respond.setSwitchResult(true);
- respond.setHolder("you");
- respond.setDeviceId(slaveId);
- reDto.setRespond(respond);
- ByteBuf buf = ctx.alloc().buffer();
- CommandUtils.buildCommand(buf, reDto, CommandConstant.interaction);
- String content = buf.toString(CharsetUtil.UTF_8);
- masterDevice.getChannel().writeAndFlush(buf);
- logger.info("转发控制请求设置当前控制2 发送报文:{} deviceId :{}", content, masterId);
- }
- } else {
+ NettyDevice masterDevice = sessionManager.getDevice(token);
+ if (masterDevice != null) {
+ NettyDevice slaveDevice = sessionManager.getDevice(slaveId);
+ masterDevice.setCurrentSlaveId(slaveId);
+ masterDevice.setConnectorStatus(ConnectorStatus.ACTIVE);
+ masterDevice.addConnectedDevice(slaveDevice);
+ sessionManager.lock(slaveId, token);
+ if (masterDevice.getChannel() != null && masterDevice.getChannel().isActive()) {
+ DeviceRequestDTO reDto = new DeviceRequestDTO();
+ reDto.setPlatform(requestDTO.getPlatform());
+ DeviceRespondDTO respond = new DeviceRespondDTO();
+ respond.setSwitchResult(true);
+ respond.setHolder("you");
+ respond.setDeviceId(slaveId);
+ reDto.setRespond(respond);
+ ByteBuf buf = ctx.alloc().buffer();
+ CommandUtils.buildCommand(buf, reDto, CommandConstant.interaction);
+ String content = buf.toString(CharsetUtil.UTF_8);
+ masterDevice.getChannel().writeAndFlush(buf);
+ logger.info("转发控制请求设置当前控制2 发送报文:{} deviceId :{}", content, token);
}
}
}
diff --git a/maibu-netty-server/src/main/java/com/maibu/service/TransferDeviceService.java b/maibu-netty-server/src/main/java/com/maibu/service/TransferDeviceService.java
index cd747d5..23bc24c 100644
--- a/maibu-netty-server/src/main/java/com/maibu/service/TransferDeviceService.java
+++ b/maibu-netty-server/src/main/java/com/maibu/service/TransferDeviceService.java
@@ -7,10 +7,12 @@ import com.maibu.core.domain.AjaxResult;
import com.maibu.core.domain.entity.UserClient;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.core.enums.ConnectorStatus;
+import com.maibu.exception.ServiceException;
import com.maibu.mapper.DeviceMapper;
import com.maibu.mapper.SysUserClientMapper;
import com.maibu.memory.DeviceSessionManager;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -20,6 +22,7 @@ import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
@Service
@Slf4j
@@ -155,62 +158,111 @@ public class TransferDeviceService {
}
}
+// public synchronized boolean switchDevice(DeviceBindDTO bindDTO, LoginUser user) {
+// try {
+// String slaveId = bindDTO.getDeviceId();
+// String platform = bindDTO.getPlatform();
+// String userName = user.getUsername();
+// String masterId = userName + ":" + platform;
+// //todo 判断是否有权限 正在控制才能切
+// //todo 离线没有控制权的怎么切
+// log.info("switchDevice:{}", masterId);
+// NettyDevice deviceMaster = sessionManager.getDevice(masterId);
+// log.info("deviceMaster:{}", deviceMaster);
+// if (deviceMaster != null) {
+// log.info("ConnectorStatus:{}", deviceMaster.getConnectorStatus());
+// if (ConnectorStatus.RECEIVER.equals(deviceMaster.getConnectorStatus())) {
+// //当前账号没有控制则可以切换为控制?
+// NettyDevice activeDevice = sessionManager.getUserControl(userName);
+// deviceMaster.getConnectedConnectors().clear();
+// if (activeDevice == null) {
+// log.info("bindConnector ACTIVE :{}", masterId);
+// sessionManager.bindConnector(masterId, slaveId);
+// deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
+// deviceMaster.setCurrentSlaveId(slaveId);
+// sysUserClientService.updateAliveStatus(masterId, slaveId, 1);
+// } else {
+// log.info("bindConnector RECEIVER :{}", masterId);
+// sessionManager.bindConnector(masterId, slaveId);
+// deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
+// deviceMaster.setCurrentSlaveId(slaveId);
+// sysUserClientService.updateAliveStatus(masterId, slaveId, 2);
+// }
+// } else {
+// //从关联其他设备切换到 当前禁言 假如有控制且不是当前更新为2
+// List controls = sessionManager.getSlaveControl(slaveId);
+// if (CollectionUtils.isEmpty(controls)) {
+// deviceMaster.getConnectedConnectors().clear();
+// log.info("bindConnector 1:{}", masterId);
+// sessionManager.bindConnector(masterId, slaveId);
+// deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
+// deviceMaster.setCurrentSlaveId(slaveId);
+// sysUserClientService.updateAliveStatus(masterId, slaveId, 1);
+// } else {
+// NettyDevice controlDevice = controls.get(0);
+// if (!masterId.equals(controlDevice.getConnectorId())) {
+// //当前的设备有控制 的主机
+// deviceMaster.getConnectedConnectors().clear();
+// log.info("bindConnector RECEIVER 2:{}", masterId);
+// sessionManager.bindConnector(masterId, slaveId);
+// deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
+// deviceMaster.setCurrentSlaveId(slaveId);
+// sysUserClientService.updateAliveStatus(masterId, slaveId, 2);
+// }
+// //当前 切当前不做操作
+// }
+// }
+// return true;
+// }
+// } catch (Exception e) {
+// log.error("切换设备失败: {}", e.getMessage(), e);
+// }
+// return false;
+// }
+
public synchronized boolean switchDevice(DeviceBindDTO bindDTO, LoginUser user) {
try {
String slaveId = bindDTO.getDeviceId();
- String platform = bindDTO.getPlatform();
- String userName = user.getUsername();
- String masterId = userName + ":" + platform;
- //todo 判断是否有权限 正在控制才能切
- //todo 离线没有控制权的怎么切
- log.info("switchDevice:{}", masterId);
- NettyDevice deviceMaster = sessionManager.getDevice(masterId);
- log.info("deviceMaster:{}", deviceMaster);
- if (deviceMaster != null) {
- log.info("ConnectorStatus:{}", deviceMaster.getConnectorStatus());
- if (ConnectorStatus.RECEIVER.equals(deviceMaster.getConnectorStatus())) {
- //当前账号没有控制则可以切换为控制?
- NettyDevice activeDevice = sessionManager.getUserControl(userName);
- deviceMaster.getConnectedConnectors().clear();
- if (activeDevice == null) {
- log.info("bindConnector ACTIVE :{}", masterId);
- sessionManager.bindConnector(masterId, slaveId);
- deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
- deviceMaster.setCurrentSlaveId(slaveId);
- sysUserClientService.updateAliveStatus(masterId, slaveId, 1);
- } else {
- log.info("bindConnector RECEIVER :{}", masterId);
- sessionManager.bindConnector(masterId, slaveId);
- deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
- deviceMaster.setCurrentSlaveId(slaveId);
- sysUserClientService.updateAliveStatus(masterId, slaveId, 2);
- }
- } else {
- //从关联其他设备切换到 当前禁言 假如有控制且不是当前更新为2
- List controls = sessionManager.getSlaveControl(slaveId);
- if (CollectionUtils.isEmpty(controls)) {
- deviceMaster.getConnectedConnectors().clear();
- log.info("bindConnector 1:{}", masterId);
- sessionManager.bindConnector(masterId, slaveId);
- deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
- deviceMaster.setCurrentSlaveId(slaveId);
- sysUserClientService.updateAliveStatus(masterId, slaveId, 1);
- } else {
- NettyDevice controlDevice = controls.get(0);
- if (!masterId.equals(controlDevice.getConnectorId())) {
- //当前的设备有控制 的主机
- deviceMaster.getConnectedConnectors().clear();
- log.info("bindConnector RECEIVER 2:{}", masterId);
- sessionManager.bindConnector(masterId, slaveId);
- deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
- deviceMaster.setCurrentSlaveId(slaveId);
- sysUserClientService.updateAliveStatus(masterId, slaveId, 2);
- }
- //当前 切当前不做操作
- }
- }
- return true;
+// String platform = bindDTO.getPlatform();
+// String userName = user.getUsername();
+
+// String masterId = userName + ":" + platform;
+
+
+ String token = bindDTO.getToken();
+
+ log.info("switchDevice slaveId:{},token:{}", slaveId, token);
+ NettyDevice deviceMaster = sessionManager.getDevice(token);
+ log.info("switchDevice deviceMaster:{}", deviceMaster);
+ if (deviceMaster == null) {
+ throw new ServiceException("功能码当前账号未发送登录请求,不在线");
}
+
+ List controls = sessionManager.getAllSlaveControl(slaveId);
+ if (CollectionUtils.isEmpty(controls)) {
+ deviceMaster.getConnectedConnectors().clear();
+ sessionManager.bindConnector(token, slaveId);
+ deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
+ deviceMaster.setCurrentSlaveId(slaveId);
+ sessionManager.lock(slaveId, token);
+ log.info("switchDevice bindConnector slaveId:{},token:{}", slaveId, token);
+ } else {
+ List connectorIds = controls.stream().map(NettyDevice::getConnectorId).collect(Collectors.toList());
+ if (!connectorIds.contains(token)) {
+ //当前的设备有控制 的主机
+ deviceMaster.getConnectedConnectors().clear();
+ sessionManager.bindConnector(token, slaveId);
+ deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
+ deviceMaster.setCurrentSlaveId(slaveId);
+ log.info("switchDevice bindConnector RECEIVER :{}", token);
+ } else {
+ deviceMaster.setConnectorStatus(ConnectorStatus.ACTIVE);
+ deviceMaster.setCurrentSlaveId(slaveId);
+ sessionManager.lock(slaveId, token);
+ }
+ //当前 切当前不做操作
+ }
+ return true;
} catch (Exception e) {
log.error("切换设备失败: {}", e.getMessage(), e);
}
@@ -220,51 +272,16 @@ public class TransferDeviceService {
public DeviceControlDTO remoteControl(DeviceBindDTO bindDTO, LoginUser user) {
try {
- String slaveId = bindDTO.getDeviceId();
- String platform = bindDTO.getPlatform();
- String userName = user.getUsername();
- String masterId = userName + ":" + platform;
+ String token = user.getToken();
+ String masterToken = sessionManager.getMaster(bindDTO.getDeviceId());
DeviceControlDTO dto = new DeviceControlDTO();
- NettyDevice deviceMaster = sessionManager.getDevice(masterId);
- log.info("remoteControl deviceMaster:{}", masterId);
-
-// //TODO 拓展当前控制不是同一个账号
-// NettyDevice currentDevice = sessionManager.getCurrentControl(slaveId);
-// if(currentDevice != null){
-// if(currentDevice.getConnectorId().equals(masterId)){
-// dto.setRemoteControl(true);
-// dto.setOwner(platform);
-// }else{
-// dto.setRemoteControl(false);
-// dto.setOwner(currentDevice.getConnectorId());
-// }
-// }else{
-// dto.setRemoteControl(false);
-// dto.setOwner(null);
-// dto.setReason("occupied");
-// }
-
- if (deviceMaster != null) {
- if (ConnectorStatus.ACTIVE.equals(deviceMaster.getConnectorStatus())) {
- dto.setRemoteControl(true);
- dto.setOwner(platform);
- } else {
- dto.setRemoteControl(false);
- dto.setReason("occupied");
- NettyDevice activeDevice = sessionManager.getUserControl(userName);
- if (activeDevice != null) {
- String[] l = activeDevice.getConnectorId().split(":");
- dto.setOwner(l[1]);
- }
- }
+ if (!StringUtils.isEmpty(token) && token.equals(masterToken)) {
+ dto.setRemoteControl(true);
+ dto.setOwner("you");
} else {
dto.setRemoteControl(false);
- dto.setReason("not exist");
- NettyDevice activeDevice = sessionManager.getUserControl(userName);
- if (activeDevice != null) {
- String[] l = activeDevice.getConnectorId().split(":");
- dto.setOwner(l[1]);
- }
+ dto.setReason("occupied");
+ dto.setOwner(masterToken);
}
return dto;
} catch (Exception e) {
@@ -334,16 +351,15 @@ public class TransferDeviceService {
String masterId = userName + ":" + platform;
Integer type = bindDTO.getType();
NettyDevice deviceMaster = sessionManager.getDevice(masterId);
- if (deviceMaster != null && type!=null) {
- if(type == 1){
- sysUserClientService.updateAliveStatus(masterId, "", 0);
+ if (type != null && deviceMaster != null) {
+ if (type == 1) {
deviceMaster.setCurrentSlaveId(null);
deviceMaster.getConnectedConnectors().clear();
} else if (type == 2) {
deviceMaster.setConnectorStatus(ConnectorStatus.RECEIVER);
- sysUserClientService.updateAliveStatus(masterId, deviceMaster.getCurrentSlaveId(), 2);
}
}
+ sessionManager.unLock(bindDTO.getDeviceId(), bindDTO.getToken(), false);
} catch (Exception e) {
log.error(e.getMessage());
}
diff --git a/maibu-web-middleware/src/main/java/com/maibu/dto/NettySwitchDeviceDTO.java b/maibu-web-middleware/src/main/java/com/maibu/dto/NettySwitchDeviceDTO.java
index c3b2786..add2396 100644
--- a/maibu-web-middleware/src/main/java/com/maibu/dto/NettySwitchDeviceDTO.java
+++ b/maibu-web-middleware/src/main/java/com/maibu/dto/NettySwitchDeviceDTO.java
@@ -23,4 +23,9 @@ public class NettySwitchDeviceDTO {
*/
private String userId;
+ /**
+ * 用户名
+ */
+ private String token;
+
}
diff --git a/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java b/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java
index f882565..60e62fd 100644
--- a/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java
+++ b/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java
@@ -400,6 +400,7 @@ public class ClientHandler extends ChannelInboundHandlerAdapter {
NettySwitchDeviceDTO dto = new NettySwitchDeviceDTO();
dto.setDeviceId(nettyClient.requestDeviceId);
dto.setPlatform("web");
+ dto.setToken(token);
String result = httpService.doPost(postUrl, token, dto);
ResultDTO resultDTO = JsonUtils.parseObject(result, ResultDTO.class);
if (resultDTO != null && resultDTO.getData() != null) {