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
gestartet
Code: Select all
onCreate (Bundle savedInstanceState)
{
...
startService(new Intent(this, MQTTService.class));
...
}
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;
}
[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 ….
Mobile version