Android - Paho Mqtt-client nicht empfangen Nachrichten sobald Netzwerk-Konnektivität änderungen (mobile Daten deaktiviert und wieder aktiviert)
Ich bin mit Mosquitto Mqtt zusammen mit paho-API zu erhalten push-Nachrichten auf android-Gerät. Aber sobald die Netzwerkverbindung ändert es Stoppt den Empfang von Nachrichten. Hier sind die Schritte zum reproduzieren des Problems mit einfachen Testfall:
1) Erstellen Sie eine einfache Aktivität.
2) Über die Aktivität Start verbindet mosquitto test server (test.mosquitto.org:1883) paho-API.
3) Abonnieren Sie einige Thema.
4) Veröffentlichen, eine Nachricht zu dem Thema.
Ergebnis: Mqtt-Client empfängt alle Nachrichten, die zu dem Thema veröffentlichten. Jetzt
5) Deaktivieren Sie die internet-Verbindung auf dem Handy (mobile Daten)
6) Veröffentlichen Sie eine Meldung zu dem Thema.
7) schließen Sie internet.
Ergebnis: Client erhält keine Meldung veröffentlicht, nach der die internet-Verbindung deaktiviert wurde.
Als KeepAliveInterval gehalten wurde hohen Wert (30 Minuten), sollte es erhalten alle Nachrichten nach dem wiederherstellen der Verbindung zum internet.
Den gleichen Anwendungsfall (gleichen code) arbeitet für einfache java-Projekt (nicht-android) wo deaktiviere ich internet auf meinem laptop zum ausführen des use-case.
Jede Idee, warum es nicht funktioniert auf android-Gerät??? Bin ich etwas fehlt?
Hinweis:
1) Über mqtt-client-0.4.1
2) Android target von API-level 11
3) Nicht setzen, Gerät in den sleep-Modus während der Prüfung.
4) nicht nennen, in connectionLost Rückruf und alle 4 threads von mqtt callback ausgeführt werden, während der Prüfung Fall ich.e-Verbindung, die den mosquitto-server ist intakt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-client-Bibliothek ist auf die Gnade der zugrunde liegenden Netzwerk-API zu einem gewissen Grad. Wenn veröffentlichen heißt, es schreiben ein MQTT-Paket an die Steckdose. Wenn das schreiben fehlschlägt, dann Verbindung verloren wird aufgerufen, wenn das schreiben funktioniert dann die client-Bibliothek wird weiter. Der Unterschied in Verhalten, das Sie sehen, ist, weil die Vernetzung der Bibliotheken sind anders zu Verhalten in dieser Situation.
Den MQTT keepalive-Intervall gemeint ist, zu helfen mit diesem. Unter bestimmten Umständen wird eine TCP-Verbindung scheint zu Leben, wenn es nicht ist. Dies ist vor allem möglich auf mobile-oder Sat-Geräte - Sie können nicht erwarten, dass die Netzwerk-APIs zum arbeiten genau das gleiche in allen Fällen. Keepalive sendet ein ping-Paket an den server und erwartet eine Antwort - wenn, die Antwort nicht empfangen wird, wird die Sitzung davon ausgegangen werden geschlossen.
Wenn Sie die keepalive-Intervall, um sagen wir 10 Sekunden, dann sollte die Verbindung als solches erkannt werden gebrochen innerhalb von 15 bis 20 Sekunden.
Können Sie MqttCallback Zuhörer MqttAsyncclient . Es hat die callback-Methode der Verbindung verloren, die wird aufgerufen, wenn die Verbindung verloren-Ereignis aufgetreten ist oder paho trennt.
Um das Problem zu beheben, ich musste ausdrücklich auf die ping broker wenn internet-Verbindung wieder auf (zusammen mit einem timer zu warten, für ping-Antwort). Wenn der ping fehlschlägt oder timer aus geht, ich gewaltsam beenden die bestehende Verbindung (disconnectForcibly) und dann explizit aufrufen connectionLost-Methode. (Wieder von connectionLost Methode nur).
In Ihren Dienst :-
Erstellen Sie die Folgende Klasse:-
Nun Rufen Sie die Folgende Methode Irgendwo Angebracht, in OnResume() oder onCreate Registrieren der BroadcastReceiver.
Ich fest recconect Fehler wie folgt (mit rxJava2, aber nicht erforderlich):
ist und ein Beispiel nennen
Ich hatte auch schon dieses problem und beheben es mit check MqttAndroidClient Verbindung und mit
.isConnected()
in Zeitintervallen.