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