From 17bb52d9337328323f5f8d2a806cf4f445673b4a Mon Sep 17 00:00:00 2001
From: whycq <913841844@qq.com>
Date: 星期四, 06 二月 2025 09:20:55 +0800
Subject: [PATCH] #

---
 app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 104 insertions(+), 11 deletions(-)

diff --git a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java
index f27d329..9b07744 100644
--- a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java
+++ b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java
@@ -2,48 +2,107 @@
 
 
 
+import static com.example.agvcontroller.utils.DateUtils.formatDate;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
 import android.util.Log;
 
-import com.example.agvcontroller.Item;
+import com.example.agvcontroller.AGVApplication;
+import com.example.agvcontroller.AGVCar;
 import com.example.agvcontroller.MainActivity;
 import com.example.agvcontroller.action.AGV_11_UP;
 import com.example.agvcontroller.action.AckMsgBuilder;
 import com.example.agvcontroller.met.AbstractInboundHandler;
+import com.example.agvcontroller.protocol.AGV_12_UP;
+import com.example.agvcontroller.protocol.AGV_13_UP;
 import com.example.agvcontroller.protocol.AGV_A1_DOWN;
+import com.example.agvcontroller.protocol.AGV_F0_DOWN;
+import com.example.agvcontroller.protocol.AGV_F0_UP;
 import com.example.agvcontroller.protocol.AgvAction;
 import com.example.agvcontroller.protocol.AgvPackage;
 import com.example.agvcontroller.protocol.ProtocolType;
+import com.example.agvcontroller.utils.DateUtils;
 
 
 import org.greenrobot.eventbus.EventBus;
 
+import java.net.InetSocketAddress;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 public class NettyServerHandler  extends AbstractInboundHandler<AgvPackage> {
 
     private static final String TAG = "NettyServerHandler";
     private static ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>();
+    private Map<String, Runnable> pendingRemovals = new HashMap<>();
+    private Handler handler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            String clientId = (String) msg.obj;
+            removeItem(clientId);
+        }
+    };
 
 
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         String clientId = ctx.channel().remoteAddress().toString();
+        InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
+        String ip = remoteAddress.getAddress().getHostAddress();
+        int port = remoteAddress.getPort();
         channelMap.put(clientId, ctx.channel());
-        EventBus.getDefault().post(new Item("1",clientId,"3"));
+        EventBus.getDefault().post(new AGVCar(clientId,ip,port,"--",0));
         Log.d(TAG, "Client connected: " + clientId);
+
+        // 鍙栨秷寤惰繜鍒犻櫎鎿嶄綔
+        if (pendingRemovals.containsKey(clientId)) {
+            handler.removeCallbacks(pendingRemovals.get(clientId));
+            pendingRemovals.remove(clientId);
+        }
+
     }
 
     @Override
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         String clientId = ctx.channel().remoteAddress().toString();
+        InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
+        String ip = remoteAddress.getAddress().getHostAddress();
+        int port = remoteAddress.getPort();
         channelMap.remove(clientId);
         EventBus.getDefault().post(clientId);
         Log.d(TAG, "Client disconnected: " + clientId);
+
+        // 鍚姩寤惰繜鍒犻櫎鎿嶄綔
+        Runnable removalRunnable = new Runnable() {
+            @Override
+            public void run() {
+                removeItem(clientId);
+            }
+        };
+        pendingRemovals.put(clientId, removalRunnable);
+        handler.postDelayed(removalRunnable, 20000); // 20绉掑悗鎵ц鍒犻櫎鎿嶄綔
+
+    }
+
+
+    private void removeItem(String clientId) {
+        if (channelMap.remove(clientId) != null) {
+            Log.d(TAG, "Client removed after 20 seconds: " + clientId);
+            EventBus.getDefault().post(clientId);
+        } else {
+            Log.d(TAG, "Client already reconnected or not found: " + clientId);
+        }
     }
 
 //    @Override
