簡體   English   中英

AWS JAVA IoT 客戶端重新連接和超時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM