Reputation: 1444
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
Upvotes: 15
Views: 26448
Reputation: 752
I faced this same error, and in my case the root cause was wrong Broker URI.
I was trying to connect to the TLS port of the broker, but using tcp://
as the Connection scheme in the broker-uri. Changing that to ssl://
fixed the error for me.
Upvotes: 0
Reputation: 4458
In my case it was somehow related to the keepAliveInterval
in MqttConnectOptions()
.
I kept keepAliveInterval to 10 seconds, and if my app is not publishing
anything for 10 seconds, then I was getting this EOFException
.
I increased it to 100 seconds and it worked fine.
Hope this helps resolving the issue further
Upvotes: 0
Reputation: 988
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
Upvotes: 22
Reputation: 338
Recently I've worked with this. I fronted the same issue: a 32109 error just after a successful connection.
It's a reported issue on Paho's repository.
I updated my library from:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1'
to:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
And that fixes it.
Upvotes: 0
Reputation: 1986
Try to reduce the keep-alive time to 15 sec and setConnectionTimeout to 30
connOpts.setKeepAliveInterval(15);
connOpts.setConnectionTimeout(30);
Upvotes: 0
Reputation: 23018
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
Upvotes: 0