Клиент AWS IoT: Исключение MqttException: Соединение было неожиданно закрыто

#java #aws-iot #aws-iot-core

Вопрос:

Я получаю следующее исключение при попытке подключиться к AWS IoT Core с помощью новых сертификатов устройств JITP:

software.amazon.awssdk.crt.mqtt.MqttException: Соединение было неожиданно закрыто.

Я реализовал JITP AWS IoT программно, эквивалентный официальному учебнику (https://aws.amazon.com/premiumsupport/knowledge-center/aws-iot-core-jitp-setup/)

Часть обеспечения работает нормально, где я создаю сертификаты устройств. В руководстве по AWS затем говорится, что вам нужен «фиктивный» вызов публикации в AWS IoT, чтобы начать процесс регистрации новой вещи IoT. Это инициирование запускается запуском:

 mosquitto_pub --cafile awsRootCA.pem --cert deviceCertAndCACert.crt --key deviceCert.key -h a27icbrpsxxx-ats.iot.us-east-2.amazonaws.com -p 8883 -q 1 -t  foo/bar -i  anyclientID --tls-version tlsv1.2 -m "Hello" -d
 

Соединение будет успешным, если я выполню вышеуказанную команду mosquitto_pub вручную после создания сертификата устройства и перед первой попыткой подключения.

Мне интересно, есть ли способ использовать AWS IoT Device SDK для Java, чтобы выполнить эквивалент этой команды «mosquitto_pub», другими словами: инициировать процесс регистрации в AWS IoT Core.

Вот код, который я использую, чтобы попытаться подключиться (пожалуйста, обратите внимание, что он работает, если я сначала запущу команду mosquitto_pub):

     try(EventLoopGroup eventLoopGroup = new EventLoopGroup(1);
        HostResolver resolver = new HostResolver(eventLoopGroup);
        ClientBootstrap clientBootstrap = new ClientBootstrap(eventLoopGroup, resolver);
        AwsIotMqttConnectionBuilder builder = AwsIotMqttConnectionBuilder.newMtlsBuilderFromPath(CERT_PATH, KEY_PATH)) {

        builder.withCertificateAuthorityFromPath(null, AWS_ROOT_CA_PATH)
                .withEndpoint(CLIENT_ENDPOINT)
                .withClientId(THING_NAME)
                .withBootstrap(clientBootstrap)
                .withConnectionEventCallbacks(callbacks);

        try (MqttClientConnection connection = builder.build()) {
            CompletableFuture<Boolean> connected = connection.connect();
            try {
                boolean sessionPresent = connected.get();
                System.out.println("Connected to "   (!sessionPresent ? "new" : "existing")   " session!");
            } catch (Exception ex) {
                throw new RuntimeException("Exception occurred during connect", ex);
            }