Jump to content

Recommended Posts

Geschrieben

Hallo zusammen,

ich habe versucht, einen DisconnectedListener zu implementieren, stoße dabei aber auf Probleme.

Wenn ich die LAN-Verbindung zwischen der Ethernet Extension und dem Brick unterbreche, wird der DisconnectedListener nicht ausgelöst. Auch beim Trennen der Stromversorgung passiert nichts.

Erst als ich einen ConnectedListener hinzugefügt und AutoReconnect aktiviert habe, wurde der DisconnectedListener ausgelöst. Allerdings geschieht dies genau zu dem Zeitpunkt, an dem sich der AutoReconnect wieder verbindet (also wenn der ConnectedListener ausgeführt wird), was etwas dauert. Der DisconnectedListener wird also nicht direkt beim Verlust der Verbindung aktiviert.

Entferne ich AutoReconnect und den ConnectedListener wieder, wird der DisconnectedListener überhaupt nicht ausgelöst.

Ist dieses Verhalten so gewollt? Es erscheint mir ziemlich unsinnig, wenn beide Listener quasi zur gleichen Zeit triggern.

Was kann ich tun? Was mache ich falsch? Was habe ich nicht verstanden? :D

 

public void connectToStack() {
        try {
            ipCon = new IPConnection();

            ipCon.setTimeout(250);
            ipCon.setAutoReconnect(true);

            ipCon.addDisconnectedListener(new IPConnection.DisconnectedListener() {
                public void disconnected(short disconnectReason) {
                    System.out.println("Disco");
                }
            });

            ipCon.addConnectedListener(new IPConnection.ConnectedListener() {
                public void connected(short con) {
                    System.out.println("conn");
                }
            });

            ipCon.connect(hostname, port);
            logger.info(
                    String.format("Successfully connected to Tinkerforge stack #%s (%s:%s)", number, hostname, port));

            isConnectedToStack = true;

        } catch (NetworkException | AlreadyConnectedException e) {
            logger.severe(
                    String.format("Failed to connect to Tinkerforge stack #%s (%s:%s)", number, hostname, port));

            isConnectedToStack = false;
        }
    }

 

Viele Grüße

Geschrieben
On 10/10/2024 at 7:25 PM, Maxxx said:

Wenn ich die LAN-Verbindung zwischen der Ethernet Extension und dem Brick unterbreche, wird der DisconnectedListener nicht ausgelöst. Auch beim Trennen der Stromversorgung passiert nichts.

Das ist leider so erstmal absolut erwartetes Verhalten. Eine TCP/IP Verbindung wird nicht passive getrennt. Die Verbindung besteht so lange bis eine der beiden Seiten aktive die Verbinfung schließt. Trennen des Netzwerkkabels oder Abschalten einer Seite führt nicht dazu, dass die andere Seite die Verbindung für geschlossen hält. Dieser Fall lässt sich nur durch einen aktiven Heartbeat-Mechanismus lösen, den keines unserer API Bindings bisher untersützt, sorry.

Die TCP/IP Verbindung kann erst als unterbrochen durch die API Bindings erkannt werden, wenn du nach dem Trennen der Stromversorgung die Stromversorgung wieder anschließt. Denn dann ist die Verbindung auf der Gegenseite geschlossen und die Gegenseite antwortet mit einem TCP/IP Reset auf eingehende Pakete. Vorher laufen die Pakete einfach ins Leere, was erlaubt ist in TCP/IP.

Ich kann allerdings nicht nachstellen, dass Connected-Listener oder Autoreconnect notwendig wären. Folgendes Beispiel funktioniert, mit den beschriebenen Einschränkungen.

import com.tinkerforge.IPConnection;

public class DisconnectTest {
	private static final String HOST = "192.168.1.112";
	private static final int PORT = 4223;

	public static void main(String args[]) throws Exception {
		IPConnection ipcon = new IPConnection();

		ipcon.setTimeout(250);
		ipcon.setAutoReconnect(false);

		/*ipcon.addConnectedListener(new IPConnection.ConnectedListener() {
			public void connected(short connectReason) {
				System.out.println("" + System.currentTimeMillis() + " Connected " + connectReason);
			}
		});*/

		ipcon.addDisconnectedListener(new IPConnection.DisconnectedListener() {
			public void disconnected(short disconnectReason) {
				System.out.println("" + System.currentTimeMillis() + " Disconnected " + disconnectReason);
			}
		});

		ipcon.connect(HOST, PORT);

		System.out.println("" + System.currentTimeMillis() + " Press key to exit"); System.in.read();
		ipcon.disconnect();
	}
}

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...