#
whycq
2025-01-17 8ce9ce72d3e32427d01ebe4bf8bef6aa863979ca
#
6个文件已修改
857 ■■■■■ 已修改文件
app/src/main/java/com/example/agvcontroller/Item.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/agvcontroller/ItemAdapter.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/agvcontroller/MainActivity.java 669 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/agvcontroller/StartActivity.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_view_linear.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }
}
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 {
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;
    }
}
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();
    }
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;
        }
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>