# TCP Verbindung zu Beamer



## spnx (22. Apr 2011)

Hallo

ich versuche über das Netzerk auf meinen Beamer zuzugreigen.
Ich kann auch eine Verbindung aufbauen:

```
public static String ack = "";

	static Socket beamer = null;
	
	public static void main(String[] args)
	{
	    try
	    {
	      beamer = new Socket("192.168.0.29", 555);
	      if(beamer.isConnected())
	    	  System.out.println("Verbindung zum Beamer hergestellt.");
	      
	      getPowerState(":POWR?");
```
Mit diesem Code kann ich eine Verbindung aufbauen und der text wird ausgegeben.

Nun versuche ich den Zustand abzufragen mit getPowerState();
Da der Beamer nur ASCII befehle entgegen nimmt, muss ich folgendes machen:

```
public static int getPowerState(final String cmd) throws IOException
	{	
		String commandWithCR = cmd + "\\x0d";
		
		int result=0;
		System.out.println("Test send anfrage 1");
		PrintStream os = new PrintStream( beamer.getOutputStream() );
	        os.println( commandWithCR );
	    
	    System.out.println("Rückmeldung: ");
	    BufferedReader in = new BufferedReader(
	        new InputStreamReader( beamer.getInputStream()) );
	    String s = in.readLine();
      	System.out.println("Ausgabe: " + s ) ;
		...
```
Er kommt bis zur Ausgabe "Rückmeldung: " und danach hängt er sich auf.
Normalerweise müsste ich eine Antwort bekommen. 

Kann mir jemand weiterhelfen? Muss ich evtl die verbindung anders aufbauen oder auslesen?
Weiß nicht woran das liegen könnte...


----------



## Atze (22. Apr 2011)

was heißt denn "und danach hängt er sich auf."? fehlermeldung? hast du es mit nem debugger versucht?


----------



## Spnx offline (22. Apr 2011)

Also mit er hängt sich auf meine Ih das nichts zurück kommt. Ich denke wenn Ich länger warten würde, bekäme ich einen Timeout. Ich lass es gleich mal laufen bis ich ne Rückmeldung bekomme. Also das programm läuft aber auf der Konsole tut sich nichts..

Mit dem debugger habe ich es noch Mohr getestet, da ich nicht weiß wie ich ihn effektiv benutzen kann, bzw ich weiß ja wo es hängt, nur nicht warum?!


----------



## Gast2 (22. Apr 2011)

[c]String s = in.readLine();[/c] wird wohl auf eine Antwort warten. Wenn der Beamer nichts schickt (oder kein Linefeed) wartest du halt ewig und drei Tage. 

Versuch mal nicht mit readLine zu lesen sondern die bytes einzeln in einer while Schleife


----------



## spnx (22. Apr 2011)

Also ich habe es eben noch einmal so versucht das er alles ausgibt was ankommt:

```
BufferedReader in = new BufferedReader( new InputStreamReader( beamer.getInputStream()) );
	    //String s = in.readLine();
	    do
	    {
	    	System.out.println(in.read()); //returns a byte
	    } while(true);



///// ODER auch vresucht..
        char[] buffer = new char[200];
        int anzahlZeichen = in.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
        String nachricht = new String(buffer, 0, anzahlZeichen);
        System.out.println(nachricht);
```

Er müsst doch alles ausgeben was ankommt?!

Wenn ich es durchlaufen lasse... kommt nichts... habe gerade nochmal ca 3-5 minuten gewartet


----------



## Gast2 (22. Apr 2011)

Etwas "ungewöhnlicher" Ansatz, aber zum Testen schon okay. Ich denke mal dann musst du mal das Forum oder Handbuch deines Beamers bemühmen. Ich behaupte mal der sendet dir einfach nichts.

Das hier [c]String commandWithCR = cmd + "\\x0d";[/c] sieht mir auch verdächtig falsch aus... Was willst du? Einen LF oder CR? Dann probier mal:

[c]String commandWithCR = cmd + "\n";[/c] <- LF
[c]String commandWithCR = cmd + "\r";[/c] <- CR

Was du da machst ist 4 Character an den String anhängen die nichts mit einemCR oder LF zu tun haben


----------



## spnx (22. Apr 2011)

Hey, danke für die antwort. dachte schon das es mich weiterbringt ^^

also ich habe den code der c++ Applikation, möchte es aber in java machen, und da heißt es nur das der beamer ascii befehle entgegen nimmt. die c++ app läuft auch.
und da hängt dieser sting dran: "\x0d" nur mit einem backslash geht das in java nicht, bekomme fehler wegen falschem escape.
und dann geht es weiter mit 

```
int len = commandWithCR.size();
SDLNet_TCP_Send(tcpsock,commandWithCR.c_str(),len);
```
und dann wird ausgelesen.

```
find start of ACK, sometimes garbage is send before
		char oneByte;
		do
		{
			SDLNet_TCP_Recv(tcpsock,&oneByte,1);
....
```


----------



## Gast2 (22. Apr 2011)

spnx hat gesagt.:


> Hey, danke für die antwort. dachte schon das es mich weiterbringt ^^
> 
> also ich habe den code der c++ Applikation, möchte es aber in java machen, und da heißt es nur das der beamer ascii befehle entgegen nimmt. die c++ app läuft auch.
> und da hängt dieser sting dran: "\x0d" nur mit einem backslash geht das in java nicht, bekomme fehler wegen falschem escape.



In Java kannst du auch direkt das byte mitgeben. Dann musst es aber casten, sonst wird ein int draus und erst dann an den String gehängt:

```
System.out.print("Kommando"+(char)0x0d); // Zeilenumbruch nach "o"
System.out.print("Kommando"+0x0d); // ausgabe ist Kommando13
```


----------



## spnx (22. Apr 2011)

danke. aber leider hat das nichts an meinem Problem geändert. 
Er gibt immernoch nichts aus. Weder mit variante a noch b


----------

