aws java iot客户端重新连接和超时

hmae6n7t  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(561)

我在连接/断开连接的主题上使用物联网规则(从这里开始)。所以我想在设备连接或断开连接时收到电子邮件。在我的设备上,我在启动时运行下一个代码(仅在启动时):

iotClient = new AWSIotMqttClient(Configuration.IOT_CLIENT_ENDPOINT,
                    deviceId,
                    keyStore,
                    keystorePass);

iotClient.setKeepAliveInterval(1200000); //20 minutes (maximum)
iotClient.connect();

但我的行为很奇怪。我有3台设备,每台设备上都有这个stacktrace,但原因不同:

[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>

有时我得到这个stacktrace是由于duplicate\u clientid disconnection原因,有时是由于mqtt\u keep\u alive\u timeout disconnection原因(mqtt\u keep\u alive\u timeout每30-35分钟发生一次,duplicate\u clientid每10分钟发生一次)
所以,我不明白,如果每个客户端都有一个唯一的id,为什么要处理重复的\u clientid,如果没有间歇性连接问题,为什么要处理mqtt \u keep \u alive \u timeout(我每分钟都会收到服务器的日志,所以这不是wifi/internet问题)。我在这里使用最新的aws iot sdk-https://github.com/aws/aws-iot-device-sdk-java.
如何解决这些问题?
我棘手的解决方案:
我添加了一个调度线程,它将空消息发送到主题-${iot:connection.thing.thingname}/每20分钟ping一次:

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);

所以这个解决方案解决了不活跃的问题,但我还是想找到一个更优雅的解决方案。。。

9rnv2umw

9rnv2umw1#

看看你的日志,它似乎肯定是连接丢失,然后连接重试。
在重新连接期间,它仍然使用您传递的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) 看看能不能帮上忙。
/设置客户端和服务器是否应在每个连接上建立干净的会话。*如果为false,服务器应尝试在连接之间保持客户端的状态。*这必须在调用{@link#connect()}之前设置。@param cleansession如果为true,服务器将在每个连接上启动与客户端的干净会话。如果为false,则服务器应在连接之间保持客户端的状态/

@Override
public void setCleanSession(boolean cleanSession) { super.setCleanSession(cleanSession); }

https://docs.aws.amazon.com/iot/latest/developerguide/iot-thing-management.html
mqtt\u keep\u alive\u超时如果在客户端keep-alive时间的1.5倍内没有客户端-服务器通信,则客户端断开连接。
这意味着你没有发送/接收消息。没有办法解决这个问题,除非你保持一个活动的连接并做一些事情

相关问题