Я использую правила Интернета вещей для темы ПОДКЛЮЧЕН / ОТКЛЮЧЕН (см. здесь). Поэтому я хочу получать электронную почту, когда устройство подключено или отключено. На моем устройстве я запускаю следующий код при запуске (только при запуске):
iotClient = new AWSIotMqttClient(Configuration.IOT_CLIENT_ENDPOINT,
deviceId,
keyStore,
keystorePass);
iotClient.setKeepAliveInterval(1200000); //20 minutes (maximum)
iotClient.connect();
Но у меня очень странное поведение. У меня 3 устройства, и на каждом из них я получаю трассировку стека, но по разным причинам:
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AwsIotConnection.onConnectionSuccess Connection successfully established
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AbstractAwsIotClient.onConnectionSuccess Client connection active: <client ID>
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AwsIotConnection.onConnectionFailure Connection temporarily lost
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AbstractAwsIotClient.onConnectionFailure Client connection lost: <client ID>
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AwsIotConnection$1.run Connection is being retried
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AwsIotConnection.onConnectionSuccess Connection successfully established
[pool-8-thread-1] com.amazonaws.services.iot.client.core.AbstractAwsIotClient.onConnectionSuccess Client connection active: <client ID>
Иногда я получаю эту трассировку стека из-за причины отключения DUPLICATE_CLIENTID или иногда из-за причины отключения MQTT_KEEP_ALIVE_TIMEOUT (MQTT_KEEP_ALIVE_TIMEOUT происходит каждые 30-35 минут, DUPLICATE_CLIENTID происходит каждые 10 минут)
Итак, я не понимаю, почему мне нужно иметь дело с DUPLICATE_CLIENTID, если у каждого клиента есть уникальный идентификатор, и с MQTT_KEEP_ALIVE_TIMEOUT, если нет периодической проблемы с подключением ( Каждую минуту я получаю логи на свой сервер, так что это не проблема с Wi-Fi / Интернетом). Я использую последнюю версию SDK AWS IoT отсюда - https://github.com/aws/aws-iot-device-sdk-java.
Как я могу решить эти проблемы?
МОЕ ЛЮБОВНОЕ РЕШЕНИЕ:
Я добавил запланированный поток, который отправляет пустые сообщения в тему - $ {iot: Connection.Thing.ThingName} / ping каждые 20 минут:
scheduledExecutor.scheduleAtFixedRate(() -> {
try {
iotClient.publish(String.format(Configuration.PING_TOPIC, deviceId), AWSIotQos.QOS0, "");
} catch (AWSIotException e) {
LOGGER.error("Failed to send ping", e);
}
}, Configuration.PING_INITIAL_DELAY_IN_MINUTES, Configuration.PING_PERIOD_IN_MINUTES, TimeUnit.MINUTES);
Таким образом, это решение решает неактивную проблему, но я все же хочу найти более элегантное решение ...