0

ターミナルエミュレータライブラリを使用してターミナルを作成し、それを使用して、シリアルで入力されたデータをシリアルデバイスに送信します。データが返送されたら、それを解析して、editTextでユーザーに最も重要な情報を表示したいと思います。現在、バイト配列/チャンクを受け取り、それらを文字列に変換しています。\rまたは\nを取得すると、新しい文字列を作成し、プロセスを繰り返します。これはほとんどのコマンドで問題ありませんが、一部のコマンドは、ここで「showvlan」のように複数行にわたって結果を返します。

ここに画像の説明を入力してください

これをループすると、各行に文字列が表示されます。最初の例には、VLAN名のステータスとポートが含まれます。だから今私は問題を抱えています、どうすればVLAN1でxポートをアクティブにすることができますか?それらは異なる文字列になっています。これが、1行に関心がある現在の簡単なコマンドのコードとスクリーンショットです。

ここに画像の説明を入力してください

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に出力する必要があります。

"次のポートはVLAN1にあります: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」など、そのようなシーケンスを発行する2番目のコマンドをいつでも送信できます。

また、コマンドエラーに備えておく必要があります。これにより、出力が異なります。たとえば、予想どおりに行数が増減したり、出力形式がまったく異なる場合があります。結果には、通常の出力と警告またはエラーの両方が含まれる場合もあります。

于 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 に答える