Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - Paho Mqtt client does not receive messages once network connectivity changes (mobile data disabled and enabled again)

I am using Mosquitto Mqtt along with paho API to receive push messages on android device. But as soon as the network connectivity changes it stops receiving messages. Here are the steps to reproduce the issue with simple test case:

1) Create a simple activity.

2) On Activity StartUp connects to mosquitto test server (test.mosquitto.org:1883) through paho API.

3) Subscribe to some topic.

4) Publish some message to the topic.

Result: Mqtt Client receives all the messages published to the topic. Now

5) Disable internet connection on the mobile (mobile data)

6) Publish some message to the topic.

7) Reconnect internet.

Result: Client Does not receive any message published after internet connection was disabled.

As KeepAliveInterval has been kept to high value (30 minutes), it should receive all messages after reconnecting to the internet.

The same use case (same code) is working for simple java project (non-android) where I disable internet on my laptop to run the use case.

Any idea why it is not working on android device??? Am I missing something?

Note:

1) Using mqtt-client-0.4.1

2) Android target API level 11

3) Not putting device to sleep mode during the test.

4) Does not get any call in connectionLost callback and all the 4 threads of mqtt callback are running throughout the test case i.e connection the the mosquitto server is intact.

like image 553
Prashant Kedia Avatar asked Aug 07 '14 07:08

Prashant Kedia


2 Answers

The Java client library is at the mercy of the underlying networking API to a certain extent. When publish is called, it will write an MQTT packet to the socket. If that write fails, then connection lost will be called, if that write works then the client library will carry on. The difference in behaviour you are seeing is because the networking libraries are behaving differently in these circumstances.

The MQTT keepalive interval is meant to help with this. Under certain circumstances a TCP connection may appear to be live when it is not. This is especially possible on mobile or satellite connected devices - you can't expect the networking APIs to work exactly the same in all circumstances. Keepalive sends a ping packet to the server and expects a response - if that response is not received, the session is assumed to be closed.

If you set the keepalive interval to say 10 seconds, then the connection should be recognised as broken within 15 to 20 seconds.

like image 92
Ian Craggs Avatar answered Sep 27 '22 19:09

Ian Craggs


You can attach MqttCallback listener to MqttAsyncclient . It has callback method connection lost which will get called when connection lost event occured or paho disconnects.

like image 21
anubhav gupta Avatar answered Sep 27 '22 19:09

anubhav gupta