0

我正在使用终端仿真器库来创建终端,然后使用它将通过串行输入的数据发送到串行设备。当数据被发回时,我想解析它并在editText中向用户显示最重要的信息。目前我收到字节数组/块并将它们转换为字符串。当我得到一个 \r 或 \n 时,我创建一个新字符串并重复该过程。这对于大多数命令来说都很好,但是有些命令会通过多行返回结果,例如此处的“show vlan”:

在此处输入图像描述

当我遍历这个时,我得到每一行的字符串。例如,第一个将包含 VLAN 名称状态和端口。所以现在我有一个问题,我怎样才能让 VLAN 1 有 x 个端口处于活动状态。它们在不同的字符串中。这是我对一行感兴趣的当前更简单命令的代码和屏幕截图:

在此处输入图像描述

Handler viewHandler = new Handler();
Runnable updateView = new Runnable() {
    @Override

    public void run() {

        mEmulatorView.invalidate();

        if (statusBool == true) {
            for (int i = 0; i < dataReceived.length(); i++) {
                parseCommand = parseCommand + dataReceived.charAt(i);

 if (dataReceived.charAt(i) == '\n' || dataReceived.charAt(i) == '\r'){

    if(parseCommand.contains("KlasOS"))
            {

        String[] tokens = parseCommand.split("\\s{1,}");

        final String ReceivedText = mReceiveBox.getText().toString() + " "
        + new String("Software Version: " + tokens[1] + "\n" );

        runOnUiThread(new Runnable() {
            public void run() {
                                mReceiveBox.setText(ReceivedText);
                                mReceiveBox.setSelection(ReceivedText.length());

                            }
                        });         

                            }

                parseCommand = "";

            }               
            }

            statusBool = false;
            viewHandler.postDelayed(updateView, 1000);
        }
    }
};

现在我想改变它,这样我就可以处理多行了。如果字符串包含某些信息,最好的方法是存储字符串吗?

我需要在右手editText上输出这个:

"以下端口在 vlan 1 上:Fa1/0, fa1/1, fa1/2, fa1/3, fa1/4, fa1/5, fa1/6, fa1/7, fa1/8, fa1/9, fa1 /10, fa1/11, Gi0"

4

2 回答 2

2

基本上,您需要一种可靠地检测命令结果结束的方法。然后归结为发送您的命令,从设备读取数据直到遇到结果的结尾,最后解析该结果。

switch#我会像您在自己的答案中那样扫描提示 ( )。也许您甚至可以强制设备使用更特殊的字符序列,这不太可能出现在命令的常规输出中,并且更容易检测结果的结尾。例如,您可以尝试将提示配置为包含控制字符,如 ^G 或 ^L。或者,如果您的用户不介意,您总是可以发送第二个命令来发出这样的序列,例如“show vlan; echo ^G”。

您还应该为命令错误做好准备,这会导致不同的输出,例如,预期的更多或更少的行或完全不同的输出格式。结果甚至可能同时包含常规输出和警告或错误。

于 2013-02-07T22:09:55.360 回答
0

我用一个布尔值和几个字符串以一种凌乱的方式解决了这个问题。我做了一个附加字符串的方法。

if((parseCommand.contains("VLAN Name") && parseCommand.contains("Status")&& parseCommand.contains("Ports")) 
                            || ((ShowVlanAppend.contains("VLAN Name")&& ShowVlanAppend.contains("Status")&& ShowVlanAppend.contains("Ports"))))
                        {
                                commandParse();
                                if(finalCommandBool == true){
                                runOnUiThread(new Runnable() {
                                    public void run() {

                                        mReceiveBox.setText(finalCommand);
                                        mReceiveBox.setSelection(finalCommand.length());
                                        ShowVlanAppend = "";
                                        finalCommand = "";
                                        finalCommandBool = false;
                                    }
                                });

                                }


                        }
 public void commandParse()

        {
            if (!parseCommand.contains("switch#")){
            ShowVlanAppend = ShowVlanAppend + parseCommand;
            }
            else{
                finalCommand = ShowVlanAppend;
                finalCommandBool = true;
            }

        }
于 2013-02-04T15:28:29.593 回答