From 8ce9ce72d3e32427d01ebe4bf8bef6aa863979ca Mon Sep 17 00:00:00 2001
From: whycq <913841844@qq.com>
Date: 星期五, 17 一月 2025 15:48:36 +0800
Subject: [PATCH] #

---
 app/src/main/java/com/example/agvcontroller/MainActivity.java              |  669 +++++++++++++++++++++++---------------------
 app/src/main/java/com/example/agvcontroller/Item.java                      |   48 ++
 app/src/main/java/com/example/agvcontroller/StartActivity.java             |   34 +
 app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java |   67 ++++
 app/src/main/res/layout/item_view_linear.xml                               |   12 
 app/src/main/java/com/example/agvcontroller/ItemAdapter.java               |   27 +
 6 files changed, 503 insertions(+), 354 deletions(-)

diff --git a/app/src/main/java/com/example/agvcontroller/Item.java b/app/src/main/java/com/example/agvcontroller/Item.java
index e21f97b..dfa7a7a 100644
--- a/app/src/main/java/com/example/agvcontroller/Item.java
+++ b/app/src/main/java/com/example/agvcontroller/Item.java
@@ -1,31 +1,57 @@
 package com.example.agvcontroller;
 
 public class Item {
-
-    private String text;
+    private String clientId;
     private String ip;
+    private int port;
     private String agvNo;
-    private int id;
+    private int status;
 
-    public Item(String text,String ip,String agvNo) {
-        this.text = text;
+    public Item(String clientId,String ip,int port,String agvNo,int status) {
+        this.clientId = clientId;
         this.ip = ip;
+        this.port = port;
         this.agvNo = agvNo;
+        this.status = status;
     }
-
-    public String getText() {
-        return text;
-    }
+    public String getClientId() {return clientId; }
 
     public String getIp() {
         return ip;
     }
 
+    public int getPort() {
+        return port;
+    }
+
+
     public String getAgvNo() {
         return agvNo;
     }
 
-    public int getId() {
-        return id;
+    public int getStatus() {
+        return status;
+    }
+
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+
+    public void setAgvNo(String agvNo) {
+        this.agvNo = agvNo;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
     }
 }
diff --git a/app/src/main/java/com/example/agvcontroller/ItemAdapter.java b/app/src/main/java/com/example/agvcontroller/ItemAdapter.java
index db65138..e644a97 100644
--- a/app/src/main/java/com/example/agvcontroller/ItemAdapter.java
+++ b/app/src/main/java/com/example/agvcontroller/ItemAdapter.java
@@ -3,6 +3,7 @@
 import static androidx.core.content.ContextCompat.startActivity;
 
 import android.content.Intent;
+import android.graphics.Color;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -23,13 +24,15 @@
     }
 
     public static class ViewHolder extends RecyclerView.ViewHolder {
-        TextView title;
+        TextView agvNo;
         TextView ip;
+        TextView port;
 
         public ViewHolder(@NonNull View itemView) {
             super(itemView);
-            title = itemView.findViewById(R.id.item_title);
+            agvNo = itemView.findViewById(R.id.item_agvNo);
             ip = itemView.findViewById(R.id.item_ip);
+            port = itemView.findViewById(R.id.item_port);
 
             itemView.setOnClickListener(new View.OnClickListener() {
                 @Override
@@ -79,17 +82,24 @@
 
     @Override
     public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
-        //Item item = itemList.get(position);
-        //holder.ip.setText("璁惧IP锛� " + item.getIp());
-        //holder.title.setText("璁惧缂栧彿锛� " + item.getText());
         if (itemList == null || itemList.isEmpty()) {
             // 榛樿鏄剧ず椤甸潰
             //return 1;
         } else {
-            // 鏁版嵁鏄剧ず椤甸潰
             Item item = itemList.get(position);
-            holder.ip.setText("璁惧IP锛� " + item.getIp());
-            holder.title.setText("璁惧缂栧彿锛� " + item.getAgvNo());
+            int status = item.getStatus();
+            switch (status) {
+                case 0:
+                    holder.itemView.setBackgroundColor(Color.GRAY);
+                    break;
+               default:
+                   holder.itemView.setBackgroundColor(Color.GREEN);
+                   break;
+            }
+            holder.agvNo.setText("AGV_NO锛� " + item.getAgvNo());
+            holder.ip.setText("AGV_IP锛� " + item.getIp());
+            holder.port.setText("AGV_PORT锛� " + item.getPort());
+
             holder.itemView.setTag(position);
 
         }
@@ -97,7 +107,6 @@
 
     @Override
     public int getItemCount() {
-        //return itemList.size();
         if (itemList == null || itemList.isEmpty()) {
             return 1;
         } else {
diff --git a/app/src/main/java/com/example/agvcontroller/MainActivity.java b/app/src/main/java/com/example/agvcontroller/MainActivity.java
index 5e68826..9503614 100644
--- a/app/src/main/java/com/example/agvcontroller/MainActivity.java
+++ b/app/src/main/java/com/example/agvcontroller/MainActivity.java
@@ -7,8 +7,6 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.ColorStateList;
-import android.graphics.Color;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -168,13 +166,14 @@
         @Override
         public boolean handleMessage(Message msg) {
             String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-            short pwd = 0;
             if (isGoForward) {
+                Log.d(TAG, "isGoForward: " + isGoForward);
                 AgvAction agvAction = new AgvAction<>(ForwardBackAction.class)
                         .setAgvNo(AgvNo)
                         .setSerialNo(substring)
                         .setVal(1)
                         .bodySync((action) -> action.setPwd((short) 50));
+                Log.d(TAG, "isGoForward: " + clientId);
                 nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
                 handler.sendEmptyMessageDelayed(0, 100);  //  100ms 鍚庡彂閫佷笅涓�鏉℃秷鎭�
             }
@@ -206,21 +205,165 @@
                 handler.sendEmptyMessageDelayed(0, 100);
             }
 
-            if (isRotatopnRight) {
-                AgvAction agvAction = new AgvAction<>(RotatopnLeftRight.class)
+            if (isFront1) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
                         .setAgvNo(AgvNo)
                         .setSerialNo(substring)
                         .setVal(1)
-                        .bodySync((action) -> action.setPwd((short) 50));
+                        .bodySync((action) -> action.setPwd((short) 99));
                 nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
                 handler.sendEmptyMessageDelayed(0, 100);
             }
-            if (isRotatopnLeft) {
-                AgvAction agvAction = new AgvAction<>(RotatopnLeftRight.class)
+            if (isBack1) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
                         .setAgvNo(AgvNo)
                         .setSerialNo(substring)
                         .setVal(1)
-                        .bodySync((action) -> action.setPwd((short) -50 ));
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront2) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(2)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack2) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(2)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront3) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(3)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack3) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(3)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront4) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(4)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack4) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(4)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront5) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(5)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack5) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(5)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront6) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(6)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack6) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(6)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront7) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(7)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack7) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(7)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront8) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(8)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack8) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(8)
+                        .bodySync((action) -> action.setPwd((short) -99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isFront9) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(9)
+                        .bodySync((action) -> action.setPwd((short) 99));
+                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                handler.sendEmptyMessageDelayed(0, 100);
+            }
+            if (isBack9) {
+                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
+                        .setAgvNo(AgvNo)
+                        .setSerialNo(substring)
+                        .setVal(9)
+                        .bodySync((action) -> action.setPwd((short) -99));
                 nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
                 handler.sendEmptyMessageDelayed(0, 100);
             }
