TCP Verbindung zu Beamer

spnx

Mitglied
Hallo

ich versuche über das Netzerk auf meinen Beamer zuzugreigen.
Ich kann auch eine Verbindung aufbauen:
Java:
	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:
Java:
	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...
 
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?!
 
[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
 
Also ich habe es eben noch einmal so versucht das er alles ausgibt was ankommt:
Java:
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
 
Zuletzt bearbeitet:
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 😉
 
Zuletzt bearbeitet von einem Moderator:
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
Code:
int len = commandWithCR.size();
SDLNet_TCP_Send(tcpsock,commandWithCR.c_str(),len);
und dann wird ausgelesen.
Code:
 find start of ACK, sometimes garbage is send before
		char oneByte;
		do
		{
			SDLNet_TCP_Recv(tcpsock,&oneByte,1);
....
 
Zuletzt bearbeitet:
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:
Java:
System.out.print("Kommando"+(char)0x0d); // Zeilenumbruch nach "o"
System.out.print("Kommando"+0x0d); // ausgabe ist Kommando13
 

Zurück
Oben