Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. [Gelöst] Android-App: Wie baue ich Socketverbindung zur Cloud.pro mit Java auf

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Gelöst] Android-App: Wie baue ich Socketverbindung zur Cloud.pro mit Java auf

    This topic has been deleted. Only users with topic management privileges can see it.
    • ?
      A Former User last edited by

      Hallo zusammen,

      ich versuche mit der Clour.pro eine Socketverbindung aufzubauen.

      Ich nutze in Java dazu die Klasse io.socket.client.IO

      Lokal klappt dies bereits wunderbar.

      Nur welche Parameter sind alle bötigt für eine erfolgreiche Verbindung über die cloud.pro?

      Hier die Variante mit lokaler URL.

      import io.socket.client.IO;
      import io.socket.client.Socket;
      import io.socket.emitter.Emitter;
      
      public class SocketService{
      	private Socket mSocket;
      	public SocketService() {
      		mSocket = IO.socket("http://iobroker:8084/"); //lokale Adresse
      		mSocket.on(Socket.EVENT_CONNECT, onConnect);
      		mSocket.connect();
      	}
      
      	private Emitter.Listener onConnect = new Emitter.Listener() {
              @Override
              public void call(Object... args) {
                  mSocket.emit("subscribe", "javascript.0.*");
              }
          };
      }
      
      
      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        Was ist dein Usecase?

        Es ist klar, dass du sich irgendwo authentifizieren solltest?

        Und genau dieser Schritt fehlt bei dir.

        1 Reply Last reply Reply Quote 0
        • ?
          A Former User last edited by

          UseCase ist eine native Android App.

          Ich bin schon schon dabei mir die conn.js aus ioBroker.vis.cordova anzusehen.

          Komme da auch weiter, wollte nur in die Runde Fragen ob das schon jemand am Laufen hat.

          Falls es die Tage bei mir läuft, stell ich die Lösung gerne hier bereit.

          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            Und falls nicht läuft, frage hier noch mal 🙂

            1 Reply Last reply Reply Quote 0
            • ?
              A Former User last edited by

              Komme nicht wirklich weiter…

              Zu welcher Url muss ich die Socketverbindung aufbauen?

              mSocket = IO.socket("https://iobroker.pro/");

              Muss ich den Port 8084 mit angeben?

              Wie gebe ich username und password an?

              Scheinbar gibt es diverse Möglichkeiten: Cookie, Url, mSocket.emit("authenticate"), ...

              Falls hilfreich hier meine MainActivity:

              package com.example.nagel.sockettest;
              
              import android.os.Bundle;
              import android.support.v7.app.AppCompatActivity;
              import android.util.Log;
              
              import java.net.URISyntaxException;
              import java.security.KeyManagementException;
              import java.security.NoSuchAlgorithmException;
              import java.security.cert.CertificateException;
              import java.security.cert.X509Certificate;
              
              import javax.net.ssl.HostnameVerifier;
              import javax.net.ssl.SSLContext;
              import javax.net.ssl.SSLSession;
              import javax.net.ssl.TrustManager;
              import javax.net.ssl.X509TrustManager;
              
              import io.socket.client.Ack;
              import io.socket.client.IO;
              import io.socket.client.Socket;
              import io.socket.emitter.Emitter;
              
              import static android.content.ContentValues.TAG;
              
              public class MainActivity extends AppCompatActivity {
                  private Socket mSocket;
              
                  @Override
                  protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.activity_main);
                      IO.Options opts;
              
                      SSLContext mySSLContext = null;
                      try {
                          mySSLContext = SSLContext.getInstance("TLS");
                      } catch (NoSuchAlgorithmException e) {
                          e.printStackTrace();
                      }
                      TrustManager[] trustAllCerts= new TrustManager[] { new X509TrustManager() {
                          public X509Certificate[] getAcceptedIssuers() {
                              return new X509Certificate[] {};
                          }
              
                          public void checkClientTrusted(X509Certificate[] chain,
                                                         String authType) throws CertificateException {
                          }
              
                          public void checkServerTrusted(X509Certificate[] chain,
                                                         String authType) throws CertificateException {
                          }
                      } };
              
                      try {
                          mySSLContext.init(null, trustAllCerts, null);
                      } catch (KeyManagementException e) {
                          e.printStackTrace();
                      }
              
                      HostnameVerifier myHostnameVerifier = new HostnameVerifier() {
                          @Override
                          public boolean verify(String hostname, SSLSession session) {
                              return true;
                          }
                      };
              
                      opts = new IO.Options();
                      opts.sslContext = mySSLContext;
                      opts.hostnameVerifier = myHostnameVerifier;
                      opts.secure = true;
                      opts.forceNew = true;
                      //opts.port = 8084;
              
                      try {
                          mSocket = IO.socket("https://iobroker.pro/", opts);
                          mSocket.on(Socket.EVENT_CONNECT, onConnect);
                          mSocket.on(Socket.EVENT_CONNECTING, onConnecting);
                          mSocket.on(Socket.EVENT_DISCONNECT,onDisconnect);
                          mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
                          mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
                          mSocket.on("unauthorized", onConnectError);
                          mSocket.on("authenticated", onConnectError);
                          mSocket.on("error", onConnectError);
                          mSocket.on("stateChange", onStateChange);
              
                      } catch (URISyntaxException e) {
                          throw new RuntimeException(e);
                      }
                      mSocket.connect();
                  }
              
                  @Override
                  public void onDestroy() {
                      super.onDestroy();
                      mSocket.disconnect();
                  }
              
                  private Emitter.Listener onConnect = new Emitter.Listener() {
                      @Override
                      public void call(Object... args) {
                          /*mSocket.emit("name", "socket.io", new Ack() {
                              @Override
                              public void call(Object... args) {
                                  Log.i(TAG,"name");
                              }
                          });*/
                          mSocket.emit("authentication","{username: \"John\", password: \"secret\"}", new Ack() {
                              @Override
                              public void call(Object... args) {
                                  Log.i(TAG,"authentication");
                              }
                          });
                          mSocket.emit("authenticate", new Ack() {
                              @Override
                              public void call(Object... args) {
                                  Log.i(TAG,"authenticate");
                              }
                          });
                          Log.i(TAG, "onConnect:" + args.toString());
                      }
                  };
              
                  private Emitter.Listener onConnecting = new Emitter.Listener() {
                      @Override
                      public void call(Object... args) {
                          Log.i(TAG, "onConnecting");
                      }
                  };
              
                  private Emitter.Listener onDisconnect = new Emitter.Listener() {
                      @Override
                      public void call(Object... args) {
                          Log.i(TAG, "onDisconnected");
                      }
                  };
              
                  private Emitter.Listener onConnectError = new Emitter.Listener() {
                      @Override
                      public void call(Object... args) {
                          Log.i(TAG, "onConnectError:" + args[0].toString());
                      }
                  };
              
                  private Emitter.Listener onStateChange = new Emitter.Listener() {
                      @Override
                      public void call(final Object... args) {
                          Log.i(TAG,"onStateChange:" + args[0].toString());
                      }
                  };
              }
              
              
              1 Reply Last reply Reply Quote 0
              • ?
                A Former User last edited by

                ich benutze als dependency:

                implementation('io.socket:socket.io-client:1.0.0')
                

                Und auch hiermit habe ich es bereits versucht ohne Erfolg:

                ...
                
                       OkHttpClient okHttpClient = new OkHttpClient.Builder()
                                .hostnameVerifier(myHostnameVerifier)
                                .sslSocketFactory(mySSLContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
                                .build();
                
                // default settings for all sockets
                        IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
                        IO.setDefaultOkHttpCallFactory(okHttpClient);
                
                // set as an option
                        opts = new IO.Options();
                        opts.callFactory = okHttpClient;
                        opts.webSocketFactory = okHttpClient;
                
                        ...
                

                Weitere Erkenntnis:

                Die Angabe des Ports in der Url ("https://iobroker.pro:8084/") führt zu Timeouts während des mSocket.connect()

                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  Wenn ich an deiner Stelle währe, würde ich erst hier:

                  [Authenticate sich:]

                  https://github.com/ioBroker/ioBroker.vi … pp.js#L656

                  und danach hier

                  [<link_text text="https://github.com/ioBroker/ioBroker.vi ... pp.js#L732">https://github.com/ioBroker/ioBroker.vis.cordova/blob/master/app.js#L732</link_text>
                  und hier
                  [Credentials for socket.io]
                  https://github.com/ioBroker/ioBroker.vi ... pp.js#L737
                  schauen](<br/>
                  <URL url=)[" target="_blank">

                  https://github.com/ioBroker/ioBroker.vi … pp.js#L732

                  und hier

                  [Credentials for socket.io]

                  https://github.com/ioBroker/ioBroker.vi … pp.js#L737

                  schauen](<br/>
                  <URL url=)

                  1 Reply Last reply Reply Quote 0
                  • ?
                    A Former User last edited by

                    @Bluefox:

                    Wenn ich an deiner Stelle währe, würde ich erst hier:

                    [Authenticate sich:]

                    https://github.com/ioBroker/ioBroker.vi … pp.js#L656

                    und danach hier

                    [<link_text text="https://github.com/ioBroker/ioBroker.vi ... pp.js#L732">https://github.com/ioBroker/ioBroker.vis.cordova/blob/master/app.js#L732</link_text>
                    und hier
                    [Credentials for socket.io]
                    https://github.com/ioBroker/ioBroker.vi ... pp.js#L737
                    schauenPerfekt. So mach ich weiter.

                    Kann ich die app.js irgendwie debuggen?

                    Gesendet von meinem Pixel 2 mit Tapatalk

                    " target="_blank">

                    https://github.com/ioBroker/ioBroker.vi … pp.js#L732

                    und hier

                    [Credentials for socket.io]

                    https://github.com/ioBroker/ioBroker.vi … pp.js#L737

                    schauenPerfekt. So mach ich weiter.

                    Kann ich die app.js irgendwie debuggen?

                    Gesendet von meinem Pixel 2 mit Tapatalk](<br/>
                    <URL url=) `

                    1 Reply Last reply Reply Quote 0
                    • Bluefox
                      Bluefox last edited by

                      https://developers.google.com/web/tools … debugging/

                      http://download.iobroker.net/android-debug.apk

                      1 Reply Last reply Reply Quote 0
                      • ?
                        A Former User last edited by

                        Das debuggen der app.js hat wunderbar geklappt.

                        Nun muss ich die Werte nur noch korrekt in die Socketvebindung einbauen.

                        Ich denke die Schwierigkeit liegt noch bei der Authentikation mit Cookie.

                        Url habe ich folgende:````
                        https://iobroker.pro/?key=nokey&user=my.email%40gmail.com&pass=totalgeheim

                        
                        Den generellen Aufbau habe ich hier entnommen: [https://github.com/socketio/socket.io-client-java](https://github.com/socketio/socket.io-client-java)
                        
                        Und hier die aktuelle MainActivity:
                        

                        package com.example.nagel.sockettest;

                        import android.os.Bundle;
                        import android.support.v7.app.AppCompatActivity;
                        import android.util.Log;

                        import java.net.URISyntaxException;
                        import java.security.KeyManagementException;
                        import java.security.NoSuchAlgorithmException;
                        import java.security.cert.CertificateException;
                        import java.security.cert.X509Certificate;
                        import java.util.Arrays;
                        import java.util.List;
                        import java.util.Map;

                        import javax.net.ssl.HostnameVerifier;
                        import javax.net.ssl.SSLContext;
                        import javax.net.ssl.SSLSession;
                        import javax.net.ssl.TrustManager;
                        import javax.net.ssl.X509TrustManager;

                        import io.socket.client.Ack;
                        import io.socket.client.IO;
                        import io.socket.client.Manager;
                        import io.socket.client.Socket;
                        import io.socket.emitter.Emitter;
                        import io.socket.engineio.client.Transport;
                        import okhttp3.OkHttpClient;

                        import static android.content.ContentValues.TAG;

                        public class MainActivity extends AppCompatActivity {
                        private Socket mSocket;
                        private OkHttpClient okHttpClient;
                        private String url = "https://iobroker.pro/?key=nokey&user=my.email%40gmail.com&pass=totalgeheim";
                        private String cookie = "username=my.email@gmail.com;password=totalgeheim";

                        @Override
                        protected void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            setContentView(R.layout.activity_main);
                        
                            getHttpClient();
                        
                            IO.Options opts;
                            opts = new IO.Options();
                            opts.callFactory = okHttpClient;
                            opts.webSocketFactory = okHttpClient;
                            opts.upgrade = true;
                            opts.reconnection = false;
                            opts.forceNew = true;
                        
                            try {
                                mSocket = IO.socket(url);
                                mSocket.io().on(Manager.EVENT_TRANSPORT, onTransport);
                                mSocket.on(Socket.EVENT_CONNECT, onConnect);
                                mSocket.on(Socket.EVENT_DISCONNECT,onDisconnect);
                                mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
                                mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
                        
                            } catch (URISyntaxException e) {
                                throw new RuntimeException(e);
                            }
                            mSocket.connect();
                        }
                        
                        private void getHttpClient() {
                            SSLContext mySSLContext = null;
                            try {
                                mySSLContext = SSLContext.getInstance("TLS");
                            } catch (NoSuchAlgorithmException e) {
                                e.printStackTrace();
                            }
                            TrustManager[] trustAllCerts= new TrustManager[] { new X509TrustManager() {
                                public X509Certificate[] getAcceptedIssuers() {
                                    return new X509Certificate[] {};
                                }
                        
                                public void checkClientTrusted(X509Certificate[] chain,
                                                               String authType) throws CertificateException {
                                }
                        
                                public void checkServerTrusted(X509Certificate[] chain,
                                                               String authType) throws CertificateException {
                                }
                            } };
                        
                            try {
                                mySSLContext.init(null, trustAllCerts, null);
                            } catch (KeyManagementException e) {
                                e.printStackTrace();
                            }
                        
                            HostnameVerifier myHostnameVerifier = new HostnameVerifier() {
                                @Override
                                public boolean verify(String hostname, SSLSession session) {
                                    return true;
                                }
                            };
                        
                            okHttpClient = new OkHttpClient.Builder()
                                    .hostnameVerifier(myHostnameVerifier)
                                    .sslSocketFactory(mySSLContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
                                    .build();
                        
                            IO.setDefaultOkHttpWebSocketFactory(okHttpClient);
                            IO.setDefaultOkHttpCallFactory(okHttpClient);
                        }
                        
                        private Emitter.Listener onConnect = new Emitter.Listener() {
                            @Override
                            public void call(Object... args) {
                                mSocket.emit("getState","javascript.0.vi_text", new Ack() {
                                    @Override
                                    public void call(Object... args) {
                                        Log.i(TAG,"getState");
                                    }
                                });
                                Log.i(TAG, "onConnect:" + args.toString());
                            }
                        };
                        
                        private Emitter.Listener onTransport = new Emitter.Listener() {
                            @Override
                            public void call(Object... args) {
                                Transport transport = (Transport)args[0];
                        
                                transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
                                    @Override
                                    public void call(Object... args) {
                                        @SuppressWarnings("unchecked")
                                        Map<string, list<string="">> headers = (Map<string, list<string="">>)args[0];
                                        // modify request headers
                                        headers.put("Cookie", Arrays.asList(cookie));
                                    }
                                });
                        
                                transport.on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
                                    @Override
                                    public void call(Object... args) {
                                        @SuppressWarnings("unchecked")
                                        Map<string, list<string="">> headers = (Map<string, list<string="">>)args[0];
                                        // access response headers
                                        //String cookie = headers.get("Set-Cookie").get(0);
                                    }
                                });
                            }
                        };
                        
                        private Emitter.Listener onDisconnect = new Emitter.Listener() {
                            @Override
                            public void call(Object... args) {
                                Log.i(TAG, "onDisconnected");
                            }
                        };
                        
                        private Emitter.Listener onConnectError = new Emitter.Listener() {
                            @Override
                            public void call(Object... args) {
                                Log.i(TAG, "onConnectError:" + args[0].toString());
                            }
                        };
                        
                        @Override
                        public void onDestroy() {
                            super.onDestroy();
                            mSocket.disconnect();
                        }
                        

                        }</string,></string,></string,></string,>

                        1 Reply Last reply Reply Quote 0
                        • ?
                          A Former User last edited by

                          Ich habe einen kleinen Fortschritt erreicht.

                          Mittlerweile habe ich das Socket connected.

                          Nun bekomme ich jedoch keine Antworten auf die Anfragen…

                          Jemand noch eine Idee woran es liegen könnte?!?

                          Sobald der Connect des Socket erfolgreich ist, versuche ich States abzufragen:

                          mSocket.emit("getStates", "javascript.0.*", ...
                          

                          Hier der gesamte Code der MainActivity Klasse:

                          package com.example.nagel.sockettest;
                          
                          import android.os.Bundle;
                          import android.support.v7.app.AppCompatActivity;
                          import android.util.Log;
                          
                          import java.net.URISyntaxException;
                          import java.util.List;
                          import java.util.Map;
                          
                          import io.socket.client.Ack;
                          import io.socket.client.IO;
                          import io.socket.client.Manager;
                          import io.socket.client.Socket;
                          import io.socket.emitter.Emitter;
                          import io.socket.engineio.client.Transport;
                          import io.socket.engineio.client.transports.WebSocket;
                          
                          import static android.content.ContentValues.TAG;
                          
                          public class MainActivity extends AppCompatActivity {
                              private Socket mSocket;
                              private IO.Options opts;
                              private final String url = "https://iobroker.pro/?key=nokey&user=max.mustermann%40gmail.com&pass=geheim";
                          
                              @Override
                              protected void onCreate(Bundle savedInstanceState) {
                                  super.onCreate(savedInstanceState);
                                  setContentView(R.layout.activity_main);
                          
                                  createIoOptions();
                          
                                  createSocket();
                          
                                  mSocket.connect();
                              }
                          
                              private void createSocket() {
                                  try {
                                      mSocket = IO.socket(url, opts);
                                      mSocket.io().on(Manager.EVENT_TRANSPORT, onTransport);
                                      mSocket.on(Socket.EVENT_CONNECT, onConnect);
                                      mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
                                      mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
                                      mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
                          
                                  } catch (URISyntaxException e) {
                                      throw new RuntimeException(e);
                                  }
                              }
                          
                              private void createIoOptions() {
                                  opts = new IO.Options();
                                  opts.upgrade = true;
                                  opts.reconnection = true;
                                  opts.forceNew = true;
                                  opts.transports = new String[]{WebSocket.NAME};
                              }
                          
                              private Emitter.Listener onConnect = new Emitter.Listener() {
                                  @Override
                                  public void call(Object... args) {
                                      mSocket.emit("getStates", "javascript.0.*", new Ack() {
                                          @Override
                                          public void call(Object... args) {
                                              Log.i(TAG, "getState");
                                          }
                                      });
                                      Log.i(TAG, "onConnect:" + args.toString());
                                  }
                              };
                          
                          //nur zum debuggen eingebaut
                              private Emitter.Listener onTransport = new Emitter.Listener() {
                                  @Override
                                  public void call(Object... args) {
                                      Transport transport = (Transport) args[0];
                          
                                      transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
                                          @Override
                                          public void call(Object... args) {
                                              @SuppressWarnings("unchecked")
                                              Map<string, list<string="">> headers = (Map<string, list<string="">>) args[0];
                                          }
                                      });
                          
                                      transport.on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
                                          @Override
                                          public void call(Object... args) {
                                              if (args[0] != null) {
                                                  Map<string, list<string="">> headers = (Map<string, list<string="">>) args[0];
                                              }
                                          }
                                      });
                                  }
                              };
                          
                              private Emitter.Listener onDisconnect = new Emitter.Listener() {
                                  @Override
                                  public void call(Object... args) {
                                      Log.i(TAG, "onDisconnected");
                                  }
                              };
                          
                              private Emitter.Listener onConnectError = new Emitter.Listener() {
                                  @Override
                                  public void call(Object... args) {
                                      Log.i(TAG, "onConnectError:" + args[0].toString());
                                  }
                              };
                          
                              @Override
                              public void onDestroy() {
                                  super.onDestroy();
                                  mSocket.disconnect();
                              }
                          
                          }</string,></string,></string,></string,> 
                          
                          1 Reply Last reply Reply Quote 1
                          • ?
                            A Former User last edited by

                            Problem ist gelöst.

                            Das Ergebnis ist hier zu sehen:

                            viewtopic.php?f=36&t=14919

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            806
                            Online

                            31.7k
                            Users

                            79.8k
                            Topics

                            1.3m
                            Posts

                            2
                            12
                            1095
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo