Paho Клиент Android MQTT не отправляет PINGREQ брокеру, когда экран телефона выключенJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Paho Клиент Android MQTT не отправляет PINGREQ брокеру, когда экран телефона выключен

Сообщение Anonymous »

У меня есть небольшое приложение для Android, реализующее службу переднего плана, которая взаимодействует с брокером Mostic mqtt, используя paho MQTTClient: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5

Все в порядке, за исключением случая, когда экран выключен и кабель для зарядки отсоединен.

В этом случае он отключается от брокера, потому что «имеет превышено время ожидания», что вызвано тем, что клиент не отправляет никаких pingreq.

Если экран включен (заблокирован или нет) и кабель для зарядки не подключен, я вижу pingreq каждый интервал проверки активности.
То же самое, когда экран выключен с подключенным кабелем для зарядки.
Это одинаковое поведение на Android 9 и 14
Что касается настроек Android
  • on A14 Я разрешил приложению «использовать батарею в фоновом режиме без каких-либо ограничений» (неограниченный режим) в настройках приложения.
  • на A9 разрешена фоновая активность и нет оптимизации батареи
Сервис запускается в MainActivity стандартным способом с помощью

Код: Выделить всё

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

И в классе MQTTService

Код: Выделить всё

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;
}
Что мне здесь не хватает? Это не похоже на проблему с клинетом MQTT, а скорее на управление питанием Android.
[Изменить 3 декабря]Вот некоторые обновления
  • В качестве отчаянного решения я реализовал специальный поток, который отправляет тупое сообщение брокеру каждый интервал поддержки активности. Благодаря этому потоку клиент больше не отключается брокером.
  • обнаружено, что я пропустил параметр подключения: automaticReconnect
    , который по умолчанию имеет значение false. После установки значения true я начинаю видеть сообщения PING, и клиент больше не отключается. Я думал, что смогу указать виновника, но установка значения false не воссоздает проблему!?! и клиент теперь отправляет PING-сообщения независимо от того, является ли автоматическоеReconnect истинным или ложным….
Не уверен, что автоматическоеReconnect имеет какое-либо влияние, поэтому я выберу выделенный поток.

Подробнее здесь: https://stackoverflow.com/questions/798 ... reen-is-of
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»