From 2583078fdf32b87da154b1594f3e616a77824175 Mon Sep 17 00:00:00 2001
From: whycq <10027870+whycq@user.noreply.gitee.com>
Date: 星期一, 12 八月 2024 17:10:31 +0800
Subject: [PATCH] #

---
 app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java      |   12 
 app/src/main/java/com/example/agvcontroller/protocol/ICodedStatus.java     |    9 
 app/src/main/java/com/example/agvcontroller/protocol/ICommandBody.java     |   12 
 app/src/main/java/com/example/agvcontroller/protocol/AgvPackage.java       |   51 -
 app/src/main/java/com/example/agvcontroller/protocol/Utils.java            |  239 ++++++++
 app/src/main/java/com/example/agvcontroller/protocol/PacHeader.java        |   29 
 app/src/main/java/com/example/agvcontroller/protocol/PacBody.java          |   38 +
 app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java      |   24 
 app/src/main/java/com/example/agvcontroller/protocol/ProtocolUtils.java    |   29 
 app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java     |    2 
 app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java      |   28 +
 app/src/main/java/com/example/agvcontroller/protocol/EncryType.java        |   66 ++
 app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java      |   50 +
 app/src/main/java/com/example/agvcontroller/protocol/ProtocolType.java     |   82 +++
 app/src/main/java/com/example/agvcontroller/protocol/AgvProtocol.java      |   37 +
 app/src/main/java/com/example/agvcontroller/protocol/PacErrorType.java     |   48 +
 app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java      |   32 +
 app/src/main/java/com/example/agvcontroller/protocol/ValidUtil.java        |   55 ++
 app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java      |   23 
 app/src/main/java/com/example/agvcontroller/protocol/ProtocolPojoType.java |   54 ++
 app/src/main/java/com/example/agvcontroller/protocol/DirectionType.java    |    9 
 app/src/main/java/com/example/agvcontroller/MainActivity.java              |   72 +-
 app/src/main/java/com/example/agvcontroller/protocol/Cools.java            |  367 +++++++++++++
 app/src/main/java/com/example/agvcontroller/StartActivity.java             |    2 
 app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java      |   87 +++
 app/src/main/java/com/example/agvcontroller/protocol/SystemProperties.java |   94 +++
 app/src/main/java/com/example/agvcontroller/protocol/ProtocolEncoder.java  |   42 
 app/src/main/java/com/example/agvcontroller/protocol/CRCUtils.java         |    2 
 28 files changed, 1,466 insertions(+), 129 deletions(-)

diff --git a/app/src/main/java/com/example/agvcontroller/MainActivity.java b/app/src/main/java/com/example/agvcontroller/MainActivity.java
index 4b3d37a..2df3a7f 100644
--- a/app/src/main/java/com/example/agvcontroller/MainActivity.java
+++ b/app/src/main/java/com/example/agvcontroller/MainActivity.java
@@ -8,6 +8,8 @@
 import android.os.Bundle;
 import android.os.Vibrator;
 import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
 import android.widget.Button;
 
@@ -32,54 +34,58 @@
     private Button vibrateButton;
     private Socket socket;
     SocketManager socketManager;
+
+    String clientId;
     NettyServerHandler nettyServerHandler;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
-        // 浣滀负瀹㈡埛绔繛鎺�
-        //SocketManager.getInstance().setHostAndPort("192.168.4.188", 802);
-        //SocketManager.getInstance().connect();
-
-        //SocketManager.getInstance().setPort(8080);
-        //SocketManager.getInstance().startServer();
-
-        // 璁剧疆绔彛鍙峰苟鍚姩鏈嶅姟绔�
-        //SocketManager.getInstance().setPort(8080);
-        //socketManager = new SocketManager();
-        //socketManager.startServer(8080);
-
-        // 鍚姩鏈嶅姟绔�
-        //new Thread(() -> {
-        //    SocketManager.getInstance().startServer();
-        //}).start();
-
         vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
         vibrateButton = findViewById(R.id.btn_stop);
 
         Intent intent = getIntent();
-        String clientId = intent.getStringExtra("message");
+        //String clientId = intent.getStringExtra("message");
+        clientId = intent.getStringExtra("message");
         Log.i("message1",clientId);
+        // 鍒濆鍖栧崟杞翠娇鑳�
+        byte[] message2 = new byte[]{0x01, 0x02, 0x03, 0x06}; // 绀轰緥娑堟伅
+        nettyServerHandler.sendMessageToClient(clientId, message2); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
 
-        vibrateButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    //vibrator.vibrate(500);
-                }
-
-                //String clientId = "/192.168.4.188:63160";
-                byte[] message1 = new byte[]{0x01, 0x02, 0x03, 0x04}; // 绀轰緥娑堟伅
-                Log.i("message2",clientId);
-                Log.i("message3", Arrays.toString(message1));
-
-                nettyServerHandler.sendMessageToClient(clientId, message1); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
+        //vibrateButton.setOnClickListener(new View.OnClickListener() {
+        //    @Override
+        //    public void onClick(View v) {
+        //        if (vibrator != null && vibrator.hasVibrator()) {
+        //            //vibrator.vibrate(500);
+        //        }
+        //
+        //        //String clientId = "/192.168.4.188:63160";
+        //        byte[] message1 = new byte[]{0x01, 0x02, 0x03, 0x04}; // 绀轰緥娑堟伅
+        //        Log.i("message2",clientId);
+        //        Log.i("message3", Arrays.toString(message1));
+        //
+        //        nettyServerHandler.sendMessageToClient(clientId, message1); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+        //    }
+        //});
+        vibrateButton.setOnTouchListener(new CarTouchButton());
 
     }
 
+    private class CarTouchButton implements View.OnTouchListener {
+
+        @Override
+        public boolean onTouch(View view, MotionEvent motionEvent) {
+            if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                byte[] message2 = new byte[]{0x01, 0x02, 0x03, 0x06}; // 绀轰緥娑堟伅
+                nettyServerHandler.sendMessageToClient(clientId, message2); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+            } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                byte[] message2 = new byte[]{0x01, 0x02, 0x03, 0x07}; // 绀轰緥娑堟伅
+                nettyServerHandler.sendMessageToClient(clientId, message2); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+            }
+            return false;
+        }
+    }
     @Override
     protected void onDestroy() {
         super.onDestroy();
diff --git a/app/src/main/java/com/example/agvcontroller/StartActivity.java b/app/src/main/java/com/example/agvcontroller/StartActivity.java
index adb74d2..ebc0cdf 100644
--- a/app/src/main/java/com/example/agvcontroller/StartActivity.java
+++ b/app/src/main/java/com/example/agvcontroller/StartActivity.java
@@ -52,7 +52,7 @@
             }
         });
         socketManager = new SocketManager();
