Der paho Android MQTT-Client sendet PINGREQ nicht an den Broker, wenn der Telefonbildschirm ausgeschaltet istJava

Java-Forum
Anonymous
 Der paho Android MQTT-Client sendet PINGREQ nicht an den Broker, wenn der Telefonbildschirm ausgeschaltet ist

Post by Anonymous »

Ich habe eine kleine Android-App, die einen Vordergrunddienst implementiert, der mit dem Mosquito-MQTT-Broker über paho MQTTClient kommuniziert: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5

Alles ist in Ordnung, außer wenn der Bildschirm ausgeschaltet und das Ladekabel nicht angeschlossen ist.

In diesem Fall wird die Verbindung zum Broker getrennt, weil „Zeitüberschreitung wurde überschritten“, was dadurch verursacht wird, dass der Client keinen Pingreq sendet.

Wenn der Bildschirm eingeschaltet ist (gesperrt oder nicht) und kein Ladekabel angeschlossen ist, kann ich den Pingreq in jedem Keepalive-Intervall sehen.
Das Gleiche gilt, wenn der Bildschirm ausgeschaltet ist und das Ladekabel angeschlossen ist.
Das gleiche Verhalten tritt auf Android 9 und 14 auf.
Bezüglich der Android-Einstellungen
  • an A14 Ich habe der App in den App-Einstellungen erlaubt, „den Akku ohne Einschränkungen im Hintergrund zu nutzen“ (uneingeschränkter Modus).
  • Auf A9 sind Hintergrundaktivitäten und keine Akkuoptimierung zulässig
Der Dienst wird in MainActivity standardmäßig mit
gestartet

Code: Select all

onCreate (Bundle savedInstanceState)
{
...
startService(new Intent(this, MQTTService.class));
...
}

Und in der MQTTService-Klasse

Code: Select all

public int onStartCommand(Intent intent, int flags, int startId)
{
Intent notIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notIntent, PendingIntent.FLAG_IMMUTABLE);
Notification not = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("MQTT listener")
.setContentText("connecting to broker...")
.setSmallIcon(R.drawable.ic_mqtt)
.setContentIntent(pendingIntent)
.setColor(getColor(R.color.white))
.setOngoing(true)
.setPriority(PRIORITY_MAX)
.build();
not.flags = Notification.FLAG_ONGOING_EVENT;
startForeground(NOT_STATE_ID, not);
connect2Server();
Log.d(TAG, "onStartCommand()");
isRunning = true;
return START_STICKY;
}
Was fehlt mir hier? Es scheint sich nicht um ein MQTT-Clinet-Problem zu handeln, sondern eher um ein Android-Energiemanagement.
[Bearbeiten am 3. Dezember]Hier sind einige Updates
  • Als verzweifelte Lösung habe ich einen dedizierten Thread implementiert, der in jedem Keepalive-Intervall eine dumme Nachricht an den Broker sendet. Mit diesem Thread wird der Client nicht mehr vom Broker getrennt.
  • Ich habe festgestellt, dass ich einen Verbindungsparameter übersehen habe: automaticReconnect
    Der Standardwert ist „false“. Nachdem ich es auf „true“ gesetzt habe, sehe ich PING-Nachrichten und die Verbindung zum Client wurde nicht mehr getrennt. Ich dachte, ich könnte den Übeltäter identifizieren, aber das Zurücksetzen auf „false“ stellt das Problem nicht wieder her!?! und der Client sendet jetzt PING-Nachrichten, unabhängig davon, ob „automaticReconnect“ wahr oder falsch ist ….
Ich bin mir nicht sicher, ob „automaticReconnect“ irgendwelche Auswirkungen hat, daher werde ich mit dem dedizierten Thread fortfahren.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post