@@ -66,31 +125,64 @@
 
     @Override
     protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception {
-
-        String serialNum = pac.getHeader().getSerialNum();
+        String clientId = ctx.channel().remoteAddress().toString();
+        InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
+        String ip = remoteAddress.getAddress().getHostAddress();
+        int port = remoteAddress.getPort();
+        Log.i("clientId--->",clientId);
+        Log.i("substring",pac.toString());
+        String serialNum = pac.getBody().getMessageBody().getSerialNo();
+        Log.i("substring",serialNum);
+        MainActivity.map.put(serialNum, Boolean.TRUE);
         // ack
         ProtocolType ackType = isNeedAck(pac);
         final String uniqueNo = pac.getHeader().getUniqueNo();
+        String agvNo;
         label : switch (pac.getHeader().getProtocolType()){
             case ACTION_COMPLETE:   // 鍔ㄤ綔瀹屾垚鏁版嵁鍖�
-
-
                 AGV_11_UP agv_11_up = (AGV_11_UP) pac.getBody().getMessageBody();
 //                redis.push(RedisConstant.AGV_COMPLETE_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_11_up));
-
                 // 鍔ㄤ綔瀹屾垚搴旂瓟
                 if (null != ackType) {
                     AgvPackage ackPac = AckMsgBuilder.ofSuccess(pac, ackType);
-
                     AGV_A1_DOWN agv_a1_down = (AGV_A1_DOWN) ackPac.getBody().getMessageBody();
                     agv_a1_down.setAckSign((byte) agv_11_up.getCompleteCode());
+                    ctx.writeAndFlush(ackPac);
+                }
+                break label;
+            case DATA_CODE_REPORT:
+                AGV_12_UP agv_12_up = (AGV_12_UP) pac.getBody().getMessageBody();
+                agvNo = pac.getHeader().getUniqueNo();
+                channelMap.put(clientId, ctx.channel());
+                EventBus.getDefault().post(new AGVCar(clientId,ip,port,agvNo,1));
+                break label;
+            case DATA_WITHOUT_CODE_REPORT:
+                AGV_13_UP agv_13_up = (AGV_13_UP) pac.getBody().getMessageBody();
+                agvNo = pac.getHeader().getUniqueNo();
+                channelMap.put(clientId, ctx.channel());
+                EventBus.getDefault().post(new AGVCar(clientId,ip,port,agvNo,1));
+                break label;
+            case LOGIN_REPORT:
+                AGV_F0_UP agv_f0_up = (AGV_F0_UP) pac.getBody().getMessageBody();
+                if (null != ackType) {
+                    AgvPackage ackPac = AckMsgBuilder.ofSuccess(pac, ackType);
+                    AGV_F0_DOWN agv_f0_down = (AGV_F0_DOWN) ackPac.getBody().getMessageBody();
+                    String log = formatDate(new Date(), "yyyy-MM-dd HH:mm:ss") + " 涓婅: " + ip + "[鐧诲綍鍖匽>>>" + pac.getSourceHexStr();
+                    Log.d("updown", log);
+                    AGVApplication.addLog(log);
+
+//                    EventBus.getDefault().post(log);
 
                     ctx.writeAndFlush(ackPac);
                 }
-
-                MainActivity.map.put(serialNum, Boolean.TRUE);
-
+                final int battery = agv_f0_up.getBattery();
+//                pac.getBody().getMessageBody()
+                agvNo = pac.getHeader().getUniqueNo();
+                channelMap.put(clientId, ctx.channel());
+                 AGVCar agvCar = new AGVCar(clientId, ip, port, agvNo, 1, battery,0,0,0,0,0,0,0,0,0,0);
+                EventBus.getDefault().post(agvCar);
                 break label;
+
         }
         return false;
     }
@@ -102,6 +194,7 @@
         }
         return sb.toString();
     }
+
     // 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
     private byte[] hexStringToByteArray(String s) {
         int len = s.length();

--
Gitblit v1.9.1