2

How to implement ping request? I followed this code. I read following link How to send ping using Eclipse Paho MQTT client?. But I couldn't implement it.

package mqttTestJava;

    import org.eclipse.paho.client.mqttv3.MqttClient;
    import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
    import org.eclipse.paho.client.mqttv3.MqttException;
    import org.eclipse.paho.client.mqttv3.MqttMessage;
    import org.eclipse.paho.client.mqttv3.MqttPingSender;
    import org.eclipse.paho.client.mqttv3.internal.ClientComms;
    import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
    import org.eclipse.paho.client.mqttv3.MqttCallback;
    import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;


    class SimpleCallback implements MqttCallback, MqttPingSender  {
        private String instanceData = "";
            @Override
            public void connectionLost(Throwable cause) { //Called when the client lost the connection to the broker

                System.out.println("Connection lost on instance \"" + instanceData + "\" with cause \"" + cause.getMessage() + "\" Reason code " +
                        ((MqttException)cause).getReasonCode() + "\" Cause \"" +
                        ((MqttException)cause).getCause() + "\"");
                        cause.printStackTrace();
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                System.out.println("-------------------------------------------------");
                System.out.println("| Topic:" + topic);
                System.out.println("message arived "+new String(message.getPayload()));
                System.out.println("-------------------------------------------------");

            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {//Called when a outgoing publish is complete
            }

            //for ping request 

            @Override
            public void init(ClientComms arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void schedule(long arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void start() {
                // TODO Auto-generated method stub

            }

            @Override
            public void stop() {
                // TODO Auto-generated method stub

            }
    }


    public class mqttTest {
        public static void main(String[] args){
            String topic = "56";
            String content = "Message form java";
            int qos = 2;
            String broker = "tcp://iot.eclipse.org:1883";
            String clientId = "234";
            MemoryPersistence persistence = new MemoryPersistence();

            try {

                MqttClient sampleClient = new MqttClient(broker, clientId,persistence);

                MqttConnectOptions connOpts = new MqttConnectOptions();
                connOpts.setCleanSession(false);
               // connOpts.setKeepAliveInterval(3000);

                System.out.println("Connecting to broker: " + broker);
                sampleClient.connect(connOpts);

                sampleClient.subscribe(topic, 2);
                System.out.println("Connected");
                System.out.println("Publish message: " + content);
                MqttMessage message = new MqttMessage(content.getBytes());
                message.setQos(qos);
                sampleClient.setCallback(new SimpleCallback());
                sampleClient.publish(topic, message);
                System.out.println("Message published");
                try {
                 // Thread.sleep(5000);
                  //  sampleClient.disconnect();
                } catch(Exception e) {
                    e.printStackTrace();
                }
               // System.out.println("Disconnected");
               // System.exit(0);
            } 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("except " + me);
                me.printStackTrace();
            }
        }
    }

few minutes later following error occured :

Connection lost on instance "" with cause "Connection lost" Reason code 32109" Cause "java.net.SocketException: Connection reset"
Connection lost (32109) - java.net.SocketException: Connection reset
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:146)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.io.DataInputStream.readByte(DataInputStream.java:265)
    at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:65)
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)
    ... 1 more
Community
  • 1
  • 1

1 Answers1

3

If you are using standard & latest Paho client, you don't have to implement ping request module. The Paho has that feature in built. You have to set the Keepalive interval while establishing the connection and the Paho handles the PINGREQ and PINGRESP in the backend.

The issue might be in the broker settings or try with different keepalive values.

Manoj
  • 111
  • 8