This commit is contained in:
cbs 2025-05-22 10:23:59 +08:00
parent c7dc602b7f
commit 11501f8e96
8 changed files with 103 additions and 58 deletions

View File

@ -1,13 +1,14 @@
package cn.iocoder.yudao.module.remote.api.robot; package cn.iocoder.yudao.module.remote.api.robot;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.remote.config.ip.IpProperties;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.Cockpit;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteControllerSocketDTO; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteControllerSocketDTO;
import cn.iocoder.yudao.module.remote.enums.robot.RemoteIpTypeEnum; import cn.iocoder.yudao.module.remote.enums.robot.RemoteIpTypeEnum;
import cn.iocoder.yudao.module.remote.util.crc.CRCUtil; import cn.iocoder.yudao.module.remote.util.crc.CRCUtil;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotTransferDTO; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotTransferDTO;
import com.alibaba.fastjson.JSON;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -35,11 +36,6 @@ public class RemoteControllerProcessor {
@Value("${remote.msg}") @Value("${remote.msg}")
private String defaultMsg; private String defaultMsg;
@Value("${remote.controller-ip}")
private String remoteControllerIp;
@Value("${remote.controller-port}")
private int remoteControllerPort;
@Value("${remote.cockpit-time-out}") @Value("${remote.cockpit-time-out}")
private int cockpitTimeOut; private int cockpitTimeOut;
@ -53,8 +49,15 @@ public class RemoteControllerProcessor {
private final String ONE = "01"; private final String ONE = "01";
private final String TWO = "02"; private final String TWO = "02";
public void addCache(RemoteRobotTransferDTO dto) { @Autowired
RemoteControllerSocketDTO remoteControllerSocketDTO = cache.get(remoteControllerIp); private IpProperties ipProperties;
public void addCache(RemoteRobotTransferDTO dto,String ip) {
Cockpit cockpit = ipProperties.getCockpitByIp(ip);
String cockpitIp = cockpit.getControllerIp();
int cockpitPort = cockpit.getControllerPort();
RemoteControllerSocketDTO remoteControllerSocketDTO = cache.get(cockpitIp);
log.info("是否为空 :{}",ObjectUtil.isEmpty(remoteControllerSocketDTO)); log.info("是否为空 :{}",ObjectUtil.isEmpty(remoteControllerSocketDTO));
if (ObjectUtil.isNotEmpty(remoteControllerSocketDTO)) { if (ObjectUtil.isNotEmpty(remoteControllerSocketDTO)) {
try { try {
@ -62,26 +65,26 @@ public class RemoteControllerProcessor {
if (socket != null && !socket.isClosed()) { if (socket != null && !socket.isClosed()) {
socket.close(); socket.close();
} }
log.info("关闭socket :{}", remoteControllerIp); log.info("关闭socket :{}", cockpitIp);
} catch (IOException e) { } catch (IOException e) {
log.error("关闭socket出现异常 :{}", remoteControllerIp); log.error("关闭socket出现异常 :{}", cockpitIp);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} else { } else {
remoteControllerSocketDTO = new RemoteControllerSocketDTO(); remoteControllerSocketDTO = new RemoteControllerSocketDTO();
} }
remoteControllerSocketDTO.setHost(remoteControllerIp); remoteControllerSocketDTO.setControllerIp(cockpitIp);
remoteControllerSocketDTO.setPort(remoteControllerPort); remoteControllerSocketDTO.setControllerPort(cockpitPort);
Socket socket = new Socket(); Socket socket = new Socket();
try { try {
socket.connect(new InetSocketAddress(remoteControllerIp, remoteControllerPort), 1000); socket.connect(new InetSocketAddress(cockpitIp, cockpitPort), 1000);
remoteControllerSocketDTO.setSocket(socket); remoteControllerSocketDTO.setSocket(socket);
} catch (IOException e) { } catch (IOException e) {
log.error("添加socket失败 :{}", e); log.error("添加socket失败 :{}", e);
throw exception(REMOTE_ROBOT_CONNECT_FAIL); throw exception(REMOTE_ROBOT_CONNECT_FAIL);
} }
setMsg(remoteControllerSocketDTO, RemoteIpTypeEnum.ONE.getType(), dto); setMsg(remoteControllerSocketDTO, RemoteIpTypeEnum.ONE.getType(), dto);
cache.put(remoteControllerIp, remoteControllerSocketDTO); cache.put(cockpitIp, remoteControllerSocketDTO);
} }
/** /**
@ -136,34 +139,36 @@ public class RemoteControllerProcessor {
remoteControllerSocket.setMsg(msg); remoteControllerSocket.setMsg(msg);
} }
public void remoteCache(RemoteRobotTransferDTO dto) { public void remoteCache(RemoteRobotTransferDTO dto,String ip) {
RemoteControllerSocketDTO remoteControllerSocketDTO = cache.get(remoteControllerIp); Cockpit cockpit = ipProperties.getCockpitByIp(ip);
String cockpitIp = cockpit.getControllerIp();
RemoteControllerSocketDTO remoteControllerSocketDTO = cache.get(cockpitIp);
if (ObjectUtil.isEmpty(remoteControllerSocketDTO)) { if (ObjectUtil.isEmpty(remoteControllerSocketDTO)) {
return; return;
} }
setMsg(remoteControllerSocketDTO, RemoteIpTypeEnum.THREE.getType(), dto); setMsg(remoteControllerSocketDTO, RemoteIpTypeEnum.THREE.getType(), dto);
cache.remove(remoteControllerIp); cache.remove(cockpitIp);
Socket socket = remoteControllerSocketDTO.getSocket(); Socket socket = remoteControllerSocketDTO.getSocket();
if (socket == null || socket.isClosed()) { if (socket == null || socket.isClosed()) {
try { try {
socket = new Socket(); socket = new Socket();
socket.connect(new InetSocketAddress(remoteControllerIp, remoteControllerPort), 1000); socket.connect(new InetSocketAddress(cockpitIp, cockpit.getControllerPort()), 1000);
} catch (IOException e) { } catch (IOException e) {
log.error("连接socket出现异常 :{}", remoteControllerIp); log.error("连接socket出现异常 :{}", cockpitIp);
} }
} }
OutputStream os = null; OutputStream os = null;
try { try {
os = socket.getOutputStream(); os = socket.getOutputStream();
log.info("断开连接 :{} ,对应的IP :{}", remoteControllerSocketDTO.getMsg(), remoteControllerSocketDTO.getHost()); log.info("断开连接 :{} ,对应的IP :{}", remoteControllerSocketDTO.getMsg(), remoteControllerSocketDTO.getControllerIp());
os.write(remoteControllerSocketDTO.getMsg().getBytes()); os.write(remoteControllerSocketDTO.getMsg().getBytes());
socket.shutdownInput(); socket.shutdownInput();
socket.close(); socket.close();
log.info("关闭socket :{}", remoteControllerIp); log.info("关闭socket :{}", cockpitIp);
} catch (IOException e) { } catch (IOException e) {
log.error("关闭socket出现异常 :{}", remoteControllerIp); log.error("关闭socket出现异常 :{}", cockpitIp);
} finally { } finally {
if (ObjectUtil.isNotEmpty(os)) { if (ObjectUtil.isNotEmpty(os)) {
try { try {
@ -173,7 +178,7 @@ public class RemoteControllerProcessor {
} }
} }
remoteCache(dto); remoteCache(dto,ip);
} }
@ -189,25 +194,12 @@ public class RemoteControllerProcessor {
// log.info("socket发送数据开始"); // log.info("socket发送数据开始");
for (Map.Entry<String, RemoteControllerSocketDTO> v : cache.entrySet()) { for (Map.Entry<String, RemoteControllerSocketDTO> v : cache.entrySet()) {
RemoteControllerSocketDTO remoteControllerSocketDTO = v.getValue(); RemoteControllerSocketDTO remoteControllerSocketDTO = v.getValue();
if (ObjectUtil.isEmpty(remoteControllerSocketDTO)) {
remoteControllerSocketDTO = new RemoteControllerSocketDTO();
remoteControllerSocketDTO.setHost(v.getKey());
remoteControllerSocketDTO.setPort(remoteControllerPort);
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(v.getKey(), remoteControllerPort), 1000);
remoteControllerSocketDTO.setSocket(socket);
} catch (IOException e) {
throw new RuntimeException(e);
}
cache.put(v.getKey(), remoteControllerSocketDTO);
}
Socket socket = remoteControllerSocketDTO.getSocket(); Socket socket = remoteControllerSocketDTO.getSocket();
if (socket == null || socket.isClosed()) { if (socket == null || socket.isClosed()) {
socket = new Socket(); socket = new Socket();
try { try {
socket.connect(new InetSocketAddress(v.getKey(), remoteControllerPort), 1000); socket.connect(new InetSocketAddress(v.getKey(), remoteControllerSocketDTO.getControllerPort()), 1000);
remoteControllerSocketDTO.setSocket(socket); remoteControllerSocketDTO.setSocket(socket);
} catch (IOException e) { } catch (IOException e) {
log.error("socket重连异常 :{}", e); log.error("socket重连异常 :{}", e);

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.remote.config.ip;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.Cockpit;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix ="remote",ignoreInvalidFields = true)
@Getter
@Setter
public class IpProperties {
private List<Cockpit> cockpit;
public Cockpit getCockpitByIp(String ip) {
for (Cockpit v : cockpit) {
if (ip.equals(v.getControllerIp())){
return v;
}
}
Cockpit data = new Cockpit();
data.setControllerIp("127.0.0.1");
data.setControllerPort(9000);
return data;
}
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.remote.controller.admin.robot.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class Cockpit {
@Schema(description = "驾舱端口")
private int controllerPort;
@Schema(description = "驾舱IP")
private String controllerIp;
}

View File

@ -1,13 +1,16 @@
package cn.iocoder.yudao.module.remote.controller.admin.robot.dto; package cn.iocoder.yudao.module.remote.controller.admin.robot.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.net.Socket; import java.net.Socket;
@Data @Data
public class RemoteControllerSocketDTO { public class RemoteControllerSocketDTO {
private String host; @Schema(description = "驾舱IP")
private int port; private String controllerIp;
@Schema(description = "驾舱端口")
private int controllerPort;
private Socket socket; private Socket socket;
private String msg; private String msg;
} }

View File

@ -8,7 +8,9 @@ import cn.iocoder.yudao.module.remote.api.path.dto.RemoteRobotDistanceInformatio
import cn.iocoder.yudao.module.remote.api.path.dto.RemoteRobotWirelessSignalDTO; import cn.iocoder.yudao.module.remote.api.path.dto.RemoteRobotWirelessSignalDTO;
import cn.iocoder.yudao.module.remote.api.robot.RemoteControllerProcessor; import cn.iocoder.yudao.module.remote.api.robot.RemoteControllerProcessor;
import cn.iocoder.yudao.module.remote.api.webSocket.RequestProcessor; import cn.iocoder.yudao.module.remote.api.webSocket.RequestProcessor;
import cn.iocoder.yudao.module.remote.config.ip.IpProperties;
import cn.iocoder.yudao.module.remote.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.remote.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.Cockpit;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotChangeModeDTO; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotChangeModeDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotTaskDoneDTO; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotTaskDoneDTO;
@ -23,6 +25,7 @@ import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotTransferDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -43,17 +46,11 @@ public class RemoteRobotServiceImpl implements RemoteRobotService {
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource
private RequestProcessor processor;
@Resource @Resource
private RemoteControllerProcessor remoteControllerProcessor; private RemoteControllerProcessor remoteControllerProcessor;
@Value("${remote.controller-port}") @Autowired
private int remoteControllerPort; private IpProperties ipProperties;
@Value("${remote.controller-ip}")
private String remoteControllerIp;
/** /**
* 获取地图区域对应的机器人信息 * 获取地图区域对应的机器人信息
@ -128,15 +125,16 @@ public class RemoteRobotServiceImpl implements RemoteRobotService {
@Override @Override
public void robotChangeMode(RemoteRobotChangeModeDTO data, HttpServletRequest request) { public void robotChangeMode(RemoteRobotChangeModeDTO data, HttpServletRequest request) {
String ip = IpUtils.getIp(request); String ip = IpUtils.getIp(request);
CommonResult<RemoteRobotTransferDTO> result = remoteRobotApi.robotChangeMode(data.getRemoteMode(), ip, data.getRobotNo(),remoteControllerPort,remoteControllerIp); Cockpit cockpit = ipProperties.getCockpitByIp(ip);
CommonResult<RemoteRobotTransferDTO> result = remoteRobotApi.robotChangeMode(data.getRemoteMode(), ip, data.getRobotNo(),cockpit.getControllerPort(),cockpit.getControllerIp());
if (!result.isSuccess()) { if (!result.isSuccess()) {
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg()); throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
} }
//非自动模式 //非自动模式
if (0!= data.getRemoteMode()) { if (0!= data.getRemoteMode()) {
remoteControllerProcessor.addCache(result.getData()); remoteControllerProcessor.addCache(result.getData(),ip);
}else { }else {
remoteControllerProcessor.remoteCache(result.getData()); remoteControllerProcessor.remoteCache(result.getData(),ip);
} }
} }
@ -163,7 +161,7 @@ public class RemoteRobotServiceImpl implements RemoteRobotService {
return; return;
} }
remoteControllerProcessor.remoteCache(result.getData()); remoteControllerProcessor.remoteCache(result.getData(),ip);
} }
/** /**

View File

@ -53,8 +53,11 @@ logging:
name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
remote: remote:
controller-port: 9000 cockpit:
controller-ip: 127.0.0.1 - controllerPort: 9001
controllerIp: 127.0.0.2
- controllerPort: 9001
controllerIp: 127.0.0.3
msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 msg: AA 55 13 04 01 88 88 # 驾舱socket头信息
cockpit-time-out: 120 # 驾舱超时报警时间 cockpit-time-out: 120 # 驾舱超时报警时间
industrial-control-time-out: 120 # 工控通信超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间

View File

@ -53,8 +53,11 @@ logging:
name: C:\system\install\log/${spring.application.name}.log name: C:\system\install\log/${spring.application.name}.log
remote: remote:
controller-port: 9000 cockpit: # 远遥控制车辆最大速度 m/s
controller-ip: 127.0.0.1 - controllerPort: 9001
controllerIp: 127.0.0.2
- controllerPort: 9001
controllerIp: 127.0.0.3
msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 msg: AA 55 13 04 01 88 88 # 驾舱socket头信息
cockpit-time-out: 120 # 驾舱超时报警时间 cockpit-time-out: 120 # 驾舱超时报警时间
industrial-control-time-out: 120 # 工控通信超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间

View File

@ -34,8 +34,11 @@ logging:
name: D:/project/rcs/logs/${spring.application.name}.log name: D:/project/rcs/logs/${spring.application.name}.log
remote: remote:
controller-port: 9000 cockpit:
controller-ip: 127.0.0.1 - controllerPort: 9001
controllerIp: 127.0.0.2
- controllerPort: 9001
controllerIp: 127.0.0.3
msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 msg: AA 55 13 04 01 88 88 # 驾舱socket头信息
cockpit-time-out: 120 # 驾舱超时报警时间 cockpit-time-out: 120 # 驾舱超时报警时间
industrial-control-time-out: 120 # 工控通信超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间