Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connection lost (32109) - java.io.EOFException

Tags:

java

mqtt

paho

I used eclipse MQTT for connect to MQTT server.

I can connect to server successfully but when i publish message , i got this error

Connection lost
msg : Connection lost
loc : Connection lost cause : java.io.EOFException
excep : Connection lost (32109) - java.io.EOFException

I searched for this problem . but i can't find any true answer ! some link i founded in here {here , here , here , ... }

My code :

private final String DEFAULT_HOST = "edge-mqtt.facebook.com";
private final int DEFAULT_PORT = 443;

public void connect(String protogle) throws Exception {

    this.broker =  protogle + "://"+ DEFAULT_HOST + ":" + DEFAULT_PORT;
    this.mqttClient = new MqttClient(broker,getMqttClientId() ,new MemoryPersistence() );

    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setCleanSession(true);
    connOpts.setKeepAliveInterval( MQTT_KEEPALIVE);
    connOpts.setUserName( getMqttUsername() );
    connOpts.setPassword( getMqttPassword().toCharArray() );
    //connOpts.setMqttVersion( 3 );//some times it have an error
    //connOpts.setSocketFactory(SSLTunnelSocketFactory.getInstance());
    Logger.w("Connecting to broker: "+broker);
    Logger.w("isConnected:"+mqttClient.isConnected());
    try {
        IMqttToken cn = mqttClient.connectWithResult(connOpts);
        Logger.w("connected");
    }catch (MqttException me){
        System.out.println("reason "+me.getReasonCode());
        System.out.println("msg "+me.getMessage());
        System.out.println("loc "+me.getLocalizedMessage());
        System.out.println("cause "+me.getCause());
        System.out.println("excep "+me);
        return;
    }



    this.mqttClient.setCallback(new MqttCallback() {
        @Override
        public void connectionLost(Throwable me) {
            Logger.w("Connection lost");
            System.out.println("msg "+me.getMessage());
            System.out.println("loc "+me.getLocalizedMessage());
            System.out.println("cause "+me.getCause());
            System.out.println("excep "+me);
        }

        @Override
        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            Logger.w("message Arrived");
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
            Logger.w("deliverd--------");
            try {
                MqttDeliveryToken token  = (MqttDeliveryToken) iMqttDeliveryToken;
                String h = token.getMessage().toString();
                Logger.w("deliverd message :"+h);
            } catch (MqttException me) {
                System.out.println("reason "+me.getReasonCode());
                System.out.println("msg "+me.getMessage());
                System.out.println("loc "+me.getLocalizedMessage());
                System.out.println("cause "+me.getCause());
                System.out.println("excep "+me);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });



}

And publish method :

private void publish(String topic , String payload , int qosLevel) throws Exception {
    Logger.w("start publishing :");
    //payload = Helper.zlib_encode(payload);
    topic = mapTopic(topic);

    MqttMessage message = new MqttMessage();
    message.setPayload(payload.getBytes("UTF-8") );
    message.setQos(0);

    mqttClient.publish(topic , message);
    Logger.w("publised------------------");
}

output :

 Connecting to broker: ssl://edge-mqtt.facebook.com:443  
 isConnected:false  
 connected  
 start publishing :  
 deliverd--------  
 publised------------------  
 deliverd message : //my message
 Connection lost
 msg : Connection lost
 loc : Connection lost
 cause : java.io.EOFException
 excep : Connection lost (32109) - java.io.EOFException

Eclipse paho log :

 ============== Connection options ==============
 CleanSession                :  true
 SocketFactory               :  sun.security.ssl.SSLSocketFactoryImpl@6c010ee9
 MqttVersion                 :  3
 KeepAliveInterval           :  60
 ConTimeout                  :  30
 UserName                    :  . . . 
 SSLProperties               :  null
 WillDestination             :  null
 ==========================================
 2017-10-19 09:42:02,182 INFO  [MQTT Call: Bahram091547759    ] [MqttConnectionResultHandler   ]  - insta connected
 2017-10-19 09:42:02,187 INFO  [JavaFX Application Thread     ] [MqttEventHandler              ]  - About to resubscribe to all requested topics
 2017-10-19 09:42:08,559 INFO  [JavaFX Application Thread     ] [MqttAsyncConnection           ]  - Publishing message on topic "k.,".  Payload size = "3"
 2017-10-19 09:42:08,739 ERROR [MQTT Rec: Bahram091547759     ] [MqttCallbackHandler           ]  - Connection insta lost
 Connection lost (32109) - java.io.EOFException
     at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java: 146)
     at java.lang.Thread.run(Unknown Source)
 Caused by: java.io.EOFException
     at java.io.DataInputStream.readByte(Unknown Source)
     at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMess age(MqttInputStream.java:65)
     at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)
     ... 1 more
like image 607
MrNadimi Avatar asked Oct 17 '17 11:10

MrNadimi


2 Answers

I had the same exception and fixed it by ensuring a unique client ID was generated (with MqttAsyncClient.generateClientId()), as mentioned here: https://github.com/eclipse/paho.mqtt.java/issues/207#issuecomment-338246879

like image 175
wrapperapps Avatar answered Nov 01 '22 13:11

wrapperapps


The javadoc for connectWithResult recommends to call setCallback(MqttCallback) prior to connecting in order that messages destined for the client can be accepted as soon as the client is connected.

Try moving the mqttClient.setCallback call up in your source code.

Also try running your program with java -Djavax.net.debug=all

like image 1
Alexander Farber Avatar answered Nov 01 '22 14:11

Alexander Farber