@@ -228,13 +371,14 @@
         }
     });
 
-    String clientId;
+    static String clientId;
     NettyServerHandler nettyServerHandler;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
+
 
         // 鎸夐挳闇囧姩
         vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
@@ -306,8 +450,14 @@
 
 
         Intent intent = getIntent();
-        clientId = intent.getStringExtra("ip");
-        AgvNo = intent.getStringExtra("agvNo");
+        if (intent != null) {
+            String newClientId = intent.getStringExtra("clientId");
+            if (newClientId != null) {
+                clientId = newClientId;
+                AgvNo = intent.getStringExtra("agvNo");
+            }
+        }
+
         Log.i("message1",clientId);
 
         // 鍓嶆嫧鏉嗕几鍑�
@@ -690,7 +840,7 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(1)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
                     axleFrontBtn1.setVisibility(View.VISIBLE);
                     axleBackBtn1.setVisibility(View.VISIBLE);
@@ -699,7 +849,7 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(1)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
                     axleFrontBtn1.setVisibility(View.GONE);
                     axleBackBtn1.setVisibility(View.GONE);
@@ -720,15 +870,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(2)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn2.setVisibility(View.VISIBLE);
+                    axleBackBtn2.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(2)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn2.setVisibility(View.GONE);
+                    axleBackBtn2.setVisibility(View.GONE);
                 }
             }
         });
@@ -746,15 +900,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(3)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn3.setVisibility(View.VISIBLE);
+                    axleBackBtn3.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(3)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn3.setVisibility(View.GONE);
+                    axleBackBtn3.setVisibility(View.GONE);
                 }
             }
         });
@@ -772,15 +930,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(4)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn4.setVisibility(View.VISIBLE);
+                    axleBackBtn4.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(4)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn4.setVisibility(View.GONE);
+                    axleBackBtn4.setVisibility(View.GONE);
                 }
             }
         });
@@ -828,15 +990,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(6)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn6.setVisibility(View.VISIBLE);
+                    axleBackBtn6.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(6)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn6.setVisibility(View.GONE);
+                    axleBackBtn6.setVisibility(View.GONE);
                 }
             }
         });
