2017-01-12 4 views
0

Ich habe ein drahtloses Gerät über den Port 22 mit meinem Netzwerk verbunden. Sobald das Gerät gestartet wird, beginnt es sofort mit dem Senden von Protokolldaten. Sobald dieses Gerät einen Befehl gesendet hat, stoppt es die Protokollierung und reagiert entsprechend. Das alles funktioniert, ich habe es mit einem Telnet-Client getestet.Probleme beim Schreiben auf Netzwerkgerät mit Sockets

Mein Problem ist, dass ich nicht scheinen kann, um es richtig in meiner App zu senden. Ich lese die Protokolldaten wie geplant, aber wenn ich einen Befehl sende, in diesem Fall den Befehl "r", gibt er stattdessen Protokolldaten aus, was er mir für diesen bestimmten Befehl zeigen soll. Das muss bedeuten, dass ich den Befehl nicht richtig sende. Dies ist mein Code für die Aufgabe, die er den Befehl und protokolliert die Ausgabe in der android logcat sendet:

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

Was mache ich falsch? Warum registriert es den Befehl nicht?

UPDATE:

Ich habe mehrere Telnet-Clients für den Test verwendet, und der Server ist das Lesen der ‚R‘ als Befehl auf einige erwartet. Es funktioniert mit einem Windows-Telnet-Client, und es funktioniert mit der vSSH-App von Velestar. Interessanterweise registriert der Server den Befehl nicht, wenn er dies mit dem Android-Telnet-Client von ClockworkMod testet.

Könnte es etwas mit Codierung zu tun haben?

Benötige ich zusätzliche Berechtigungen für die Arbeit mit Sockets? Ich habe android.permission.INTERNET im Manifest deklariert.

UPDATE 2:

Der Entwickler der Hardware hat mir nur gesagt, dass die Hardware den Befehl erwartet beendet werden ASCII-codiert und CR. Also werde ich versuchen, Printwrite Initialisierung zu ändern:

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

und der Druckbefehl an:

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

Antwort

-1

Von meinem Verständnis von der Problembeschreibung, haben Sie einen Telnet-Server, und wenn ein Telnet-Client eine Verbindung zum Dieser Server beginnt mit dem Senden der Clientprotokolldaten. Der Client kann ein "r" an den Server senden, um den Protokolldatenstrom zu stoppen.

  • Ich schlage vor, dass Sie zunächst mit einem anderen Telnet-Client bestätigen, dass das Senden eines "r" den Server daran hindert, weitere Protokolldaten zu generieren.
  • Sie können Wireshark verwenden, um zu überprüfen, ob der Befehl "r" tatsächlich gesendet wird.
  • +0

    Ich habe mehrere Telnet-Clients verwendet, und das funktioniert. Ich arbeite mit einem Windows-Telnet-Client, und es funktioniert mit der vSSH App von Velestar. Interessanterweise registriert der Server den Befehl nicht, wenn er dies mit dem Android-Telnet-Client von ClockworkMod testet. – David

    +0

    Off topic ... Sprechen Sie von SSH/Telnet-Client für Android, versuchen Sie definitiv Saft SSH, es ist kostenlos. Der beste ssh/telnet-Client für Android. =) Zurück zum Thema, hast du versucht, was dein Android Telnet Client sendet und vergleichst es mit anderen Telnet Clients? Es ist vielleicht so einfach wie eine Zeilenendung oder eine andere Telnet-Einstellung ... aber ich kann mir im Moment wirklich nichts vorstellen, ohne mehr Testergebnisse zu sehen.Bitte posten Sie das Update hier, falls Sie herausfinden, wo das Problem liegt! – flintlock

    +0

    Ich bin momentan von der Hardware entfernt, also kann ich erst heute Abend testen. Der Entwickler der Hardware hat mir jedoch gerade gesagt, dass die Hardware erwartet, dass der Befehl ASCII-kodiert ist und CR beendet wird. Also werde ich versuchen, die PrintWrite-Initialisierung auf PrintWriter zu ändern writer = new PrintWriter (neuer BufferedWriter (neuer OutputStreamWriter (socket.getOutputStream(), "ASCII")), true); und der Druckbefehl zu writer.print (Befehl + "\ r"); – David

    0

    Das Ändern des Codierungstyps in "US-ASCII" und das Hinzufügen eines Wagenrücklaufs anstelle einer neuen Zeile haben den Zweck erfüllt. Ich kann Daten wie erwartet lesen und schreiben.

    Verwandte Themen