2013-02-01 43 views
0

我正在使用终端仿真程序库创建终端,然后使用它将通过串行输入的数据发送到串行设备。当数据发回时,我想解析它,并在editText中向用户显示最重要的信息。目前我收到字节数组/块,并将它们转换为字符串。当我得到一个\ r或一个\ n我crete一个新的字符串,并重复这个过程。这是对大多数命令,但有些命令返回结果多行像“秀VLAN”在这里:如何从多个字符串解析文本?

enter image description here

当我遍历这个,我得到的每一行的字符串。作为示例,第一个将包含“VLAN名称状态”和“端口”。所以,现在我有一个问题,我怎么能VLAN 1有活动的X端口。他们在不同的字符串中。下面是代码和屏幕截图电流更容易命令,其中我感兴趣的一行:

enter image description here

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“

回答

2

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

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

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

+0

非常感谢,我会接受你的回答。我喜欢回声选项,这将部分适用于我(只适用于atm按钮),需要思考。不幸的是,客户可以将开关名称更改为任何他们想要的东西,我只是想过,但它总是以#结尾。由于这个原因,我可能需要更改我的代码,也许在检查之前有一个带有字母的散列。谢谢,根据命令我会处理任何输出,幸运的是我编码的实际开关也知道不会有太大的偏差。 – Paul

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; 
      } 

     }