2016-09-20 4 views
1

P.S. Bitte lesen Sie die ganze Frage bevor Sie etwas abschließen.Verbindung verloren (32109) - java.io.EOFException (MqttAndroidClient)

Ich erhalte die folgende Ausnahme, wenn connect-Methode aufgerufen wird:

Verbindung verloren (32109) - java.io.EOFException bei org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run (CommsReceiver.java:146) bei java.lang.Thread.run (Thread.java:818) verursacht durch: java.io.EOFException bei java.io.DataInputStream.readByte (DataInputStream.java:77) bei org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage (MqttInputStream.java:65) bei org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run (CommsReceiver.java:107)

Ich habe einige Codeschnipsel ausprobiert, aber beide heben die gleiche Ausnahme auf.

Methode 1

private final String serverUri = "tcp://95.177.135.232:9001"; 

private void mqqtConnectAndroidClient() { 
    String clientId = "clientID-" + MqttClient.generateClientId(); 
    mqttAndroidClient = new MqttAndroidClient(getMainActivity(), serverUri, clientId); 
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 
    mqttConnectOptions.setKeepAliveInterval(60); 
    mqttConnectOptions.setCleanSession(true); 
    mqttConnectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); 
    try { 
     mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 
       subscribeToTopic(); 
      } 

      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       AppLog.Error("Failed to connect to: " + serverUri); 
       exception.printStackTrace(); 
      } 
     }); 
    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 

Methode 2

private final String serverUri = "tcp://95.177.135.232:9001"; 

private void methodTwo() { 
    try { 
     MqttDefaultFilePersistence mdfp = new MqttDefaultFilePersistence(MQTT_DIR); 
     mqttClient = new MqttClient(serverUri, "1", mdfp); 
     MqttConnectOptions options = new MqttConnectOptions(); 
     options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); 
     options.setKeepAliveInterval(60); 
     options.setAutomaticReconnect(true); 
     options.setCleanSession(true); 
     mqttClient.connect(options); 
     mqttClient.subscribe("#"); 
     mqttClient.setCallback(new MqttCallback() { 

      @Override 
      public void connectionLost(Throwable arg0) { 
       AppLog.Error("Connection lost"); 
       try { 
        mqttClient.connect(); 
       } catch (MqttException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void deliveryComplete(IMqttDeliveryToken arg0) { 
       AppLog.Error("deliveryComplete"); 
      } 

      @Override 
      public void messageArrived(String arg0, MqttMessage arg1) throws Exception { 
       AppLog.Error("messageArrived"); 
       AppLog.Error(arg1.toString()); 
      } 
     }); 
    } catch (MqttException e) { 
     AppLog.Error("Main Exception"); 
     e.printStackTrace(); 
    } 
} 

Abonnieren Methode

public void subscribeToTopic() { 
    try { 
     String subscriptionTopic = "#"; 
     mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 
       AppLog.Error("Subscribed!"); 
      } 
      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       AppLog.Error("Failed to subscribe"); 
      } 
     }); 
    } catch (MqttException ex) { 
     System.err.println("Exception whilst subscribing"); 
     ex.printStackTrace(); 
    } 
} 

Wenn ich den gleichen Server URI versuchen, HiveMQ, Es funktioniert perfekt mit der richtigen Verbindung und Abonnement gibt mir auch Ergebnisse. Ich verwende die folgenden zwei Bibliotheken:

Kompilierung 'org.eclipse.paho: org.eclipse.paho.client.mqttv3: 1.1.0' Kompilierung ‚org.eclipse.paho: org.eclipse.paho .android.service: 1.0.2'

ich einige der SO Antworten versucht, mag One, Two, Three, Four und Five aber keiner von ihnen für mich arbeiten.

Jede Hilfe wird geschätzt. Vielen Dank im Voraus!

Antwort

3

Sie verwenden Port 9001 und der HiveMQ-Link verweist auf einen MQTT-über-Websocket-Client.

Sie geben einen Verbindungs-URI an, der mit tcp:// beginnt und dem Dienst signalisiert, dass er eine Verbindung mit nativen MQTT und nicht MQTT über Websockets herstellen soll.

Wie im Bericht bug zur Implementierung der Websocket-Unterstützung erwähnt, müssen Sie den Verbindungs-URI mit ws:// starten, damit der Client-Code WebSockets verwenden kann.

+0

Ja, Sie haben Recht. Ich habe versucht ws: // aber mit Web-Socket-Client und in diesem Fall hat es abgelehnt. –

Verwandte Themen