Socket Verbindung aufbauen

grensu

Mitglied
Hallo,

ich habe ein Gerät (Waageterminal), welches über Ethernet angeschlossen ist. Nun möchte ich die nötigen Befehle (String) an das Gerät schicken, damit ich das Gewicht als Antwort bekomme und somit in meinem Programm reagieren kann. Leider bin ich etwas unerfahren. Wie stelle ich das am besten an? Ich habe mich etwas informiert und mit Hilfe von Sockets soll das wohl funktionieren.

Ich benutze Java mit IntelliJ und aktueller JDK

Vielen Dank für eure Hilfe
 
Du brauchst die IP adresse von deinem Gerät
Einen Server der über diese IP Adresse Ansprechbar ist
Einen Port Auf den der Server schaut ob was rein kommt
Eine Funktion die das was rein kommt ausliest und interpretiert

Einen Client der Sich mit der IP Adresse und dem Port verbindet
Eine Funktion die ewas an den Server über den Port und die IP schickt


das einfachste ist sowieso einen Terminal Chat zu bauen weil es da 1000 Tutorials gibt
 
Hallo,

vielen Dank für die Antwort!

Ich habe dem Gerät bereits eine feste IP vergeben, anpingen kann man es auch wunderbar.
Dann habe ich versucht eine Verbindung über "Socket" herzustellen.

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

class StringClient {

    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket("192.168.1.43", 1234);

            OutputStream raus = socket.getOutputStream();
            PrintStream ps = new PrintStream(raus, true);
            ps.println("RN1");
           

            InputStream rein = socket.getInputStream();
            System.out.println("verf\u00FCgbare Bytes: " + rein.available());
            BufferedReader buff = new BufferedReader(new InputStreamReader(rein));

            while (buff.ready()) {
                System.out.println(buff.readLine());
            }

        } catch (UnknownHostException e) {
            System.out.println("Unknown Host...");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("IOProbleme...");
            e.printStackTrace();
        } finally {
            if (socket != null)
                try {
                    socket.close();
                    System.out.println("Socket geschlossen...");
                } catch (IOException e) {
                    System.out.println("Socket nicht zu schliessen...");
                    e.printStackTrace();
                }
        }
    }
}

Ich schicke damit den Befehl "RN1" an das Gerät und erwarte eine Antwort. Dieser InputStream ist aber ständig leer:

Also bekomme ich keine Antwort oder ich sende die "Frage" nicht richtig.
Ich habe allerdings auch keinen Server direkt geschrieben. Funktioniert das überhaupt auf gleicher IP?
 
Was wird denn bei verfügbare Bytes ausgegeben? Ich vermute 0.

Was passiert ist jetzt folgendes:
Du schreibst RN1 zur Waage.
Direkt im Anschluss prüfst Du, ob etwas geantwortet wurde - das ist aber nicht der Fall (Die Waage muss das Paket ja erst bekommen und verarbeiten....)
Dann die Schleife mit dem ready - da aber noch keine Bytes zu lesen sind, ist da auch nichts ready -> while schleife wird vermutlich nie durchlaufen.

Typische Lösungen sind:
a) Du liest direkt per readLine(). Das stoppt die Ausführung, bis der Server geantwortet hat oder die Verbindung geschlossen wurde. Das kann auch ggf. in einem anderen Thread stattfinden.
b) Das alles geht auch asynchron. Dann musst Du aber regelmäßig prüfen: Ist etwas da, das gelesen werden muss? Wenn ja, dann lese ich das. Dazu werden dann aber in der Regel aus dem nio package die Channel verwendet.

Was Du einfach mal machen kannst, ist:
Nimm die while-Schleife mal raus und lass nur das System.out.println(buff.readLine()); da. Dann bekommst Du ggf. eine Zeile Text von der Waage zurück. Das wäre zumindest ein erster schneller Versuch.
 
Ich habe dem Gerät bereits eine feste IP vergeben, anpingen kann man es auch wunderbar.
Dann habe ich versucht eine Verbindung über "Socket" herzustellen.
Ich habe allerdings auch keinen Server direkt geschrieben. Funktioniert das überhaupt auf gleicher IP?
Auf dem Host mit der angegebenen IP-Adresse muss ein Serverprogramm laufen, das die Anfragen entgegennimmt. Du musst wissen, auf welchem Port welche Art von Verbindung angenommen wird. Im Beispiel baust Du eine TCP-Verbindung zu Port 1234 auf. Stimmt der Port? Natürlich musst Du auch das Protokoll kennen, über das Du Dich nach dem Verbindungsaufbau mit dem Server unterhalten kannst.
 
Was wird denn bei verfügbare Bytes ausgegeben? Ich vermute 0.

Was passiert ist jetzt folgendes:
Du schreibst RN1 zur Waage.
Direkt im Anschluss prüfst Du, ob etwas geantwortet wurde - das ist aber nicht der Fall (Die Waage muss das Paket ja erst bekommen und verarbeiten....)
Dann die Schleife mit dem ready - da aber noch keine Bytes zu lesen sind, ist da auch nichts ready -> while schleife wird vermutlich nie durchlaufen.

Typische Lösungen sind:
a) Du liest direkt per readLine(). Das stoppt die Ausführung, bis der Server geantwortet hat oder die Verbindung geschlossen wurde. Das kann auch ggf. in einem anderen Thread stattfinden.
b) Das alles geht auch asynchron. Dann musst Du aber regelmäßig prüfen: Ist etwas da, das gelesen werden muss? Wenn ja, dann lese ich das. Dazu werden dann aber in der Regel aus dem nio package die Channel verwendet.

Was Du einfach mal machen kannst, ist:
Nimm die while-Schleife mal raus und lass nur das System.out.println(buff.readLine()); da. Dann bekommst Du ggf. eine Zeile Text von der Waage zurück. Das wäre zumindest ein erster schneller Versuch.
Vielen Dank für die Erklärung! Also was du sagtest stimmt, er wartet und wartet und wartet, bekommt aber keine Antwort vom Server. Die Bytes sind auch 0.

Nun kommt wahrscheinlich das ins Spiel, was mihe7 gepostet hat.

Ich möchte nochmal die Konstellation erklären

Ich habe ein IT3 Waageterminal, welches per Ethernet einfach am LAN Kabel hängt. Dieses hat eine feste IP und ist per Ping auch erreichbar.
Diese Waage hat kein Backend oder so. Das einzige, was ich weis, die Übermittlung der "Befehle" läuft über noAck Protokoll. Habe dies leider noch nie gehört und weis auch nicht, ob das für die Anbindung über TCPIP wichtig ist.
Nun brauche ich anscheinend den Server als Host. Wie stelle ich das am besten an? Ich kann ja auf dem Waageterminal keinen Server aufspielen, ist ja nur ein Gerät.
Bin in dem Gebiet leider noch nicht sehr erfahren.

Die Verbindung von Gerät zu meinem Host/Server muss ja irgendwie stattfinden.

Vielen Dank für die Antworten. .-)
 
Nun, du musst exakt wissen:

* Auf welchem Port die Waage hört
* Wie exakt das Protokoll funktioniert, also welche Befehle die Waage auf Protokoll-Ebene in welchem Format erwartet. Das ist normalerweise mehr als nur "einen String hinsenden"

Diese Spezifikation brauchst du zwingend (oder musst Reverse Engineering betreiben, um die zu bekommen - aber das wird noch aufwendig).
 
Die Frage ist dann erst einmal, wie die Waage überhaupt ansprechbar ist. Der Hersteller Systec schweigt sich in den Hanfbüchern auch etwas aus. Aber ich habe an einer Stelle gefunden, dass da wohl ein Webserver läuft. Also erst einmal schauen, ob man da evtl. mit einem Browser drauf zugreifen kann (Mal mit http und https probieren. Wobei letzteres vermutlich gehen wird!)

Aber zur Not erst einmal an den Hersteller wenden und den fragen, wie das zu bedienen wäre ...
 
Den Port weis ich. Habe auch etwas interessantes im Handbuch gefunden (siehe Bild)
Bild 17.05.21 um 18.19.jpg

Ich habe das Interface "Ethernet" eingestellt.
Die Weboberfläche erreiche ich sogar, muss nur mal Username/Passwort erfragen.

Heißt das jetzt, dass ich mir nicht selber einen Server schreiben muss?
Ich verstehe noch nicht so genau, wie der Server (den ich selber schreibe) mit dem Gerät (nur über Lan Kabel angebunden) kommuniziert.
 
In der Konfig/Service Menü Com0 auf ETH und NoAck Protokoll einstellen. Die Waage muss auf "ONLINE" stehen.
Am besten mal das Handbuch durchforsten.

Dann einfach ein Websocket mit Java aufbauen. Der Server ist quasi das Gerät.
Ansonsten einfach mal Quellcode posten. 🙂
 

Zurück
Oben