@@ -854,15 +1020,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(7)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn7.setVisibility(View.VISIBLE);
+                    axleBackBtn7.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(7)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn7.setVisibility(View.GONE);
+                    axleBackBtn7.setVisibility(View.GONE);
                 }
             }
         });
@@ -880,15 +1050,19 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(8)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn8.setVisibility(View.VISIBLE);
+                    axleBackBtn8.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(8)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn8.setVisibility(View.GONE);
+                    axleBackBtn8.setVisibility(View.GONE);
                 }
             }
         });
@@ -906,307 +1080,23 @@
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(9)
-                            .bodySync((action) -> action.setPwd((short) 0));
+                            .bodySync((action) -> action.setPwd((short) 1));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn9.setVisibility(View.VISIBLE);
+                    axleBackBtn9.setVisibility(View.VISIBLE);
                 } else {
                     AgvAction agvAction = new AgvAction<>(SingleSwitchAction.class)
                             .setAgvNo(AgvNo)
                             .setSerialNo(substring)
                             .setVal(9)
-                            .bodySync((action) -> action.setPwd((short) 1));
+                            .bodySync((action) -> action.setPwd((short) 0));
                     nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
+                    axleFrontBtn9.setVisibility(View.GONE);
+                    axleBackBtn9.setVisibility(View.GONE);
                 }
             }
         });
 
-
-        axleFrontBtn1.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(1)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn1.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(1)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn2.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(2)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn2.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(2)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn3.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(3)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn3.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(3)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn4.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(4)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn4.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(4)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn5.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(5)
-                        .bodySync((action) -> action.setPwd((short) 99));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn5.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(5)
-                        .bodySync((action) -> action.setPwd((short) -99));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn6.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(6)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn6.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(6)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn7.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(7)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn7.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(7)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn8.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(8)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn8.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(8)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleFrontBtn9.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(9)
-                        .bodySync((action) -> action.setPwd((short) 100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
-
-        axleBackBtn9.setOnClickListener(new View.OnClickListener(){
-            @Override
-            public void onClick(View v) {
-                if (vibrator != null && vibrator.hasVibrator()) {
-                    vibrator.vibrate(500);
-                }
-                String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16);
-                AgvAction agvAction = new AgvAction<>(SingleSwitchRunAction.class)
-                        .setAgvNo(AgvNo)
-                        .setSerialNo(substring)
-                        .setVal(9)
-                        .bodySync((action) -> action.setPwd((short) -100));
-                nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔�
-            }
-        });
 
         // 鐐瑰姩鎸夐挳
         stopBtn.setOnTouchListener(new CarTouchButton());
@@ -1275,15 +1165,152 @@
                 } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
                     isRotatopnRight = false;
                 }
-            } else if (view.getId() == R.id.btn_rotatopn_right) {
+            } else if (view.getId() == R.id.btn_axle_1_front) {
                 // 杞村姩鎸夐挳
                 if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
-                    isRotatopnRight = true;
+                    isFront1 = true;
                     handler.sendEmptyMessage(0);
                 } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
-                    isRotatopnRight = false;
+                    isFront1 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_1_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack1 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack1 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_2_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront2 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront2 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_2_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack2 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack2 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_3_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront3 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront3 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_3_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack3 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack3 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_4_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront4 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront4 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_4_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack4 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack4 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_5_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront5 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront5 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_5_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack5 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack5 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_6_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront6 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront6 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_6_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack6 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack6 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_7_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront7 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront7 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_7_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack7 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack7 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_8_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront8 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront8 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_8_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack8 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack8 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_9_front) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isFront9 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isFront9 = false;
+                }
+            } else if (view.getId() == R.id.btn_axle_9_back) {
+                // 杞村姩鎸夐挳
+                if (motionEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                    isBack9 = true;
+                    handler.sendEmptyMessage(0);
+                } else if (motionEvent.getAction() == KeyEvent.ACTION_UP) {
+                    isBack9 = false;
                 }
             }
+
 
 
             return false;
@@ -1334,4 +1361,8 @@
         //SocketManager.getInstance().stopServer();
         //socketManager.stopServer(); // 鍋滄鏈嶅姟鍣�
     }
