2013-02-01 2 views
0

터미널 에뮬레이터 라이브러리를 사용하여 터미널을 만든 다음 직렬을 통해 입력 한 데이터를 직렬 장치로 보내는데 사용합니다. 데이터를 다시 보내면 구문 ​​분석하고 editText에서 사용자에게 가장 중요한 정보를 표시하려고합니다. 현재 바이트 배열/청크를 받고 문자열로 변환합니다. 내가 \ r 또는 \ n을 얻었을 때 나는 새로운 문자열과 프로세스를 반복한다. 이것은 대부분의 명령에 대한 괜찮 그러나 일부 명령은 여기에 "쇼 VLAN을"과 같은 여러 줄에 걸쳐 결과를 반환 :여러 문자열에서 텍스트를 구문 분석하는 방법은 무엇입니까?

enter image description here

는이를 통해 내가 루프는 내가 각 라인에 대한 문자열을 얻을 때. 첫 번째는 VLAN Name Status와 Ports를 예로들 수 있습니다. 그래서 지금 문제가 있습니다. 어떻게 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); 
     } 
    } 
}; 

enter image description here 지금 나는 이것이 내가 여러 줄을 처리 할 수 ​​변경하려면 다음은 코드와 스크린 샷 내가 한 줄에 관심이 전류 쉽게 명령입니다. 문자열에 특정 정보가 포함되어 있다면 문자열을 저장하는 것이 가장 쉬운 방법일까요?

"다음 포트 VLAN 1이다 : FA1/0, FA1/1 FA1/2 FA1/3 FA1/4 FA1/5

는 I이 오른쪽 EDITTEXT에 출력해야 , fa1/6, fa1/7, fa1/8, fa1/9, fa1/10, fa1/11, Gi0 "

답변

2

기본적으로 명령 결과의 끝을 확실하게 감지하는 방법이 필요합니다. 그런 다음 결과가 끝날 때까지 장치에서 데이터를 읽은 다음 마지막으로 그 결과를 구문 분석하여 명령을 전송합니다.

당신이 당신 자신의 답을하는 것처럼 프롬프트 (switch#)를 검색 할 것입니다. 어쩌면 사용자가 장치에 더 특이한 문자 시퀀스를 사용하게 할 수도 있습니다.이 명령 시퀀스는 명령의 정규 출력에서 ​​발생하기 쉽지 않으며 결과의 끝을보다 쉽게 ​​감지 할 수 있습니다. 예를 들어^G 또는^L과 같은 제어 문자를 포함하도록 프롬프트를 구성 할 수 있습니다. 또는 사용자가 신경 쓸 필요가 없다면 "show vlan; echo^G"와 같이 항상 이러한 시퀀스를 내보내는 두 번째 명령을 보낼 수 있습니다.

명령 오류에 대비해야합니다. 예를 들어, 예상되는 행 수가 많거나 적거나 출력 형식이 완전히 다를 수 있습니다. 결과에는 정규 출력과 경고 또는 오류가 모두 포함될 수도 있습니다.

+0

매우 흥미 롭습니다. 답변을 수락하겠습니다. 나는 부분적으로 나를 위해 일하는 에코 옵션을 좋아한다. 불행히도 고객은 원하는대로 스위치 이름을 변경할 수 있습니다. 그러나 나는 #에 끝날 것입니다. 이 때문에 지금 코드를 변경해야 할 수도 있습니다. 아마도 그 전에 문자가있는 해시가 있는지 확인할 수 있습니다. 감사합니다. 명령에 따라 출력을 다룰 것입니다. 다행스럽게도 실제 스위치를 코딩하므로 많은 편차가 없을 것입니다. – 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; 
      } 

     } 
관련 문제