From 1e5dc869c0cc773533eab4a53803f94f583cf0e9 Mon Sep 17 00:00:00 2001 From: wait <2543137953@qq.com> Date: Wed, 23 Apr 2025 10:23:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E5=88=B0=E7=82=B9=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LoopbackCommunicationAdapter.java | 58 +++++++----- .../opentcs/common/GuestUserCredentials.java | 2 +- .../org/opentcs/kc/udp/KCCommandDemo.java | 84 ++++++++--------- .../kc/udp/Service/HybridNavigation.java | 2 +- .../function/af/QueryRobotStatusRsp.java | 2 +- .../agv/param/function/af/TaskStatusInfo.java | 2 +- .../function/x17/QueryRobotRunStatusRsp.java | 2 +- .../java/org/opentcs/kc/udp/io/UDPClient.java | 11 +++ .../java/org/opentcs/kc/udp/server/main.java | 16 +++- .../org/opentcs/kc/udp/server/udpserver.java | 92 ++++++++++++++++--- 10 files changed, 181 insertions(+), 90 deletions(-) diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index d8407b7..be614c2 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -7,7 +7,6 @@ import static java.util.Objects.requireNonNull; import com.google.inject.assistedinject.Assisted; import jakarta.inject.Inject; import java.beans.PropertyChangeEvent; -import java.time.LocalDateTime; import java.util.Arrays; import java.util.Date; import java.util.HashMap; @@ -144,6 +143,11 @@ public class LoopbackCommunicationAdapter * 最后经过点位 */ private static String LAST_PASSED_POINT; + /** + * 唯一订单name. + * 用于判断是否切换执行订单 + */ + private static String uniqueOrderName; /** * Creates a new instance. @@ -316,8 +320,6 @@ public class LoopbackCommunicationAdapter System.out.println("send cmd print end"); - //订阅0xAF -// sub0xAF(); //AGV控制器执行命令 HybridNavigation.command(orderName, sourcePoint, destinationPointName, operation); @@ -326,13 +328,12 @@ public class LoopbackCommunicationAdapter && !isSimulationRunning) { isSimulationRunning = true; - if (LAST_PASSED_POINT == null) { - //设置最后经过点为起点 + if (uniqueOrderName == null || !uniqueOrderName.equals(orderName)) { + //设置唯一订单名称 + uniqueOrderName = orderName; + //记录订单起点 LAST_PASSED_POINT = sourcePoint; - //设置订阅状态为true - SUBSCRIBE_STATUS = true; } - sub0xAF(); // 展示模拟车辆 if (getSentCommands().isEmpty()) { @@ -393,7 +394,12 @@ public class LoopbackCommunicationAdapter String vehicleNowPosition = getProcessModel().getPosition(); String lastPassPointId = (queryRobotStatusRsp.locationStatusInfo.lastPassPointId).toString(); if (vehicleNowPosition == null || !vehicleNowPosition.equals(lastPassPointId)) { - initVehiclePosition(lastPassPointId); + if ("0".equals(lastPassPointId)) { + //最终经过点为0手动设置当前位置 + initVehiclePosition("2"); + } else { + initVehiclePosition(lastPassPointId); + } } //新:设置车辆姿势。(官方弃用设置车辆精确位置)-------------------目前车辆返回位置为固定值!!!!! @@ -507,12 +513,12 @@ public class LoopbackCommunicationAdapter @Override protected synchronized void connectVehicle() { -// getProcessModel().setCommAdapterConnected(true); initAGV(); } @Override protected synchronized void disconnectVehicle() { + SUBSCRIBE_STATUS = false; getProcessModel().setCommAdapterConnected(false); } @@ -562,6 +568,7 @@ public class LoopbackCommunicationAdapter if (step.getPath() == null) { LOG.debug("-Starting operation..."); //动作执行待完成 +// operationSimulation(command, 1); operationExec(command); } else { getProcessModel().getVelocityController().addWayEntry( @@ -631,17 +638,18 @@ public class LoopbackCommunicationAdapter //获取AGV最终经过点 String currentPoint = getProcessModel().getPosition() != null ? getProcessModel().getPosition() : ""; - //获取当前路径条目并推进时间步长,检查是否仍处于同一路径条目: + //判断当前AGV点位是否和最新点位相同: if (currentPoint.equals(LAST_PASSED_POINT)) { - //若是,则重新调度当前方法以继续模拟。 + //若是,则重新调度当前方法以继续循环。 getExecutor().schedule( () -> movementExec(command), SIMULATION_PERIOD, TimeUnit.MILLISECONDS ); } else { + //若否,更新当前车辆位置,并根据命令是否有操作决定进入操作模拟或完成命令并模拟下一个命令。 LAST_PASSED_POINT = currentPoint; - //若否,更新车辆位置为上一路径条目的目标点,并根据命令是否有操作决定进入操作模拟或完成命令并模拟下一个命令。 + LOG.debug("-Movement finished."); if (!command.hasEmptyOperation()) { //执行AGV动作 @@ -868,8 +876,6 @@ public class LoopbackCommunicationAdapter LOG.debug("Vehicle exec is done."); getProcessModel().setState(Vehicle.State.IDLE); isSimulationRunning = false; - LAST_PASSED_POINT = null; - SUBSCRIBE_STATUS = false; } else { LOG.debug("Triggering exec for next command: {}", getSentCommands().peek()); @@ -925,7 +931,8 @@ public class LoopbackCommunicationAdapter throw new RuntimeException("initAGV 0xAF response is null"); } - //开启0xAF订阅 + //设置订阅状态为true && 开启0xAF订阅 + SUBSCRIBE_STATUS = true; sub0xAF(); @@ -945,16 +952,19 @@ public class LoopbackCommunicationAdapter if (qryRobotRunStatusRsp == null) { getProcessModel().setCommAdapterConnected(false); - throw new RuntimeException("initAGV 0x17 response is null"); + throw new RuntimeException("-initAGV 0x17 response is null"); } if (qryRobotRunStatusRsp.robotLocalizationState == 0) { getProcessModel().setCommAdapterConnected(false); - throw new RuntimeException("AGV定位失败,请执行手动定位"); + throw new RuntimeException("-If the AGV positioning fails, please perform manual positioning"); + } + else if (qryRobotRunStatusRsp.robotLocalizationState == 1) { + getProcessModel().setPosition(qryRobotRunStatusRsp.currentTargetId.toString()); } else if (qryRobotRunStatusRsp.robotLocalizationState == 2) { getProcessModel().setCommAdapterConnected(false); - throw new RuntimeException("AGV定位中,请稍后再试"); + throw new RuntimeException("-agv positioning please try again later"); } //5 切换成自动模式(命令码:0x03,变量:NaviControl 修改为1); @@ -967,7 +977,7 @@ public class LoopbackCommunicationAdapter getProcessModel().setCommAdapterConnected(true); } else { //0xAF获取AGV状态 - System.out.println("=================---initAGV_0xAF"); + System.out.println("---=-=-=----initAGV_0xAF"); QueryRobotStatusRsp qryRobotStatusRsp = QryRobotStatus.command(); if (qryRobotStatusRsp == null) { getProcessModel().setCommAdapterConnected(false); @@ -1031,17 +1041,17 @@ public class LoopbackCommunicationAdapter } private void sub0xAF(){ + Date now = new Date(); + sub0xafDeadline = now.getTime() + 10000; messageProcessingPool.submit(() -> { - Date now = new Date(); - sub0xafDeadline = now.getTime() + 10000; SubRobotStatue.command(); }); } private void sub0xB0(){ + Date now = new Date(); + sub0xb0Deadline = now.getTime() + 10000; messageProcessingPool.submit(() -> { - Date now = new Date(); - sub0xb0Deadline = now.getTime() + 10000; SubCargoStatus.command(); }); } diff --git a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java index 8f6f8d4..57996e8 100644 --- a/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java +++ b/opentcs-common/src/main/java/org/opentcs/common/GuestUserCredentials.java @@ -18,7 +18,7 @@ public interface GuestUserCredentials { /** * 主机IP */ - String IP = "192.168.124.111"; + String IP = "192.168.124.109"; /** * 内核开放端口 */ diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/KCCommandDemo.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/KCCommandDemo.java index 911aaf5..b863065 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/KCCommandDemo.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/KCCommandDemo.java @@ -37,28 +37,28 @@ import org.opentcs.kc.udp.io.UDPClient; public class KCCommandDemo { public static void main(String[] args) throws Exception { -// { -// //0xAF(查询机器人状态) -// AgvEvent agvEvent = queryStatus(); -// printInfo(agvEvent); -// RcvEventPackage rcv = UDPClient.localAGV.send(agvEvent); -// if(rcv.isOk()){ -// System.out.println(); -// System.out.println("received transationId : "+ "isok:"+rcv.isOk()); -// for (byte b:rcv.getValue()){ -// System.out.print(byteToHex(b)+" "); -// } -// System.out.println(); -// System.out.println("---------------------"); -// for (byte c:rcv.getDataBytes()){ -// System.out.print(byteToHex(c)+" "); -// } -// QueryRobotStatusRsp queryRobotStatusRsp = new QueryRobotStatusRsp(rcv.getDataBytes()); -// }else { -// System.out.println(); -// System.out.println("received transationId : "+ "isok:"+rcv.isOk()); -// } -// } + { + //0xAF(查询机器人状态) + AgvEvent agvEvent = queryStatus(); + printInfo(agvEvent); + RcvEventPackage rcv = UDPClient.localAGV.send(agvEvent); + if(rcv.isOk()){ + System.out.println(); + System.out.println("received transationId : "+ "isok:"+rcv.isOk()); + for (byte b:rcv.getValue()){ + System.out.print(byteToHex(b)+" "); + } + System.out.println(); + System.out.println("---------------------"); + for (byte c:rcv.getDataBytes()){ + System.out.print(byteToHex(c)+" "); + } + QueryRobotStatusRsp queryRobotStatusRsp = new QueryRobotStatusRsp(rcv.getDataBytes()); + }else { + System.out.println(); + System.out.println("received transationId : "+ "isok:"+rcv.isOk()); + } + } // { // //0xB0(查询载货状态) @@ -147,26 +147,26 @@ public class KCCommandDemo { // } - { - //0x14(手动定位) - AgvEvent agvEvent = manualLocation(); - printInfo(agvEvent); - RcvEventPackage rcv = UDPClient.localAGV.send(agvEvent); - if(rcv.isOk()){ - System.out.println(); - System.out.println("received "+ "isok:"+rcv.isOk()+" dataBytes:"); - printInfo(rcv); - if(rcv.isOk()){ - //get and parse value - System.out.println("0x14 ok"); - }else { - System.out.println("0x14 failed"); - } - }else { - System.out.println(); - System.out.println("received transationId : "+ "isok:"+rcv.isOk()); - } - } +// { +// //0x14(手动定位) +// AgvEvent agvEvent = manualLocation(); +// printInfo(agvEvent); +// RcvEventPackage rcv = UDPClient.localAGV.send(agvEvent); +// if(rcv.isOk()){ +// System.out.println(); +// System.out.println("received "+ "isok:"+rcv.isOk()+" dataBytes:"); +// printInfo(rcv); +// if(rcv.isOk()){ +// //get and parse value +// System.out.println("0x14 ok"); +// }else { +// System.out.println("0x14 failed"); +// } +// }else { +// System.out.println(); +// System.out.println("received transationId : "+ "isok:"+rcv.isOk()); +// } +// } // { diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/Service/HybridNavigation.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/Service/HybridNavigation.java index 94aa879..8afbc59 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/Service/HybridNavigation.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/Service/HybridNavigation.java @@ -151,7 +151,7 @@ public class HybridNavigation } /** - * 维护订单名对应int类型唯一ID + * 维护订单名对应int类型唯一ID--------todo 待优化:如果调度重启,控制器也需要重启。否则0xAE指令会因为重置订单ID和任务key下发失败。应改成wms数据库ID交互 * @param orderName 订单名 * @return Integer */ diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/QueryRobotStatusRsp.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/QueryRobotStatusRsp.java index c99b017..77b66a7 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/QueryRobotStatusRsp.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/QueryRobotStatusRsp.java @@ -38,7 +38,7 @@ public class QueryRobotStatusRsp { Integer taskByteSize = 12+8*(pointSize+edgeSize); this.taskStatusInfo = new TaskStatusInfo(ByteUtils.copyBytes(src,56,taskByteSize)); - this.batteryStatusInfo = new BatteryStatusInfo(ByteUtils.copyBytes(src,56+taskByteSize,20)); + this.batteryStatusInfo = new BatteryStatusInfo(ByteUtils.copyBytesContainStart(src,56+taskByteSize,20)); if(this.abnormal_size>0){ diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/TaskStatusInfo.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/TaskStatusInfo.java index 999e473..cc0248d 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/TaskStatusInfo.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/af/TaskStatusInfo.java @@ -37,7 +37,7 @@ public class TaskStatusInfo { this.pathStatusInfo = new PathStateSequence[edgeStatusNum]; for (int i = 0; i < edgeStatusNum; i++) { this.pathStatusInfo[i] = new PathStateSequence( - ByteUtils.copyBytes(src, 12 + pointStatusNum * 8 + 8 * pointStatusNum + 8 * i, 8) + ByteUtils.copyBytes(src, 12 + pointStatusNum * 8 + 8 * i, 8) ); } } diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/x17/QueryRobotRunStatusRsp.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/x17/QueryRobotRunStatusRsp.java index 43876a4..272f406 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/x17/QueryRobotRunStatusRsp.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/agv/param/function/x17/QueryRobotRunStatusRsp.java @@ -23,7 +23,7 @@ public class QueryRobotRunStatusRsp { //地图载入状态,1个字节,byte private byte mapLoadState; //当前的目标点 id,U32 ,4个字节 - private Integer currentTargetId; + public Integer currentTargetId; //前进速度,8个字节,double private double forwardSpeed; diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/io/UDPClient.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/io/UDPClient.java index 59a6dbd..47c497b 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/io/UDPClient.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/io/UDPClient.java @@ -9,6 +9,7 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import java.net.InetSocketAddress; +import java.util.Date; import java.util.HashMap; import java.util.Set; import org.opentcs.access.KernelServicePortal; @@ -32,6 +33,7 @@ public enum UDPClient { //如果要配置多个链接, local1 local2 .... 这样排下去好了 localAGV("50", "192.168.124.124", 17804, 55678), +// localAGV("50", "localhost", 17804, 55678), ; // 服务端用户名+密码+地址+端口 @@ -151,6 +153,15 @@ public enum UDPClient { public void subscribeKC(RcvEventPackage rcv, byte[] body) { if (rcv.isOk()) { + + Date date = new Date(); + + System.out.println("time:" + date.getTime()); + + for (byte b : body) { + System.out.print(byteToHex(b) + " "); + } + System.out.println(); KernelServicePortal servicePortal = new KernelServicePortalBuilder( SERVICE_USER, SERVICE_PWD ).build(); diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/server/main.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/server/main.java index 5970673..02bd99c 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/server/main.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/server/main.java @@ -1,6 +1,7 @@ package org.opentcs.kc.udp.server; import org.opentcs.kc.udp.agv.param.AgvEvent; +import org.opentcs.kc.udp.agv.param.function.af.QueryRobotStatusRsp; /** * @Desc: "" @@ -12,11 +13,18 @@ public class main { //size 148 ,contentSize = 148-28 = 120 - String errSrc = "d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 07 00 10 af 00 00 64 00 00 00 01 00 00 00 14 90 b0 c0 45 c0 d3 3a ca a2 1d 3b 08 00 00 00 12 00 00 00 02 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 02 00 00 00 00 00 00 00 00 00"; - String okSrc = "d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 03 00 10 af 00 00 64 00 00 00 01 00 00 00 73 1c 30 3d 66 ba 03 3d d9 51 59 bb 00 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 02 00 00 00 00 00 00 00 00 00 73 1c 30 3d 66 ba 03 3d d9 51 59 bb 00 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 "; - String[] s = errSrc.split(" "); - System.out.println("size: " + s.length); +// String errSrc = "d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 00 00 10 af 00 00 00 68 00 00 00 00 00 00 53 3a 48 bd 32 fb 7b bc ca 13 03 ba 01 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00 00 00 00 00 05 00 00 00 01 00 00 00 01 01 00 00 02 00 00 00 02 00 00 00 01 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n"; +// String okSrc = "d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 03 00 10 af 00 00 64 00 00 00 01 00 00 00 73 1c 30 3d 66 ba 03 3d d9 51 59 bb 00 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 01 02 00 00 00 00 00 00 00 00 00 73 1c 30 3d 66 ba 03 3d d9 51 59 bb 00 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 "; +// String[] s = errSrc.split(" "); +// System.out.println("size: " + s.length); +// printInfo(s); + + + String errSrc2 = "00 00 00 00 53 3a 48 bd 32 fb 7b bc ca 13 03 ba 01 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00 00 00 00 00 05 00 00 00 01 00 00 00 01 01 00 00 02 00 00 00 02 00 00 00 01 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"; + String[] s = errSrc2.split(" "); printInfo(s); + QueryRobotStatusRsp queryRobotStatusRsp = new QueryRobotStatusRsp(new byte[]{(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x53,(byte)0x3a,(byte)0x48,(byte)0xbd,(byte)0x32,(byte)0xfb,(byte)0x7b,(byte)0xbc,(byte)0xca,(byte)0x13,(byte)0x03,(byte)0xba,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}); + System.out.println(); } diff --git a/opentcs-common/src/main/java/org/opentcs/kc/udp/server/udpserver.java b/opentcs-common/src/main/java/org/opentcs/kc/udp/server/udpserver.java index 31e04d8..2ca00f5 100644 --- a/opentcs-common/src/main/java/org/opentcs/kc/udp/server/udpserver.java +++ b/opentcs-common/src/main/java/org/opentcs/kc/udp/server/udpserver.java @@ -10,18 +10,18 @@ import java.net.DatagramSocket; import java.net.InetAddress; public class udpserver { + static int PORT = 17804; // 服务器端口 + static int BUFFER_SIZE = 1024; // 接收缓冲区大小(需与客户端协商) - public static void main(String[] args) { - int port = 17804; // 服务器端口 - int bufferSize = 1024; // 接收缓冲区大小(需与客户端协商) + public static void main(String[] args) { + try (DatagramSocket socket = new DatagramSocket(PORT)) { + System.out.println("UDP Server started on port " + PORT); - try (DatagramSocket socket = new DatagramSocket(port)) { - System.out.println("UDP Server started. Listening for binary data on port " + port); + while (true) { - // 循环处理客户端请求 - while (true) { + System.out.println("000====---"); // 1. 接收二进制数据 - byte[] receiveBuffer = new byte[bufferSize]; + byte[] receiveBuffer = new byte[BUFFER_SIZE]; DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); socket.receive(receivePacket); // 阻塞等待数据 @@ -45,8 +45,9 @@ public class udpserver { byte[] src = new byte[0]; if(type == (byte)0xAF){ //0XAF 指令 + //[16:30:10:474] d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 00 00 10 af 00 00 00 68 00 00 00 00 00 00 53 3a 48 bd 32 fb 7b bc ca 13 03 ba 01 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00 00 00 00 00 05 00 00 00 01 00 00 00 01 01 00 00 02 00 00 00 02 00 00 00 01 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //错误指令 01 00 - src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0xaf,(byte)0x00,(byte)0x00,(byte)0x64,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x14,(byte)0x90,(byte)0xb0,(byte)0xc0,(byte)0x45,(byte)0xc0,(byte)0xd3,(byte)0x3a,(byte)0xca,(byte)0xa2,(byte)0x1d,(byte)0x3b,(byte)0x08,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x12,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0a,(byte)0x01,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; + src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0xaf,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x68,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x53,(byte)0x3a,(byte)0x48,(byte)0xbd,(byte)0x32,(byte)0xfb,(byte)0x7b,(byte)0xbc,(byte)0xca,(byte)0x13,(byte)0x03,(byte)0xba,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; //正确指令 //src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x03,(byte)0x00,(byte)0x10,(byte)0xaf,(byte)0x00,(byte)0x00,(byte)0x64,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x73,(byte)0x1c,(byte)0x30,(byte)0x3d,(byte)0x66,(byte)0xba,(byte)0x03,(byte)0x3d,(byte)0xd9,(byte)0x51,(byte)0x59,(byte)0xbb,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0a,(byte)0x01,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x73,(byte)0x1c,(byte)0x30,(byte)0x3d,(byte)0x66,(byte)0xba,(byte)0x03,(byte)0x3d,(byte)0xd9,(byte)0x51,(byte)0x59,(byte)0xbb,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; @@ -64,11 +65,72 @@ public class udpserver { clientAddress, clientPort ); - socket.send(sendPacket); - } - - } catch (Exception e) { - e.printStackTrace(); - } + socket.send(sendPacket); + } + } catch (Exception e) { + e.printStackTrace(); } + } + +// public static void main(String[] args) { +// int port = 17804; // 服务器端口 +// int bufferSize = 1024; // 接收缓冲区大小(需与客户端协商) +// +// try (DatagramSocket socket = new DatagramSocket(port)) { +// System.out.println("UDP Server started. Listening for binary data on port " + port); +// +// // 循环处理客户端请求 +// while (true) { +// // 1. 接收二进制数据 +// byte[] receiveBuffer = new byte[bufferSize]; +// DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); +// socket.receive(receivePacket); // 阻塞等待数据 +// +// // 解析客户端信息 +// InetAddress clientAddress = receivePacket.getAddress(); +// int clientPort = receivePacket.getPort(); +// int receivedLength = receivePacket.getLength(); // 实际接收到的字节数 +// +// // 提取原始字节数据(避免填充多余的0) +// byte[] receivedData = new byte[receivedLength]; +// System.arraycopy(receiveBuffer, 0, receivedData, 0, receivedLength); +// +// byte type = receivedData[21]; +// // 打印调试信息 +// System.out.printf( +// "Received %d bytes from %s:%d 命令码%s\n", +// receivedLength, clientAddress.getHostAddress(), clientPort, type +// ); +// +// +// byte[] src = new byte[0]; +// +// if(type == (byte)0xAF){ //0XAF 指令 +// //[16:30:10:474] d4 97 44 9c cb cf 0b 4c 95 51 d8 61 70 f1 e7 94 01 01 00 00 10 af 00 00 00 68 00 00 00 00 00 00 53 3a 48 bd 32 fb 7b bc ca 13 03 ba 01 00 00 00 0c 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00 00 00 00 00 05 00 00 00 01 00 00 00 01 01 00 00 02 00 00 00 02 00 00 00 01 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +// //错误指令 01 00 +// src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0xaf,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x68,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x53,(byte)0x3a,(byte)0x48,(byte)0xbd,(byte)0x32,(byte)0xfb,(byte)0x7b,(byte)0xbc,(byte)0xca,(byte)0x13,(byte)0x03,(byte)0xba,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x05,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; +// //正确指令 +// //src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x03,(byte)0x00,(byte)0x10,(byte)0xaf,(byte)0x00,(byte)0x00,(byte)0x64,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x73,(byte)0x1c,(byte)0x30,(byte)0x3d,(byte)0x66,(byte)0xba,(byte)0x03,(byte)0x3d,(byte)0xd9,(byte)0x51,(byte)0x59,(byte)0xbb,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0a,(byte)0x01,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x73,(byte)0x1c,(byte)0x30,(byte)0x3d,(byte)0x66,(byte)0xba,(byte)0x03,(byte)0x3d,(byte)0xd9,(byte)0x51,(byte)0x59,(byte)0xbb,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0c,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; +// +// }else if(type == (byte)0x17){ //0X17 指令 +// src = new byte[]{(byte)0xd4,(byte)0x97,(byte)0x44,(byte)0x9c,(byte)0xcb,(byte)0xcf,(byte)0x0b,(byte)0x4c,(byte)0x95,(byte)0x51,(byte)0xd8,(byte)0x61,(byte)0x70,(byte)0xf1,(byte)0xe7,(byte)0x94,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x00,(byte)0x10,(byte)0x17,(byte)0x00,(byte)0x00,(byte)0xc0,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0xe1,(byte)0xb6,(byte)0x11,(byte)0xbb,(byte)0x66,(byte)0x2a,(byte)0xac,(byte)0xbf,(byte)0x67,(byte)0x67,(byte)0x8d,(byte)0xb5,(byte)0x4f,(byte)0x65,(byte)0x1b,(byte)0x40,(byte)0x60,(byte)0x33,(byte)0x1c,(byte)0x39,(byte)0x82,(byte)0xbb,(byte)0xd0,(byte)0xbf,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x80,(byte)0x3f,(byte)0x10,(byte)0x72,(byte)0x3f,(byte)0x00,(byte)0x00,(byte)0xd8,(byte)0xe5,(byte)0x2b,(byte)0x4c,(byte)0xa7,(byte)0x40,(byte)0x00,(byte)0x20,(byte)0x99,(byte)0x3a,(byte)0x91,(byte)0x3b,(byte)0xf3,(byte)0x40,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x34,(byte)0x38,(byte)0x65,(byte)0x32,(byte)0x30,(byte)0x33,(byte)0x34,(byte)0x63,(byte)0x2d,(byte)0x64,(byte)0x34,(byte)0x61,(byte)0x31,(byte)0x2d,(byte)0x34,(byte)0x37,(byte)0x37,(byte)0x32,(byte)0x2d,(byte)0x39,(byte)0x31,(byte)0x32,(byte)0x37,(byte)0x2d,(byte)0x31,(byte)0x38,(byte)0x31,(byte)0x63,(byte)0x35,(byte)0x66,(byte)0x61,(byte)0x62,(byte)0x34,(byte)0x33,(byte)0x63,(byte)0x65,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x29,(byte)0xe9,(byte)0x35,(byte)0x3f,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; +// } +// +// +// +// +// // 2. 原样返回数据(ECHO模式) +// DatagramPacket sendPacket = new DatagramPacket( +// src, +// src.length, +// clientAddress, +// clientPort +// ); +// socket.send(sendPacket); +// } +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } }