[英]AWS JAVA IoT client reconnections and timeouts
我在 CONNECTED/DISCONNECTED 主題上使用 IoT 規則(從這里開始)。 所以我想在連接或斷開設備時獲得 email 。 在我的設備上,我在啟動時運行下一個代碼(僅在啟動時):
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 如果每個客戶端都有一個唯一的 ID ,並處理 MQTT_KEEP_ALIVE_TIMEOUT 如果沒有間歇性連接問題(我每分鍾都會收到日志到我的服務器,所以它不是WIFI/互聯網問題)。 我從這里使用最新的 AWS IoT SDK - 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);
所以這個解決方案解決了非活動問題,但我仍然想找到一個更優雅的解決方案......
查看您的日志,似乎連接丟失,然后重試連接。
在重新連接期間,它仍然使用您傳遞的 deviceID 進行連接(但是連接可能從 MQTT 端不存在),因此它看到它正在嘗試使用相同的 id 進行連接。
閱讀一些關於此的內容,看起來您可能實際上並未將您的設備注冊為 aws 中的(事物)。
如果你是,當你創建一個 MQTT 連接並傳遞那個 thingId 時,即使在重新連接時,它也不會給你那個 DuplicateID 錯誤。
AWSIotMqttClient client = new AWSIotMqttClient(...);
SomeDevice someDevice = new SomeDevice(thingName); // SomeDevice extends AWSIotDevice
client.attach(someDevice);
client.connect();
您還可以嘗試使用iotClient.cleanSession(true/false)
看看是否可以幫助您。
/** * 設置客戶端和服務器是否應該在每個連接上建立一個干凈的 session。 * 如果為 false,服務器應嘗試在連接之間保持客戶端的 state。 * 這必須在調用 {@link #connect()} 之前設置。 * * @param cleanSession * 如果為真,服務器在每個連接上與客戶端啟動一個干凈的 session。 * 如果為 false,服務器應在連接之間保持客戶端的 state。 */
@Override
public void setCleanSession(boolean cleanSession) { super.setCleanSession(cleanSession); }
https://docs.aws.amazon.com/iot/latest/developerguide/iot-thing-management.html
MQTT_KEEP_ALIVE_TIMEOUT 如果在客戶端保持活動時間的 1.5 倍內沒有客戶端-服務器通信,則客戶端斷開連接。
這意味着你沒有發送/接收消息..沒有辦法解決這個問題,除非你保持活躍的連接並做事
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.