From d5d0f5bdcb62577f205259a49db54a521a4d205d Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Mon, 14 Jul 2025 17:36:05 +0800 Subject: [PATCH] =?UTF-8?q?Socket=E6=8E=A8=E9=80=81=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/robot/RemoteControllerProcessor.java | 36 +++++++++++- .../module/remote/util/HexConverter.java | 58 +++++++++++++++++++ .../src/main/resources/application-local.yaml | 7 ++- .../task/TaskDistributionConsumer.java | 4 ++ ...RobotTaskLineTimeConsumingServiceImpl.java | 4 ++ .../RobotPathPlanningServiceImpl.java | 4 +- 6 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/HexConverter.java diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java index 557fd9ab4..53a65c7a8 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -146,7 +147,35 @@ public class RemoteControllerProcessor { msg = msg + " " + crcOne + " " + crcTwo; - remoteControllerSocket.setMsg(msg); + remoteControllerSocket.setMsg(hexStringToByteArray(msg)); + } + + public String hexStringToByteArray(String hexString) { + // 移除所有空格(包括中间和两端的空格) + String cleaned = hexString.replaceAll("\\s", ""); + + // 验证字符串长度是否为偶数 + if (cleaned.length() % 2 != 0) { + throw new IllegalArgumentException("无效的十六进制字符串长度: " + cleaned.length()); + } + + // 创建结果字节数组 + byte[] byteArray = new byte[cleaned.length() / 2]; + + for (int i = 0; i < cleaned.length(); i += 2) { + // 提取两个连续的十六进制字符 + String hexPair = cleaned.substring(i, i + 2); + + try { + // 将十六进制字符串转换为字节 + byteArray[i / 2] = (byte) Integer.parseInt(hexPair, 16); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("无效的十六进制字符: " + hexPair); + } + } + + String str = Arrays.toString(byteArray); + return str.substring(1, str.length() - 1); } public void remoteCache(RemoteRobotTransferDTO dto, String ip) { @@ -223,7 +252,10 @@ public class RemoteControllerProcessor { try { os = socket.getOutputStream(); String str = remoteControllerSocketDTO.getMsg(); - os.write(remoteControllerSocketDTO.getMsg().getBytes()); + String[] split = str.split(","); + for (String meg : split) { + os.write(Integer.parseInt(meg.trim())); + } log.info("socket推送的数据 :{}", str); } catch (IOException e) { log.error("socket发送异常 :{}", e); diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/HexConverter.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/HexConverter.java new file mode 100644 index 000000000..bca28719d --- /dev/null +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/HexConverter.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.remote.util; + +import java.util.Arrays; + +public class HexConverter { + + public static byte[] hexStringToByteArray(String hexString) { + // 移除所有空格(包括中间和两端的空格) + String cleaned = hexString.replaceAll("\\s", ""); + + // 验证字符串长度是否为偶数 + if (cleaned.length() % 2 != 0) { + throw new IllegalArgumentException("无效的十六进制字符串长度: " + cleaned.length()); + } + + // 创建结果字节数组 + byte[] byteArray = new byte[cleaned.length() / 2]; + + for (int i = 0; i < cleaned.length(); i += 2) { + // 提取两个连续的十六进制字符 + String hexPair = cleaned.substring(i, i + 2); + + try { + // 将十六进制字符串转换为字节 + byteArray[i / 2] = (byte) Integer.parseInt(hexPair, 16); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("无效的十六进制字符: " + hexPair); + } + } + + return byteArray; + } + + public static void main(String[] args) { + String input = "AA 55 13 04 01 88 88 02 C0 A8 09 09 0f 27 01 78 01 78 01 78 EE 27"; // 可以测试 "ab c5 ef" 或 "A B C 5 E F" + + try { + byte[] result = hexStringToByteArray(input); + + // 格式化输出为 {0xAB, 0xC5, 0xEF} 形式 + StringBuilder sb = new StringBuilder("{"); + for (int i = 0; i < result.length; i++) { + // 使用 & 0xFF 将字节转换为无符号整数 + sb.append(String.format("0x%02X", result[i] & 0xFF)); + if (i < result.length - 1) sb.append(", "); + } + sb.append("}"); + + System.out.println("输入: \"" + input + "\""); + System.out.println("十六进制数组: " + sb.toString()); + System.out.println("字节数组内容: " + Arrays.toString(result)); + + } catch (IllegalArgumentException e) { + System.err.println("错误: " + e.getMessage()); + } + } + +} diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml index 8f13b7a6a..7c52fbf1a 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml @@ -55,8 +55,11 @@ logging: remote: cockpit: # 远遥控制车辆IP和端口 - controllerPort: 9000 - controllerIp: 127.0.0.1 - ipcIp: 10.10.7.132 + controllerIp: 10.10.100.19 + ipcIp: 10.10.100.19 + - controllerPort: 9000 + controllerIp: 10.10.100.19 + ipcIp: 10.10.5.26 msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 cockpit-time-out: 120 # 驾舱超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java index 45c453ee7..927b795c2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java @@ -77,6 +77,10 @@ public class TaskDistributionConsumer { } else if (RobotTaskEventTypeEnum.DONE.getType().equals(message.getEventType())) { String orderId = message.getMessage(); String endTime = DateUtils.getYearMonthDayHourMinuteSecon(); + try { + Thread.sleep(5000); + } catch (Exception e) { + } RobotTaskDetailDO taskDetail = robotTaskDetailService.getTaskDetail(Long.valueOf(orderId)); if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(taskDetail.getTaskType())) { takeRelease(taskDetail, endTime, orderId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java index 49ecedf82..dc6fa6a12 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeC import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskLineTimeConsumingDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; import cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskLineTimeConsumingMapper; +import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; @@ -97,6 +98,9 @@ public class RobotTaskLineTimeConsumingServiceImpl extends ServiceImpl addList = new ArrayList<>(); for (RobotTaskLineTimeConsumingDetailDTO v : list) { + if ((ZeroOneEnum.ZERO.getType()+"").equals(v.getTimeConsuming())) { + continue; + } RobotTaskLineTimeConsumingDO line = BeanUtils.toBean(v, RobotTaskLineTimeConsumingDO.class); line.setTaskNo(taskNo); line.setTaskDetailId(orderId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java index 9e4072519..27ed440b4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java @@ -555,7 +555,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } WareHouseLocationDO nextLocation = locationMapper.selectOne(new LambdaQueryWrapperX() - .eq(WareHouseLocationDO::getId, fromLocation.getMapItemId()) + .eq(WareHouseLocationDO::getMapItemId, fromLocation.getMapItemId()) .eq(WareHouseLocationDO::getLocationStorey, fromLocation.getLocationStorey() - 1) .last("limit 1")); if (ObjectUtil.isNotEmpty(nextLocation) && ObjectUtil.isNotEmpty(nextLocation.getLocationTotalHeight())) { @@ -590,7 +590,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } WareHouseLocationDO nextLocation = locationMapper.selectOne(new LambdaQueryWrapperX() - .eq(WareHouseLocationDO::getId, toLocation.getMapItemId()) + .eq(WareHouseLocationDO::getMapItemId, toLocation.getMapItemId()) .eq(WareHouseLocationDO::getLocationStorey, toLocation.getLocationStorey() - 1) .last("limit 1")); if (ObjectUtil.isNotEmpty(nextLocation) && ObjectUtil.isNotEmpty(nextLocation.getLocationTotalHeight())) {