-        socketManager.startServer(8022);
+        socketManager.startServer(8024);
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java
new file mode 100644
index 0000000..058cd45
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java
@@ -0,0 +1,50 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璺緞鏁版嵁鍖�
+ * Created by vincent on 2023/3/16
+ */
+public class AGV_01_DOWN implements IMessageBody, Serializable {
+
+    private static final long serialVersionUID = -2786382674008041014L;
+
+    @Override
+    public byte[] writeToBytes() {
+        String serialNo = Utils.zeroFill(this.serialNo, 16);
+        byte[] serialNoBytes = Utils.reverse(serialNo.getBytes());
+        //byte pathLen = (byte) actionItems.size();
+
+        byte[] pathBytes = new byte[0];
+        //for (AgvActionItem<? extends IActionBody> item : actionItems) {
+        //    //byte[] bytes = RadixTools.intToBytes(Integer.parseInt(item.getQrCode()));
+        //    //byte[] qrCodeBytes = Utils.reverse(bytes);
+        //    //byte actionCodeByte = (byte) item.getActionCmdType().actionCode;
+        //    //byte valByte = (byte) item.getVal();
+        //    //byte[] actionBodyBytes = item.getActionBody().writeToBytes();
+        //    //byte[] merge = Utils.merge(qrCodeBytes, actionCodeByte, valByte, actionBodyBytes);
+        //    pathBytes = Utils.merge(pathBytes, merge);
+        //}
+
+        return Utils.merge(serialNoBytes, pathLen, pathBytes);
+    }
+
+    @Override
+    public void readFromBytes(byte[] messageBodyBytes) {
+
+    }
+
+    // 娴佹按鍙� - 16
+    private String serialNo;
+
+    // 璺緞闀垮害
+    private int pathLen;
+
+    // 璺緞鍒楄〃
+    //private List<AgvActionItem<? extends IActionBody>> actionItems = new ArrayList<>();
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java
index 74bde9d..9578d44 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java
@@ -1,8 +1,5 @@
-package com.zy.acs.common.domain.protocol;
+package com.example.agvcontroller.protocol;
 
-import com.zy.acs.common.utils.Utils;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
 
 import java.io.Serializable;
 
@@ -10,7 +7,6 @@
  * 鍔ㄤ綔鍛戒护鍖�
  * Created by vincent on 2023/3/21
  */
-@Data
 public class AGV_02_DOWN implements IMessageBody, Serializable {
 
     private static final long serialVersionUID = 1664188062202647371L;
@@ -19,8 +15,10 @@
     public byte[] writeToBytes() {
         String serialNo = Utils.zeroFill(this.serialNo, 16);
         byte[] serialNoBytes = Utils.reverse(serialNo.getBytes());
-        byte cmdCodeByte = (byte) this.getCmdCode();
-        byte valByte = (byte) this.getVal();
+        //byte cmdCodeByte = (byte) this.getCmdCode();
+        byte cmdCodeByte = (byte) 1;
+        //byte valByte = (byte) this.getVal();
+        byte valByte = (byte) 1;
 
         byte[] cmdBodyBytes = commandBody.writeToBytes();
 
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java
new file mode 100644
index 0000000..882e607
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java
@@ -0,0 +1,23 @@
+package com.example.agvcontroller.protocol;
+
+import java.io.Serializable;
+
+/**
+ * 蹇冭烦
+ * Created by vincent on 2023/3/16
+ */
+public class AGV_03_DOWN implements IMessageBody, Serializable {
+
+    private static final long serialVersionUID = 6922520599887812372L;
+
+    @Override
+    public byte[] writeToBytes() {
+        return new byte[0];
+    }
+
+    @Override
+    public void readFromBytes(byte[] messageBodyBytes) {
+
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java
new file mode 100644
index 0000000..e59a7ff
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java
@@ -0,0 +1,24 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.io.Serializable;
+
+/**
+ * 婵�娲诲寘
+ * Created by vincent on 2023/3/16
+ */
+public class AGV_80_DOWN implements IMessageBody, Serializable {
+
+    private static final long serialVersionUID = -8289774377582991418L;
+
+    @Override
+    public byte[] writeToBytes() {
+        return new byte[0];
+    }
+
+    @Override
+    public void readFromBytes(byte[] messageBodyBytes) {
+
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java
new file mode 100644
index 0000000..7cdfe5d
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java
@@ -0,0 +1,28 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.io.Serializable;
+
+/**
+ * 搴旂瓟姝e父鍖�
+ * Created by vincent on 2023/3/16
+ */
+public class AGV_A1_DOWN implements IMessageBody, Serializable {
+
+    private static final long serialVersionUID = -1744072958515341165L;
+
+    @Override
+    public byte[] writeToBytes() {
+        return Utils.merge(ackSign, Utils.reverse(temp));
+    }
+
+    @Override
+    public void readFromBytes(byte[] messageBodyBytes) {
+
+    }
+
+    private byte ackSign = 0x11;
+
+    private byte[] temp = new byte[4];
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java
new file mode 100644
index 0000000..d3fff92
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java
@@ -0,0 +1,32 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.io.Serializable;
+
+/**
+ * Created by vincent on 2023/3/15
+ */
+public class AGV_F0_DOWN implements IMessageBody, Serializable {
+
+    private static final long serialVersionUID = 5769100530170067014L;
+
+    @Override
+    public byte[] writeToBytes() {
+        Utils.reverse(sysMark);
+        Utils.reverse(sysVersion);
+        Utils.reverse(temp);
+        return Utils.merge(sysMark, sysVersion, temp);
+    }
+
+    @Override
+    public void readFromBytes(byte[] bytes) {
+    }
+
+    private byte[] sysMark = new byte[] {0x00, 0x01};
+
+    private byte[] sysVersion = new byte[] {0x01, 0x01};
+
+    private byte[] temp = new byte[4];
+
+}
+
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AgvPackage.java b/app/src/main/java/com/example/agvcontroller/protocol/AgvPackage.java
index e50fa82..39f001f 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/AgvPackage.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AgvPackage.java
@@ -1,8 +1,5 @@
-package com.zy.acs.gateway.domain;
+package com.example.agvcontroller.protocol;
 
-import com.core.common.Cools;
-import com.zy.acs.gateway.constant.AgvConstant;
-import com.zy.acs.gateway.constant.PacErrorType;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
 
@@ -12,7 +9,7 @@
  * AGV鎶ユ枃妯″瀷
  * Created by vincent on 2023/3/10
  */
-public class AgvPackage implements PackageSupport {
+public class AgvPackage {
 
     /**
      * 婧愭暟鎹寘缂撳啿鍖�(寮曠敤)
@@ -58,14 +55,14 @@
         return agvPackage;
     }
 
-    public String toLogString() {
-        StringBuilder pacSb = new StringBuilder();
-        pacSb.append("AGV(").append(getHeader().getUniqueNo()).append(")")
-            .append("涓婁紶")
-            .append("[").append(getHeader().getProtocolType().getDes()).append("]娑堟伅.")
-            .append("鍘熷娑堟伅[").append(getSourceHexStr()).append("]");
-        return pacSb.toString();
-    }
+    //public String toLogString() {
+    //    StringBuilder pacSb = new StringBuilder();
+    //    pacSb.append("AGV(").append(getHeader().getUniqueNo()).append(")")
+    //        .append("涓婁紶")
+    //        .append("[").append(getHeader().getProtocolType().getDes()).append("]娑堟伅.")
+    //        .append("鍘熷娑堟伅[").append(getSourceHexStr()).append("]");
+    //    return pacSb.toString();
+    //}
 
     public ByteBuf getSourceBuff() {
         // 鍥犱负澶勭悊buffer鏃讹紝鎬绘槸甯屾湜鎷垮埌涓�涓噸缃簡readerIndex鐨刡uf
@@ -139,19 +136,19 @@
         return this;
     }
 
-    public ByteBuf convert(ByteBuf byteBuf){
-        byteBuf.writeByte(this.getHeader().getStartSymbol())
-                .writeShort(this.getHeader().getContentLength())
-                .writeByte(this.getHeader().getProtocolType().getCode())
-                .writeBytes(this.getHeader().getUniqueNo().getBytes(AgvConstant.CHARSET_GBK))
-                .writeByte(this.getHeader().getEncryptType().getCode())
-                .writeBytes(this.getBody().getContent())
-                .writeByte(this.getValidCode());
-        // 璁$畻骞惰缃牎楠岀爜
-//        this.setValidCode(ValidUtil.caculateValidByteFromBuff(byteBuf));
-        byteBuf.resetReaderIndex();
-        byteBuf.writerIndex(byteBuf.readableBytes() - 1).writeByte(this.getValidCode());
-        return byteBuf;
-    }
+//    public ByteBuf convert(ByteBuf byteBuf){
+//        byteBuf.writeByte(this.getHeader().getStartSymbol())
+//                .writeShort(this.getHeader().getContentLength())
+//                .writeByte(this.getHeader().getProtocolType().getCode())
+//                .writeBytes(this.getHeader().getUniqueNo().getBytes(AgvConstant.CHARSET_GBK))
+//                .writeByte(this.getHeader().getEncryptType().getCode())
+//                .writeBytes(this.getBody().getContent())
+//                .writeByte(this.getValidCode());
+//        // 璁$畻骞惰缃牎楠岀爜
+////        this.setValidCode(ValidUtil.caculateValidByteFromBuff(byteBuf));
+//        byteBuf.resetReaderIndex();
+//        byteBuf.writerIndex(byteBuf.readableBytes() - 1).writeByte(this.getValidCode());
+//        return byteBuf;
+//    }
 
 }
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AgvProtocol.java b/app/src/main/java/com/example/agvcontroller/protocol/AgvProtocol.java
new file mode 100644
index 0000000..9914c0f
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/AgvProtocol.java
@@ -0,0 +1,37 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.io.Serializable;
+
+/**
+ * Created by vincent on 2023/3/23
+ */
+//@Data
+public class AgvProtocol implements Serializable {
+
+    private static final long serialVersionUID = 8858385758421567504L;
+
+    private String agvNo;
+
+    private int timestamp;
+
+    private IMessageBody messageBody;
+
+    public static AgvProtocol build(String agvNo) {
+        AgvProtocol protocol = new AgvProtocol();
+        protocol.setAgvNo(agvNo);
+        //protocol.setTimestamp((int) (System.currentTimeMillis()/1000));
+        return protocol;
+    }
+
+    public AgvProtocol setAgvNo(String agvNo) {
+        this.agvNo = agvNo;
+        return this;
+    }
+
+    public AgvProtocol setMessageBody(IMessageBody messageBody) {
+        this.messageBody = messageBody;
+        return this;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/CRCUtils.java b/app/src/main/java/com/example/agvcontroller/protocol/CRCUtils.java
index a5047c8..22c6368 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/CRCUtils.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/CRCUtils.java
@@ -1,4 +1,4 @@
-package com.zy.acs.gateway.utils;
+package com.example.agvcontroller.protocol;
 
 /**
  * CRC16寰幆鍐椾綑鏍¢獙鐮�
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/Cools.java b/app/src/main/java/com/example/agvcontroller/protocol/Cools.java
new file mode 100644
index 0000000..be634d7
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/Cools.java
@@ -0,0 +1,367 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.lang.reflect.*;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by vincent on 2019-06-09
+ */
+public class Cools {
+
+    public static boolean isEmpty(Object... objects) {
+        for (Object obj : objects){
+            if (isEmpty(obj)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static boolean isEmpty(Object o) {
+        if (o == null) {
+            return true;
+        }
+        if (o instanceof String) {
+            if (o.toString().trim().equals("")) {
+                return true;
+            }
+        } else if (o instanceof List) {
+            if (((List) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Map) {
+            if (((Map) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Set) {
+            if (((Set) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Object[]) {
+            if (((Object[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof int[]) {
+            if (((int[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof long[]) {
+            if (((long[]) o).length == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static int sqlLimitIndex(Integer pageIndex, Integer pageSize){
+        return (pageIndex - 1) * pageSize;
+    }
+
+    //public static String enToken(String username, String password){
+    //    return AesUtils.encrypt(username, zerofill(password, 16));
+    //}
+
+    //public static String deTokn(String token, String password){
+    //    //return AesUtils.decrypt(token, zerofill(password, 16));
+    //}
+
+    public static String zerofill(String msg, Integer count){
+        if (msg.length() == count){
+            return msg;
+        } else if (msg.length() > count){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<count-msg.length(); i++){
+                msgBuilder.append("0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+
+    /**
+     * 鎴彇瀛楃涓�(榛樿end=true)
+     * @param str 琚埅瀛楃涓�
+     * @param end true:鏈�鍚庝竴涓瓧绗� / false:绗竴涓瓧绗�
+     */
+    public static String deleteChar(String str, boolean end){
+        if (isEmpty(str)){
+            return "";
+        }
+        if (end){
+            return str.substring(0, str.length()-1);
+        } else {
+            return str.substring(1);
+        }
+    }
+
+    public static String deleteChar(String str){
+        return deleteChar(str, true);
+    }
+
+
+    /**
+     * map 杞� 瀵硅薄
+     */
+    public static <T> T conver(Map<? extends String, ?> map, Class<T> cls){
+        T instance = null;
+        try {
+            Constructor<T> constructor = cls.getDeclaredConstructor();
+            boolean constructorAccessible = constructor.isAccessible();
+            constructor.setAccessible(true);
+            instance = constructor.newInstance();
+            constructor.setAccessible(constructorAccessible);
+        } catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        Class<?> prototype = cls;
+        do {
+            for (Field field : prototype.getDeclaredFields()){
+                if (Modifier.isFinal(field.getModifiers())
+                        || Modifier.isStatic(field.getModifiers())
+                        || Modifier.isTransient(field.getModifiers())){
+                    continue;
+                }
+                String fieldName = field.getName();
+                Object val = null;
+                if (map.containsKey(fieldName)){
+                    val = map.get(fieldName);
+                }
+                if (val != null){
+                    boolean fieldAccessible = field.isAccessible();
+                    field.setAccessible(true);
+                    Class<?> type = field.getType();
+                    try {
+                        Constructor<?> constructor = type.getDeclaredConstructor(String.class);
+                        boolean constructorAccessible = constructor.isAccessible();
+                        constructor.setAccessible(true);
+                        field.set(instance, constructor.newInstance(String.valueOf(val)));
+                        constructor.setAccessible(constructorAccessible);
+                    } catch (IllegalAccessException
+                            | InstantiationException
+                            | InvocationTargetException
+                            | NoSuchMethodException e) {
+                        System.err.println("convert error ===> Class["+prototype+"],Field:["+fieldName+"],Type:["+type+"],Value:["+val+"]");
+                    }
+                    field.setAccessible(fieldAccessible);
+                }
+            }
+            prototype = prototype.getSuperclass();
+        } while (!Object.class.equals(prototype));
+        return instance;
+    }
+
+    /**
+     * 瀵硅薄 杞� map
+     */
+    public static Map<String, Object> conver(Object obj){
+        Class<?> cls = obj.getClass();
+        Field[] fields = getAllFields(cls);
+        Map<String, Object> map = new HashMap<>();
+        for (Field field : fields) {
+            if (Modifier.isFinal(field.getModifiers())
+                    || Modifier.isStatic(field.getModifiers())
+                    || Modifier.isTransient(field.getModifiers())){
+                continue;
+            }
+            String key = field.getName();
+            boolean flag = field.isAccessible();
+            field.setAccessible(true);
+            Object val = null;
+            try {
+                val = field.get(obj);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            field.setAccessible(flag);
+            if (val != null){
+                map.put(key, val);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾Class锛堝強鍏禨uperClass锛夌殑鎴愬憳鍙橀噺
+     */
+    public static Field[] getAllFields(Class<?> cls){
+        return getAllFields(cls, null);
+    }
+
+    /**
+     * 閫掑綊鍚堝苟鍩虹被Field
+     */
+    private static Field[] getAllFields(Class<?> cls, Field[] params){
+        Field[] fields = (params == null) ? cls.getDeclaredFields() : params;
+        Class<?> superCls = cls.getSuperclass();
+        if (superCls == null || superCls == Object.class){
+            return fields;
+        }
+        Field[] superClsFields = superCls.getDeclaredFields();
+        fields = addAll(fields, superClsFields);
+        return getAllFields(superCls, fields);
+    }
+
+    /**
+     * 鏍规嵁fieldName鑾峰彇Field瀵硅薄
+     */
+    public static Field getField(Class<?> cls, String fieldName) {
+        Field[] allFields = getAllFields(cls);
+        for (Field field : allFields) {
+            if (field.getName().equals(fieldName)) {
+                return field;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄涓煇涓狥ield鐨勫��
+     */
+    public static Object getFieldValue(Object obj, Field field) {
+        if (null == field) {
+            return null;
+        } else {
+            if (obj instanceof Class) {
+                obj = null;
+            }
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            try {
+                return field.get(obj);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /**
+     * 鏁扮粍鍙犲姞
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T[] addAll(T[] array1, T... array2) {
+        if (array1 == null) {
+            return clone(array2);
+        } else if (array2 == null) {
+            return clone(array1);
+        } else {
+            Class<?> cls = array1.getClass().getComponentType();
+            T[] joinedArray = (T[]) Array.newInstance(cls, array1.length + array2.length);
+            System.arraycopy(array1, 0, joinedArray, 0, array1.length);
+
+            try {
+                System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
+                return joinedArray;
+            } catch (ArrayStoreException e) {
+                Class<?> type2 = array2.getClass().getComponentType();
+                if (!cls.isAssignableFrom(type2)) {
+                    throw new RuntimeException("Cannot store " + type2.getName() + " in an array of " + cls.getName(), e);
+                } else {
+                    throw e;
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍏嬮殕
+     */
+    private static <T> T[] clone(T[] array) {
+        return array == null ? null : array.clone();
+    }
+
+    /**
+     * map鎿嶄綔
+     */
+    public static CoolMap add(String key,Object value){
+        CoolMap map = new CoolMap();
+        map.put(key, value);
+        return map;
+    }
+
+    public static class CoolMap extends HashMap<String, Object>{
+
+        public CoolMap add(String key,Object value){
+            this.put(key, value);
+            return this;
+        }
+
+        public CoolMap $(String key,Object value){
+            this.put(key, value);
+            return this;
+        }
+
+    }
+
+    public static String md5(String string){
+        try{
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] bytes = md5.digest(string.getBytes(StandardCharsets.UTF_8));
+            char[] chars = new char[bytes.length * 2];
+            for (int i = 0; i < bytes.length; i++) {
+                int b = bytes[i];
+                chars[i * 2] = hexDigits[(b & 0xF0) >> 4];
+                chars[i * 2 + 1] = hexDigits[b & 0x0F];
+            }
+            return new String(chars).toLowerCase();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("md5鍔犲瘑澶辫触,str=".concat(string));
+        }
+    }
+
+    private static char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    //public static Map<String, Object> translate(Object obj){
+    //    Class<?> cls = obj.getClass();
+    //    Field[] fields = getAllFields(cls);
+    //    Map<String, Object> map = new HashMap<>();
+    //    for (Field field : fields) {
+    //        String key = field.getName();
+    //        if (field.isAnnotationPresent(CoolTranslate.class)){
+    //            CoolTranslate annotation = field.getAnnotation(CoolTranslate.class);
+    //            if (!isEmpty(annotation.value())) {
+    //                key = annotation.value();
+    //            }
+    //        }
+    //        boolean flag = field.isAccessible();
+    //        field.setAccessible(true);
+    //        Object val = null;
+    //        try {
+    //            val = field.get(obj);
+    //        } catch (IllegalAccessException e) {
+    //            e.printStackTrace();
+    //        }
+    //        field.setAccessible(flag);
+    //        if (val != null){
+    //            map.put(key, val);
+    //        }
+    //    }
+    //    return map;
+    //}
+
+    public static boolean eq(String str, String str0) {
+        if (Cools.isEmpty(str) && Cools.isEmpty(str0)) {
+            return true;
+        }
+        if (Cools.isEmpty(str) && !Cools.isEmpty(str0)) {
+            return false;
+        }
+        if (Cools.isEmpty(str0) && !Cools.isEmpty(str)) {
+            return false;
+        }
+        if (str.equals(str0)) {
+            return true;
+        }
+        return false;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/DirectionType.java b/app/src/main/java/com/example/agvcontroller/protocol/DirectionType.java
new file mode 100644
index 0000000..cbac087
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/DirectionType.java
@@ -0,0 +1,9 @@
+package com.example.agvcontroller.protocol;
+
+public enum DirectionType {
+
+    DOWN,
+    UP,
+    ;
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/EncryType.java b/app/src/main/java/com/example/agvcontroller/protocol/EncryType.java
new file mode 100644
index 0000000..5722bf5
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/EncryType.java
@@ -0,0 +1,66 @@
+package com.example.agvcontroller.protocol;
+
+/**
+ * 鍔犲瘑鏍囪瘑鏋氫妇
+ * Created by vincent on 2019-04-02
+ */
+public enum EncryType implements ICodedStatus {
+
+    /**
+     * 鏁版嵁涓嶅姞瀵�
+      */
+    ENCRY_EMPTY(0x01),
+    /**
+     * RSA绠楁硶鍔犲瘑
+     */
+    ENCRY_RSA(0x02),
+    /**
+     * AES128浣嶇畻娉曞姞瀵�
+     */
+    ENCRY_AES128(0x03),
+    /**
+     * 寮傚父
+     */
+    ENCRY_EXCEPTION(0xFE),
+    /**
+     * 鏃犳晥
+     */
+    ENCRY_INVALID(0xFF);
+
+    /**
+     * 鍏朵粬鏁板�间负棰勭暀
+     */
+
+    private int code;
+    EncryType(int code) {
+        this.code = code;
+    }
+
+
+    public static EncryType getByCode(int code) {
+        for (EncryType e :
+                EncryType.values()) {
+            if (e.getCode() == code) {
+                return e;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public int getCode() {
+        return code;
+    }
+
+    // 棰勬湡鐨勬湡鏈涘�硷紝閫楀彿鍒嗛殧
+    public static String expectedVals() {
+        StringBuilder valSb = new StringBuilder();
+        for (EncryType c :
+                EncryType.values()) {
+            valSb.append(c.getCode()).append(",");
+        }
+        // 鍒犻櫎鏈�鍚庝竴涓�楀彿
+        valSb.deleteCharAt(valSb.length() - 1);
+        return valSb.toString();
+    }
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ICodedStatus.java b/app/src/main/java/com/example/agvcontroller/protocol/ICodedStatus.java
new file mode 100644
index 0000000..794f0f1
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ICodedStatus.java
@@ -0,0 +1,9 @@
+package com.example.agvcontroller.protocol;
+
+/**
+ * 棰勭暀鎺ュ彛锛屽弽灏勬椂璋冪敤
+ * Created by vincent on 2019-04-03
+ */
+public interface ICodedStatus {
+    int getCode();
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ICommandBody.java b/app/src/main/java/com/example/agvcontroller/protocol/ICommandBody.java
new file mode 100644
index 0000000..188c970
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ICommandBody.java
@@ -0,0 +1,12 @@
+package com.example.agvcontroller.protocol;
+
+/**
+ * 鍛戒护鍙傛暟
+ */
+public interface ICommandBody {
+
+    byte[] writeToBytes();
+
+    void readFromBytes(byte[] messageBodyBytes);
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java b/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java
index a6a6d90..35efd0c 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java
@@ -1,4 +1,4 @@
-package com.zy.acs.common.domain.protocol;
+package com.example.agvcontroller.protocol;
 
 import java.io.Serializable;
 
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/PacBody.java b/app/src/main/java/com/example/agvcontroller/protocol/PacBody.java
new file mode 100644
index 0000000..bdcd9ed
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/PacBody.java
@@ -0,0 +1,38 @@
+package com.example.agvcontroller.protocol;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
+
+/**
+ * 鍗忚浣�
+ * Created by vincent on 2019-04-03
+ */
+public class PacBody {
+
+    private ByteBuf content;
+
+    private IMessageBody messageBody;
+
+    public ByteBuf getContent() {
+        return content;
+    }
+
+    public PacBody setContent(ByteBuf content) {
+        this.content = content.duplicate();
+        return this;
+    }
+
+    public IMessageBody getMessageBody() {
+        return messageBody;
+    }
+
+    public void setMessageBody(IMessageBody messageBody) {
+        this.messageBody = messageBody;
+    }
+
+    @Override
+    public String toString() {
+        return ByteBufUtil.hexDump(content);
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/PacErrorType.java b/app/src/main/java/com/example/agvcontroller/protocol/PacErrorType.java
new file mode 100644
index 0000000..6eec109
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/PacErrorType.java
@@ -0,0 +1,48 @@
+package com.example.agvcontroller.protocol;
+
+
+public enum PacErrorType implements ICodedStatus {
+
+    /**
+     * 瑙f瀽寮傚父
+     */
+    PAC_ANALYZE_ERROR(0x01, "鎶ユ枃瑙f瀽寮傚父"),
+
+    /**
+     * 鎶ユ枃闀垮害楠岃瘉寮傚父
+     */
+    PAC_LENGTH_ERROR(0x02, "鎶ユ枃闀垮害楠岃瘉寮傚父"),
+
+    /**
+     * 鎶ユ枃鏍¢獙寮傚父
+     */
+    PAC_VALID_ERROR(0x023, "鎶ユ枃闀垮害楠岃瘉寮傚父"),
+
+    ;
+
+    private int code;   // 缂栫爜
+    private String des; // 鎻忚堪
+
+    PacErrorType(int code, String des) {
+        this.code = code;
+        this.des = des;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public static PacErrorType getByCode(int code) {
+        for (PacErrorType c :
+                PacErrorType.values()) {
+            if (c.getCode() == code) {
+                return c;
+            }
+        }
+        return null;
+    }
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/PacHeader.java b/app/src/main/java/com/example/agvcontroller/protocol/PacHeader.java
index a41be16..2912ac4 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/PacHeader.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/PacHeader.java
@@ -1,15 +1,10 @@
-package com.zy.acs.gateway.domain;
+package com.example.agvcontroller.protocol;
 
-import com.zy.acs.gateway.constant.EncryType;
-import com.zy.acs.gateway.constant.ProtocolType;
-import lombok.Data;
-import org.apache.commons.lang.builder.ToStringBuilder;
 
 /**
  * 鍗忚澶�
  * Created by vincent on 2019-04-03
  */
-@Data
 public class PacHeader {
 
     /**
@@ -84,15 +79,15 @@
         return this;
     }
 
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this)
-                .append("startSymbol", startSymbol)
-                .append("contentLength", contentLength)
-                .append("uniqueNo", uniqueNo)
-                .append("timestamp", timestamp)
-                .append("protocolType", protocolType.getDes())
-                .append("serialNum", serialNum)
-                .toString();
-    }
+    //@Override
+    //public String toString() {
+    //    return new ToStringBuilder(this)
+    //            .append("startSymbol", startSymbol)
+    //            .append("contentLength", contentLength)
+    //            .append("uniqueNo", uniqueNo)
+    //            .append("timestamp", timestamp)
+    //            .append("protocolType", protocolType.getDes())
+    //            .append("serialNum", serialNum)
+    //            .toString();
+    //}
 }
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java b/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java
new file mode 100644
index 0000000..679690b
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java
@@ -0,0 +1,87 @@
+package com.example.agvcontroller.protocol;
+
+/**
+ * 鎶ユ枃鏍囪瘑鏋氫妇
+ * 涓嬫爣1: 璧峰绱㈠紩
+ * 涓嬫爣2: 闀垮害
+ * 涓嬫爣3: 鎻忚堪
+ * Created by vincent on 2019-04-03
+ */
+public enum PackagePart {
+
+    /**
+     * 璧峰绗�
+     */
+    START_SYMBOL(0, 1, "璧峰绗�"),
+
+    /**
+     * 鏁版嵁鍗曞厓闀垮害
+     */
+    CONTENT_LENGTH(1, 2, "鏁版嵁鍗曞厓闀垮害"),
+
+
+    /**
+     * 鍞竴鏍囪瘑鐮�
+     */
+    UNIQUENO(3, 4, "鍞竴鏍囪瘑鐮�"),
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    TIMESTAMP(7, 4, "鏃堕棿鎴�"),
+
+    /**
+     * 鍛戒护鏍囪瘑
+     */
+    COMMAND_MARK(11, 1, "鍛戒护鏍囪瘑"),
+
+    /**
+     * 鏁版嵁鍗曞厓
+     */
+    CONTENT(12, -1, "鏁版嵁鍗曞厓"),
+
+    /**
+     * 鏍¢獙鐮�
+     */
+    VALIDE_CODE( -1, 2, "鏍¢獙鐮�"),
+
+    /**
+     * 搴旂瓟鏍囧織
+     */
+    ACK_MARK(3, 1, "搴旂瓟鏍囧織"),
+
+    /**
+     * 鏁版嵁鍗曞厓鍔犲瘑鏂瑰紡
+     */
+    ENCRYPT_TYPE(21, 1, "鏁版嵁鍗曞厓鍔犲瘑鏂瑰紡"),
+
+    ;
+
+    // 瀛楄妭娈靛紑濮嬬储寮�
+    private Integer startIndex;
+
+    // 瀛楄妭娈垫�诲瓧鑺傛暟
+    private Integer len;
+
+    // 鎻忚堪
+    private String des;
+
+    PackagePart(int startIndex, int len, String des) {
+        this.startIndex = startIndex;
+        this.len = len;
+        this.des = des;
+    }
+
+    public Integer getStartIndex() {
+        return startIndex;
+    }
+
+    public Integer getLen() {
+        return len;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolEncoder.java b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolEncoder.java
index 04a396a..ddc38e0 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolEncoder.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolEncoder.java
@@ -1,20 +1,12 @@
-package com.zy.acs.gateway.handler.coder;
+package com.example.agvcontroller.protocol;
 
-import com.core.common.RadixTools;
-import com.zy.acs.common.utils.Utils;
-import com.zy.acs.gateway.config.SystemProperties;
-import com.zy.acs.gateway.constant.PackagePart;
-import com.zy.acs.gateway.domain.AgvPackage;
-import com.zy.acs.gateway.utils.ValidUtil;
+import java.util.logging.Logger;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.MessageToByteEncoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
 /**
  * 缂栫爜鍣�
@@ -22,13 +14,13 @@
  * 澶勭悊鏂瑰紡: 寮傛垨鍜�
  * Created by vincent on 2019-04-02
  */
-@Component
+//@Component
 @ChannelHandler.Sharable
 public class ProtocolEncoder extends MessageToByteEncoder<Object> {
 
-    private static final Logger log = LoggerFactory.getLogger(ProtocolEncoder.class);
+    //private static final Logger log = LoggerFactory.getLogger(ProtocolEncoder.class);
 
-    @Autowired
+    //@Autowired
     private SystemProperties systemProperties;
 
     @Override
@@ -48,9 +40,9 @@
 
             byte[] bodyBytes = pac.getBody().getMessageBody().writeToBytes();   // body
 
-            String uniqueNo = pac.getHeader().getUniqueNo();
+            //String uniqueNo = pac.getHeader().getUniqueNo();
 
-                byte[] uniquenoBytes = RadixTools.intToBytes(Integer.parseInt(pac.getHeader().getUniqueNo()));   // uniqueno
+                //byte[] uniquenoBytes = RadixTools.intToBytes(Integer.parseInt(pac.getHeader().getUniqueNo()));   // uniqueno
 
 
             int len = PackagePart.UNIQUENO.getLen()     // len
@@ -58,14 +50,14 @@
                     + PackagePart.COMMAND_MARK.getLen()
                     + bodyBytes.length;
 
-            out.writeByte(pac.getHeader().getStartSymbol())         // symbol
-                    .writeShortLE(len)
-                    .writeBytes(Utils.reverse(uniquenoBytes))       // uniqueno
-                    .writeIntLE((int) (System.currentTimeMillis() / 1000))   // timestamp
-                    .writeByte(pac.getHeader().getProtocolType().getCode()) // type
-                    .writeBytes(bodyBytes)                          // body
-                    .writeShort(pac.getValidCode())                 // valid
-            ;
+            //out.writeByte(pac.getHeader().getStartSymbol())         // symbol
+            //        .writeShortLE(len)
+            //        .writeBytes(Utils.reverse(uniquenoBytes))       // uniqueno
+            //        .writeIntLE((int) (System.currentTimeMillis() / 1000))   // timestamp
+            //        .writeByte(pac.getHeader().getProtocolType().getCode()) // type
+            //        .writeBytes(bodyBytes)                          // body
+            //        .writeShort(pac.getValidCode())                 // valid
+            //;
 
             pac.setValidCode(ValidUtil.calculateValidByteFromBuff(out));
             out.resetReaderIndex();
@@ -75,7 +67,7 @@
 
 
             if (systemProperties.isPrintPacLog()){
-                log.info("Agv [{}] 涓嬭 [{}] >>> {}", uniqueNo, pac.getHeader().getProtocolType().getDes(), ByteBufUtil.hexDump(out).toUpperCase());
+                //log.info("Agv [{}] 涓嬭 [{}] >>> {}", uniqueNo, pac.getHeader().getProtocolType().getDes(), ByteBufUtil.hexDump(out).toUpperCase());
             }
 
         }
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolPojoType.java b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolPojoType.java
new file mode 100644
index 0000000..301b5cf
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolPojoType.java
@@ -0,0 +1,54 @@
+package com.example.agvcontroller.protocol;
+
+
+/**
+ * 搴旂瓟瀹炰綋鏋氫妇
+ * Created by vincent on 2019-04-02
+ */
+public enum ProtocolPojoType {
+
+    PATH_COMMAND(ProtocolType.PATH_COMMAND, AGV_01_DOWN.class),
+
+    ACTION_COMMAND(ProtocolType.ACTION_COMMAND, AGV_02_DOWN.class),
+
+    LOGIN_ACK(ProtocolType.LOGIN_ACK, AGV_F0_DOWN.class),
+
+    ACTION_SUCCESS_ACK(ProtocolType.ACTION_SUCCESS_ACK, AGV_A1_DOWN.class),
+
+    ACTIVATION_COMMAND(ProtocolType.ACTIVATION_COMMAND, AGV_80_DOWN.class),
+
+    HEARTBEAT_COMMAND(ProtocolType.HEARTBEAT_COMMAND, AGV_03_DOWN.class),
+
+    ;
+
+
+    public final ProtocolType protocolType;
+
+
+    public final Class<? extends IMessageBody> clazz;
+
+    ProtocolPojoType(ProtocolType protocolType, Class<? extends IMessageBody> clazz) {
+        this.protocolType = protocolType;
+        this.clazz = clazz;
+    }
+
+
+    public static ProtocolPojoType query(ProtocolType protocolType) {
+        for (ProtocolPojoType type : ProtocolPojoType.values()) {
+            if (protocolType.equals(type.protocolType)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ProtocolPojoType query(Class<? extends IMessageBody> clazz) {
+        for (ProtocolPojoType type : ProtocolPojoType.values()) {
+            if (clazz.equals(type.clazz)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolType.java b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolType.java
new file mode 100644
index 0000000..1e0e8d3
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolType.java
@@ -0,0 +1,82 @@
+package com.example.agvcontroller.protocol;
+
+/**
+ * 鏍囪瘑鏋氫妇
+ * Created by vincent on 2019-04-02
+ */
+public enum ProtocolType implements ICodedStatus {
+
+    // 涓嬭 -------------------------------------------------------------------
+
+    PATH_COMMAND(0x01, "璺緞鏁版嵁鍖�", DirectionType.DOWN),
+
+    ACTION_COMMAND(0x02, "鍔ㄤ綔鍛戒护鍖�", DirectionType.DOWN),
+
+    HEARTBEAT_COMMAND(0x03, "蹇冭烦鍖�", DirectionType.DOWN),
+
+    FAULT_CLEAR_COMMAND(0x04, "鏁呴殰鍛戒护鍖�", DirectionType.DOWN),
+
+    ACTIVATION_COMMAND(0x80, "婵�娲诲寘", DirectionType.DOWN),
+
+    LOGIN_ACK(0xF0, "鐧诲綍搴旂瓟鍖�", DirectionType.DOWN),
+
+    ACTION_SUCCESS_ACK(0xA1, "鍔ㄤ綔瀹屾垚鎴愬姛搴旂瓟", DirectionType.DOWN),
+
+    ACTION_FAIL_ACK(0xA0, "鍔ㄤ綔瀹屾垚澶辫触搴旂瓟", DirectionType.DOWN),
+
+    // 涓婅 -------------------------------------------------------------------
+
+    PATH_ACK(0x01, "璺緞搴旂瓟鍖�", DirectionType.UP),
+
+    COMMAND_ACK(0x02, "鍛戒护搴旂瓟鍖�", DirectionType.UP),
+
+    ACTION_COMPLETE(0x11, "鍔ㄤ綔瀹屾垚鍖�", DirectionType.UP),
+
+    DATA_CODE_REPORT(0x12, "鏈夌爜瀹炴椂鏁版嵁鍖�", DirectionType.UP),
+
+    DATA_WITHOUT_CODE_REPORT(0x13, "鏃犵爜瀹炴椂鏁版嵁鍖�", DirectionType.UP),
+
+    HEARTBEAT_REPORT(0x03, "蹇冭烦鍖�", DirectionType.UP),
+
+    FAULT_REPORT(0x04, "鏁呴殰鏁版嵁鍖�", DirectionType.UP),
+
+    HANDLE_FALUT_ACK(0x14, "鏁呴殰娓呴櫎搴旂瓟鍖�", DirectionType.UP),
+
+    SILO_REPORT(0x70, "鏂欎粨淇℃伅鍖�", DirectionType.UP),
+
+    LOGIN_REPORT(0xF0, "鏈哄櫒浜虹櫥闄嗘暟鎹寘", DirectionType.UP),
+
+    ;
+
+    private final int code;   // 缂栫爜
+    private final String des; // 鎻忚堪
+    private final DirectionType direction;
+
+    ProtocolType(int code, String des, DirectionType direction) {
+        this.code = code;
+        this.des = des;
+        this.direction = direction;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public DirectionType getDirection() {
+        return direction;
+    }
+
+    public static ProtocolType getByCode(int code, DirectionType direction) {
+        for (ProtocolType type : ProtocolType.values()) {
+            if (type.getCode() == code && type.getDirection() == direction) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolUtils.java b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolUtils.java
index 2ea178b..8f35911 100644
--- a/app/src/main/java/com/example/agvcontroller/protocol/ProtocolUtils.java
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ProtocolUtils.java
@@ -1,38 +1,33 @@
-package com.zy.acs.gateway.utils;
+package com.example.agvcontroller.protocol;
 
-import com.zy.acs.common.domain.AgvProtocol;
-import com.zy.acs.common.domain.protocol.IMessageBody;
-import com.zy.acs.gateway.constant.ProtocolPojoType;
-import com.zy.acs.gateway.constant.ProtocolType;
-import com.zy.acs.gateway.domain.AgvPackage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import java.util.logging.Logger;
 
 /**
  * Created by vincent on 2019-04-03
  */
 public class ProtocolUtils {
 
-    private static final Logger log = LoggerFactory.getLogger(ProtocolUtils.class);
+    //private static final Logger log = LoggerFactory.getLogger(ProtocolUtils.class);
 
     // 涓嬭鍗忚鎶ユ枃缁勮
     public static AgvPackage installDownProtocol(AgvProtocol protocol){
 
 
-        ProtocolPojoType protocolPojo = ProtocolPojoType.query(protocol.getMessageBody().getClass());
+        //ProtocolPojoType protocolPojo = ProtocolPojoType.query(protocol.getMessageBody().getClass());
 
-        assert protocolPojo !=   null;
+        //assert protocolPojo !=   null;
 
         AgvPackage ackPackage = AgvPackage.valueOfEmpty();
         ackPackage.getHeader()
                 .setStartSymbol((byte)0xEE)
                 .setContentLength(0)
-                .setUniqueNo(protocol.getAgvNo())
-                .setTimestamp(protocol.getTimestamp())
-                .setProtocolType(protocolPojo.protocolType)
+                //.setUniqueNo(protocol.getAgvNo())
+                //.setTimestamp(protocol.getTimestamp())
+                //.setProtocolType(protocolPojo.protocolType)
         ;
 
-        ackPackage.getBody().setMessageBody(protocol.getMessageBody());
+        //ackPackage.getBody().setMessageBody(protocol.getMessageBody());
 
         return ackPackage;
 
@@ -65,9 +60,9 @@
         } catch (ReflectiveOperationException reflectiveOperationException) {
 
 
-            log.error("MessageBodyHandler ReflectiveOperationException", reflectiveOperationException);
+            //log.error("MessageBodyHandler ReflectiveOperationException", reflectiveOperationException);
 
-            log.error("java鍙嶅皠鍒涘缓瀹炰緥澶辫触锛歿}", protocolPojo.clazz.getName());
+            //log.error("java鍙嶅皠鍒涘缓瀹炰緥澶辫触锛歿}", protocolPojo.clazz.getName());
 
             return null;
         }
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/SystemProperties.java b/app/src/main/java/com/example/agvcontroller/protocol/SystemProperties.java
new file mode 100644
index 0000000..0ac9ddf
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/SystemProperties.java
@@ -0,0 +1,94 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * vc绯荤粺閰嶇疆
+ * Created by luxiaotao on 2018/10/15
+ */
+//@Configuration
+//@ConfigurationProperties(prefix = "agv-tcp")
+public class SystemProperties {
+
+    public static String HOST_NAME;
+
+    static {
+        try {
+            HOST_NAME = InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+            System.err.println("find hostname err");
+        }
+    }
+
+    private int port;
+
+    private int heartSeconds;
+
+    private int backlog;
+
+    private boolean keepAlive;
+
+    private int sndbuf;
+
+    private int rcvbuf;
+
+    private boolean printPacLog;
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public int getHeartSeconds() {
+        return heartSeconds;
+    }
+
+    public void setHeartSeconds(int heartSeconds) {
+        this.heartSeconds = heartSeconds;
+    }
+
+    public int getBacklog() {
+        return backlog;
+    }
+
+    public void setBacklog(int backlog) {
+        this.backlog = backlog;
+    }
+
+    public boolean isKeepAlive() {
+        return keepAlive;
+    }
+
+    public void setKeepAlive(boolean keepAlive) {
+        this.keepAlive = keepAlive;
+    }
+
+    public int getSndbuf() {
+        return sndbuf;
+    }
+
+    public void setSndbuf(int sndbuf) {
+        this.sndbuf = sndbuf;
+    }
+
+    public int getRcvbuf() {
+        return rcvbuf;
+    }
+
+    public void setRcvbuf(int rcvbuf) {
+        this.rcvbuf = rcvbuf;
+    }
+
+    public boolean isPrintPacLog() {
+        return printPacLog;
+    }
+
+    public void setPrintPacLog(final boolean printPacLog) {
+        this.printPacLog = printPacLog;
+    }
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/Utils.java b/app/src/main/java/com/example/agvcontroller/protocol/Utils.java
new file mode 100644
index 0000000..29d3654
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/Utils.java
@@ -0,0 +1,239 @@
+package com.example.agvcontroller.protocol;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by vincent on 2023/3/14
+ */
+public class Utils {
+
+    /**
+     * 鏁扮粍鍊掑簭
+     * @param bytes
+     * @param <T>
+     */
+    public static <T> byte[] reverse(byte[] bytes) {
+        if (bytes == null) return null;
+        for (int start = 0, end = bytes.length - 1; start < end; start++, end--) {
+            byte temp = bytes[end];
+            bytes[end] = bytes[start];
+            bytes[start] = temp;
+        }
+        return bytes;
+    }
+
+    /**
+     * 鎴彇鏁扮粍
+     * @param bytes 鍘熸暟缁�
+     * @param pos   瀹氫綅锛堟埅鍙栧悗鍖呭惈瀹氫綅鐐规暟鎹級
+     * @param len   闀垮害
+     * @return new arr
+     */
+    public static byte[] slice(byte[] bytes, int pos, int len) {
+        if (bytes == null || bytes.length == 0 || len == 0) {
+            return new byte[0];
+        }
+        if (pos + len > bytes.length) {
+            throw new RuntimeException("com.zy.acs.common.utils ArrayIndexOutOfBoundsException\n" +
+                    "鍘熸暟缁� bytes 闀垮害涓� " + bytes.length + "锛屾埅鍙栭暱搴﹁秴杩囧師鏁扮粍锛�");
+        }
+        byte[] arr = new byte[len];
+        System.arraycopy(bytes, pos, arr, 0, len);
+        return arr;
+    }
+
+    public static byte[] sliceWithReverse(byte[] bytes, int pos, int len) {
+        byte[] slice = slice(bytes, pos, len);
+        reverse(slice);
+        return slice;
+    }
+
+    public static byte[] merge(Object... objects) {
+        int len = 0;
+        for (Object object : objects) {
+            if (object instanceof byte[]) {
+                byte[] bytes = (byte[]) object;
+                len += bytes.length;
+            }
+            if (object instanceof Byte) {
+                len++;
+            }
+        }
+        byte[] arr = new byte[len];
+        int idx = 0;
+        for (Object object : objects) {
+            if (object instanceof byte[]) {
+                byte[] bytes = (byte[]) object;
+                System.arraycopy(bytes, 0, arr, idx, bytes.length);
+                idx += bytes.length;
+            }
+            if (object instanceof Byte) {
+                byte[] bytes = new byte[] {(Byte) object};
+                System.arraycopy(bytes, 0, arr, idx, bytes.length);
+                idx += bytes.length;
+            }
+        }
+        return arr;
+    }
+
+    public static <T> String join(T[] array, String seq) {
+        StringBuilder sb = new StringBuilder();
+        if (array != null) {
+            for (int i = 0; i < array.length; i++) {
+                sb.append(array[i]);
+                if (i < array.length - 1) {
+                    sb.append(seq);
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    public static String zeroFill(String msg, Integer len) {
+        len = Optional.ofNullable(len).orElse(16);
+        if (msg.length() == len){
+            return msg;
+        } else if (msg.length() > len){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<len-msg.length(); i++){
+                msgBuilder.insert(0,"0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+
+    public static String removePrefix(String str, String prefix) {
+        if (!Cools.isEmpty(str) && !Cools.isEmpty(prefix)) {
+            if (str.startsWith(prefix)) {
+                return str.substring(prefix.length());
+            } else {
+                return str;
+            }
+        } else {
+            return str;
+        }
+    }
+
+    public static String removeSuffix(String str, String suffix) {
+        if (!Cools.isEmpty(str) && !Cools.isEmpty(suffix)) {
+            if (str.endsWith(suffix)) {
+                return str.substring(0, str.indexOf(suffix));
+            } else {
+                return str;
+            }
+        } else {
+            return str;
+        }
+    }
+
+    /**
+     * 澶ч┘宄� 杞� symbol灏忛┘宄�
+     */
+    public static String toSymbolCase(String str, char symbol) {
+        if (str == null) {
+            return null;
+        } else {
+            int length = str.length();
+            StringBuilder sb = new StringBuilder();
+
+            for(int i = 0; i < length; ++i) {
+                char c = str.charAt(i);
+                if (Character.isUpperCase(c)) {
+                    Character preChar = i > 0 ? str.charAt(i - 1) : null;
+                    Character nextChar = i < str.length() - 1 ? str.charAt(i + 1) : null;
+                    if (null != preChar) {
+                        if (symbol == preChar) {
+                            if (null == nextChar || Character.isLowerCase(nextChar)) {
+                                c = Character.toLowerCase(c);
+                            }
+                        } else if (Character.isLowerCase(preChar)) {
+                            sb.append(symbol);
+                            if (null == nextChar || Character.isLowerCase(nextChar)) {
+                                c = Character.toLowerCase(c);
+                            }
+                        } else if (null == nextChar || Character.isLowerCase(nextChar)) {
+                            sb.append(symbol);
+                            c = Character.toLowerCase(c);
+                        }
+                    } else if (null == nextChar || Character.isLowerCase(nextChar)) {
+                        c = Character.toLowerCase(c);
+                    }
+                }
+
+                sb.append(c);
+            }
+
+            return sb.toString();
+        }
+    }
+
+    public static String toCamelCase(CharSequence name) {
+        if (null == name) {
+            return null;
+        } else {
+            String name2 = name.toString();
+            if (name2.contains("_")) {
+                int length = name2.length();
+                StringBuilder sb = new StringBuilder(length);
+                boolean upperCase = false;
+
+                for(int i = 0; i < length; ++i) {
+                    char c = name2.charAt(i);
+                    if (c == '_') {
+                        upperCase = true;
+                    } else if (upperCase) {
+                        sb.append(Character.toUpperCase(c));
+                        upperCase = false;
+                    } else {
+                        sb.append(Character.toLowerCase(c));
+                    }
+                }
+
+                return sb.toString();
+            } else {
+                return name2;
+            }
+        }
+    }
+
+    public static String sub(String str, Integer maxLen) {
+        if (str.length() > maxLen) {
+            return str.substring(0, maxLen);
+        }
+        return str;
+    }
+
+    public static String generateSeqNum(String lastSeqNum) {
+        if (Cools.isEmpty(lastSeqNum)) {
+            return zeroFill("1", 4);
+        } else {
+            int i = Integer.parseInt(lastSeqNum);
+            if (i >= 9999) {
+                return zeroFill("1", 4);
+            } else {
+                return zeroFill(String.valueOf(i+1), 4);
+            }
+        }
+    }
+
+    // pos start in 0
+    public static boolean getBit(byte b, int position) {
+        if (position < 0 || position > 7) {
+            throw new IllegalArgumentException("Bit position must be between 0 and 7");
+        }
+        int mask = 1 << position;
+        return (b & mask) != 0;
+    }
+
+    public static <T> List<T> singletonList(T o) {
+        List<T> list = new ArrayList<>();
+        list.add(o);
+        return list;
+    }
+
+}
diff --git a/app/src/main/java/com/example/agvcontroller/protocol/ValidUtil.java b/app/src/main/java/com/example/agvcontroller/protocol/ValidUtil.java
new file mode 100644
index 0000000..d889df9
--- /dev/null
+++ b/app/src/main/java/com/example/agvcontroller/protocol/ValidUtil.java
@@ -0,0 +1,55 @@
+package com.example.agvcontroller.protocol;
+
+import io.netty.buffer.ByteBuf;
+
+/**
+ * 鏍¢獙宸ュ叿绫�
+ * Created by vincent on 2019-04-03
+ */
+public class ValidUtil {
+
+    public static final Integer MAX_DEFAULT = 65531;
+
+    /**
+     * 鏍¢獙娑堟伅涓暟鍊兼槸鍚﹀湪瀵瑰簲鍏佽鐨勮寖鍥村唴
+     * @param item  琚牎楠屾暟鎹��
+     * @param min   鍏佽鐨勬渶灏忓��
+     * @param max   鍏佽鐨勬渶澶у��
+     */
+    public static boolean rangeValid(int item, int min, int max) {
+        return !(item < min || item > max);
+    }
+
+    /**
+     * 寮傛垨鏍¢獙鍖呭畬鏁�
+     *      浠庡懡浠ゅ崟鍏冿紙绗笁涓瓧鑺傦級寮�濮嬶紝涓�娆′笌鍚庝竴涓瓧鑺傚紓鎴栵紝鐩磋嚦鍊掓暟绗簩涓瓧鑺傘��
+     *      灏嗗紓鎴栫殑缁撴灉涓庢姤鏂囦腑鏈�鍚庝竴涓瓧鑺傛瘮杈冦��
+     *      -鐩哥瓑锛氭姤鏂囧畬鏁�
+     *      -涓嶇浉绛夛細鎶ユ枃涓嶅畬鏁�
+     */
+    public static boolean validPac(AgvPackage pac) {
+        ByteBuf buf = pac.getSourceBuff();
+        return getValdByteInMsg(pac) == calculateValidByteFromBuff(buf);
+    }
+
+    /**
+     * 浠庡綋鍓嶆暟鎹寘璁$畻鏍¢獙鐮�
+     */
+    public static int calculateValidByteFromBuff(ByteBuf buf) {
+        buf.resetReaderIndex();
+        byte[] bytes = new byte[buf.readableBytes() - PackagePart.VALIDE_CODE.getLen()];
+        buf.readBytes(bytes);
+        int currValidByte = CRCUtils.crc16(bytes);
+        // 閲嶇疆璇绘寚閽�
+        buf.resetReaderIndex();
+        return currValidByte;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏁版嵁鍖呬腑鐨勬牎楠岀爜(鏈�鍚庝竴浣嶅瓧鑺�)
+     */
+    public static int getValdByteInMsg(AgvPackage pac) {
+        return pac.getValidCode();
+    }
+
+}

--
Gitblit v1.9.1