+
+    public static void upClient(String newClientId) {
+        clientId = newClientId;
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/agvcontroller/StartActivity.java b/app/src/main/java/com/example/agvcontroller/StartActivity.java
index d8d5a29..e6592be 100644
--- a/app/src/main/java/com/example/agvcontroller/StartActivity.java
+++ b/app/src/main/java/com/example/agvcontroller/StartActivity.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
@@ -25,11 +26,13 @@
     private List<Item> items;
     private ItemAdapter adapter;
     SocketManager socketManager;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
 
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_start);
+
 
         recyclerView = findViewById(R.id.recyclerView);
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -47,8 +50,14 @@
             public void onItemClick(View view, int position) {
                 Context context = view.getContext();
                 Intent intent = new Intent(context,MainActivity.class);
-                intent.putExtra("ip", items.get(position).getIp());
-                intent.putExtra("agvNo", items.get(position).getAgvNo());
+                String ip = items.get(position).getIp();
+                String clientId = items.get(position).getClientId();
+                String agvNo = items.get(position).getAgvNo();
+
+
+                intent.putExtra("ip", ip);
+                intent.putExtra("agvNo", agvNo);
+                intent.putExtra("clientId", clientId);
                 startActivityForResult(intent,1);
             }
         });
@@ -61,19 +70,34 @@
         Log.i("EventBus", "Received device connected: " + deviceAddress);
 
 
-        if (items.size() > 0) {
+        if (!items.isEmpty()) {
             int sameIp = 0;
             for (Item item : items) {
                 if (item.getIp().equals(deviceAddress.getIp())) {
+                    item.setAgvNo(deviceAddress.getAgvNo());
+                    item.setPort(deviceAddress.getPort());
+                    item.setClientId(deviceAddress.getClientId());
+                    item.setStatus(deviceAddress.getStatus());
+                    adapter.notifyItemChanged(items.indexOf(item));
+                    MainActivity.upClient(deviceAddress.getClientId());
                     sameIp++;
                 }
                 Log.i("Item",item.getIp());
+                Log.i("Item",item.getClientId());
             }
             if (sameIp == 0) {
-                items.add(new Item(deviceAddress.getText(),deviceAddress.getIp(),deviceAddress.getAgvNo()));
+                items.add(new Item(deviceAddress.getClientId()
+                        ,deviceAddress.getIp()
+                        ,deviceAddress.getPort()
+                        ,deviceAddress.getAgvNo()
+                        ,deviceAddress.getStatus()));
             }
         } else {
-            items.add(new Item(deviceAddress.getText(),deviceAddress.getIp(),deviceAddress.getAgvNo()));
+            items.add(new Item(deviceAddress.getClientId()
+                    ,deviceAddress.getIp()
+                    ,deviceAddress.getPort()
+                    ,deviceAddress.getAgvNo()
+                    ,deviceAddress.getStatus()));
         }
         adapter.notifyDataSetChanged();
     }
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 5df8f0e..6496e59 100644
--- a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java
+++ b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java
@@ -7,6 +7,10 @@
 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;
@@ -27,28 +31,74 @@
 
 import org.greenrobot.eventbus.EventBus;
 
+import java.net.InetSocketAddress;
+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();
-//        channelMap.put(clientId, ctx.channel());
-//        EventBus.getDefault().post(new Item("",clientId,"3"));
-//        Log.d(TAG, "Client connected: " + clientId);
+        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(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
@@ -72,6 +122,9 @@
     @Override
     protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception {
         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();
@@ -97,13 +150,13 @@
                 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 Item("",clientId,agvNo));
+                EventBus.getDefault().post(new Item(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 Item("",clientId,agvNo));
+                EventBus.getDefault().post(new Item(clientId,ip,port,agvNo,1));
                 break label;
             case LOGIN_REPORT:
                 AGV_F0_UP agv_f0_up = (AGV_F0_UP) pac.getBody().getMessageBody();
@@ -114,7 +167,7 @@
                 }
                 agvNo = pac.getHeader().getUniqueNo();
                 channelMap.put(clientId, ctx.channel());
-                EventBus.getDefault().post(new Item("",clientId,agvNo));
+                EventBus.getDefault().post(new Item(clientId,ip,port,agvNo,1));
                 break label;
 
         }
diff --git a/app/src/main/res/layout/item_view_linear.xml b/app/src/main/res/layout/item_view_linear.xml
index 94489f4..ab0a0c8 100644
--- a/app/src/main/res/layout/item_view_linear.xml
+++ b/app/src/main/res/layout/item_view_linear.xml
@@ -15,19 +15,25 @@
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="9"
+            android:padding="10dp"
             android:orientation="vertical">
 
+            <TextView
+                android:id="@+id/item_agvNo"
+                android:layout_width="match_parent"
+                android:layout_height="25dp"
+                android:text="agvNo" />
             <TextView
                 android:id="@+id/item_ip"
                 android:layout_width="match_parent"
                 android:layout_height="25dp"
-                android:text="matnr1" />
+                android:text="ip" />
 
             <TextView
-                android:id="@+id/item_title"
+                android:id="@+id/item_port"
                 android:layout_width="match_parent"
                 android:layout_height="25dp"
-                android:text="matnr" />
+                android:text="port" />
 
 
         </LinearLayout>

--
Gitblit v1.9.1