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.
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.