2013-02-01 41 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; 
      } 

     }