NEWS
socket.io States via Kotlin/Java abgreifen
-
Hey zusammen,
ich bin gerade dabei eine Android App, die den socket.io Adapter nutzt, zu erstellen. Dabei kann ich mit den Sockets Dinge schalten und States abgreifen.
Leider kann ich nicht wie in der Javascriptversion mit dem "onUpdate" bzw. "stateChange" Event nach Änderungen der Stati horchen.
Beispiel:
mSocket.on("connect", Emitter.Listener { args -> Log.e( "CUSTOM", "connected to ioBroker" ) })
Das funktioniert, bin ich connected, wird die Funktion aktiv.
Wenn ich jedoch
mSocket.on("stateChange", Emitter.Listener { args -> Log.e( "CUSTOM", "hier sollte was stehen, wenn was geändert wird" ) })
abgebe, werden keine Objectchanges geloggt..
Hat einer vielleicht eine Idee?
Grüße
-
@scripz Was ist
mSocket
? Ist es das socket-io Objekt? Dann wird das nicht gehen, da socket-io nur die darunterliegende Verbindung herstellt. Du musst selber Nachrichten verschicken und auf Nachrichten hören.Hier findest du den entsprechenden JavaScript Code:
https://github.com/ioBroker/ioBroker.socketio/blob/master/example/conn.jsDies musst du mehr oder weniger so nach Kotlin oder Java portieren.
-
@unclesam genau, das ist ein socket-io Objekt. Die conn.js habe ich schon bei meiner Webapp genutzt, da konnte man eben auf "onUpdate" horchen, deshalb dachte ich gibts da sowas auch
Aber dann muss ich wohl alle x milisekunden eine Nachricht schicken und den Output verarbeiten. Schade.
Danke für Deine Antwort!
-
@scripz sagte in socket.io States via Kotlin/Java abgreifen:
dann muss ich wohl alle x milisekunden eine Nachricht schicken und den Output verarbeiten. Schade.
Was, weshalb? Nein, du kannst doch auf
mSocket.on(xxx)
auf die Sachen hören, aber dafür must du natürlich auch ein subscribe oder getState, oder sonst etwas machen. Siehe all diethis._socket.emit()
im oben genannten conn.js.Von selbst kommen bei socket-io keine Daten - zum Glück, sonst würde bei grossen ioBroker Installationen die Verbindung komplett überfordert.
Im conn.js wird das in diesen zwei Zeilen gemacht - aber das kann ich nicht empfehlen, da das sehr viele Daten sein können:
this._autoSubscribe && this._socket.emit('subscribe', '*'); objectsRequired && this._socket.emit('subscribeObjects', '*');
Damit erhälst du jede Änderung von irgendetwas in ioBroker.
-
@unclesam Perfekt! Vielen Dank! Ich habe mich zu sehr auf das onUpdate und stateChanged konzentriert. Auch war mir das Konzept von socketIO nicht ganz klar. Dein Tipp "Von selbst kommen bei socket-io keine Daten" hat mich dann erst in die richtige Richtung gestoßen. Das wusste ich so nicht
Vielen Dank, jetzt kann ich weiter "basteln"
Grüße
-
@scripz Hi, ich versuche gerade das gleiche umzusetzen und eine kleine Android App zur Steuerung aufzusetzen. allerdings scheitere ich shcon am connect. Wie hast du das damals hinbekommen?
val uri = URI.create("http://<meineip>") mSocket = IO.socket(uri) mSocket?.on("connect", {Log.i("CUSTOM","connected to ioBroker")}) mSocket?.connect();
Der connect Befehl wird aber nicht ausgeführt, ich sehe auch keine Fehlermeldungen im Debugger.
Die IP kann ich im Browser ohne Probleme aufrufen, also auch kein Tipp Fehler.
Hast du einen Tipp wie du damals vorgegangen bist? -
@benj1m4n sagte in socket.io States via Kotlin/Java abgreifen:
Die IP kann ich im Browser ohne Probleme aufrufen, also auch kein Tipp Fehler.
Und du kannst die IP ohne Portnummer aufrufen? Oder hast du etwa den Port vergessen? Du kannst entweder den im Web-Adapter zur Verfügung gestellten Socket.io Port verwenden (meistens 8082) oder du installierst den Socket.io Adapter und stellst dort einen Port ein, den du dann verwendest.
Und wahrscheinlich (auch wenn ich die Android/Java Version von Socket.io nicht kenne), solltest du mal ein
mSocket?.on("error", ...);
oder ähnliches versuchen. Klar gibt die asynchrone Methodeconnect()
nichts zurück, wenn du eine falsche URI verwendest - die Methode ist ja eben asynchron.