点到点执行动作

This commit is contained in:
wait 2025-04-23 10:23:31 +08:00
parent 48ec2a19a3
commit 1e5dc869c0
10 changed files with 181 additions and 90 deletions

View File

@ -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();
});
}

View File

@ -18,7 +18,7 @@ public interface GuestUserCredentials {
/**
* 主机IP
*/
String IP = "192.168.124.111";
String IP = "192.168.124.109";
/**
* 内核开放端口
*/

View File

@ -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());
// }
// }
// {

View File

@ -151,7 +151,7 @@ public class HybridNavigation
}
/**
* 维护订单名对应int类型唯一ID
* 维护订单名对应int类型唯一ID--------todo 待优化如果调度重启控制器也需要重启否则0xAE指令会因为重置订单ID和任务key下发失败应改成wms数据库ID交互
* @param orderName 订单名
* @return Integer
*/

View File

@ -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){

View File

@ -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)
);
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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();
}

View File

@ -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();
// }
// }
}