2017-01-12 6 views
0

ネットワークに接続されたポート22を介して通信するワイヤレスデバイスがあります。デバイスが起動すると、すぐにログデータの送信が開始されます。このデバイスにコマンドが送信されると、ロギングは停止し、それに応じて応答します。これはすべて動作し、私はそれをテルネットクライアントを使ってテストしました。ソケットを使用してネットワークデバイスに書き込む際の問題

私の問題は、私のアプリケーションでコマンドを正しく送信できないようです。私は計画どおりのログデータを読んでいますが、コマンド(この場合はコマンド "r")を送信すると、その特定のコマンドで表示する必要があるログデータを出力し続けます。これは私がコマンドを正しく送信していないことを意味しています。これは、コマンドを送信し、アンドロイドのlogcatに出力を記録するタスクのコードです。

public class ReceiveVarTask extends AsyncTask<Void, Void, Void>{ 
    String dstAddress; 
    int Port; 

    ReceiveVarTask(String addr, int port) { 
     dstAddress = addr; 
     Port = port; 
    } 

    protected Void doInBackground(Void... vars){ 
     Socket socket = null; 
     String command = "r"; 

     try { 
      Log.i(TAG, "Connecting to port 22"); 
      socket = new Socket(dstAddress, Port); 
      Log.i(TAG, "Connected to port 22"); 

      PrintWriter writer = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), true); 

      InputStream inputStream = socket.getInputStream(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

      writer.println(command); 

      String line = reader.readLine(); 

      Log.i(TAG, line); 

      while(line!=null && !isCancelled()){ 

       line = reader.readLine(); 
       Log.i(TAG, line); 
      } 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 

    protected void onPostExecute(Void arg) { 
     taskRunning = false; 
    } 
} 

私は間違っていますか?コマンドを登録していないのはなぜですか?

UPDATE:

私はテストのために、いくつかのtelnetクライアントを使用している、といくつかで期待どおりのサーバーは「R」コマンドを読んでいます。これは、Windowsのtelnetクライアントを使用して動作し、VelestarのvSSHアプリケーションを使用して動作します。興味深いことに、ClockworkModによってAndroid telnetクライアントでこれをテストすると、サーバーはコマンドを登録していません。

エンコードと何か関係はありますか?

ソケットで作業するために追加の権限が必要ですか?私はandroid.permission.INTERNETをマニフェストで宣言しました。

UPDATE 2:

ハードウェアのの開発者はハードウェアだけはASCIIエンコードするためのコマンドを期待しているし、CRが終了したことを私に言いました。

PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "ASCII")), true); 

と、印刷コマンドへ::だから私はPrintWrite初期設定を変更しようとするあなたの問題の説明の私の理解から

writer.print(command+"\r"); 

答えて

-1

、あなたはtelnetサーバを持っている、とのtelnetクライアントがに接続するときそのサーバーは、サーバーがクライアント・ログ・データの送信を開始します。クライアントは、ログストリームを停止するためにサーバーに "r"を送信することがあります。

  • "r"を送信すると、サーバーがより多くのログデータを生成するのを止める別のTelnetクライアントを使用して最初に確認することをお勧めします。
  • "r"コマンドが実際に送信されているかどうかを確認するためにWiresharkを使用できます。
+0

私はいくつかのTelnetクライアントを使用していますが、これは機能します。私はWindowsのtelnetクライアントを使用して動作し、VelestarのvSSHアプリケーションを使用して動作します。興味深いことに、ClockworkModによってAndroid telnetクライアントでこれをテストすると、サーバーはコマンドを登録していません。 – David

+0

トピックオフ... Android用のssh/telnetクライアントについては、間違いなくJuice SSHを試してみてください。無料です。 Android向けの最高のssh/telnetクライアントです。 =)あなたのAndroid telnetクライアントが送信しているものを試してみて、他のtelnetクライアントと比較してみましょうか?おそらく、行末やtelnet設定のような単純なものかもしれませんが、もっとテスト結果を見ることなく、今は何も考えることができません。問題が何であるかを知るために、ここにアップデートを投稿してください! – flintlock

+0

私は現時点でハードウェアから離れているため、今晩後半までテストすることはできません。しかし、ハードウェアの開発者は、ハードウェアがコマンドがASCIIエンコードされ、CRが終了することを期待していると私に言っただけです。そこで、PrintWriteの初期化をPrintWriter writer = new PrintWriter(新しいBufferedWriter(new OutputStreamWriter(socket.getOutputStream()、 "ASCII"))に変更しようとします。 writer.printへの印刷コマンド(command + "\ r"); – David

0

エンコードタイプを「US-ASCII」に変更し、改行の代わりにキャリッジリターンを追加すると、そのトリックが実行されました。私は期待どおりにデータを読み書きできます。

関連する問題