Подключение к AWS IoT MessageBroker с помощью SigV4 presignedURL с помощью клиента Eclipse Paho MQTT

#aws-sdk #mqtt #paho #aws-iot #aws-sdk-java

#aws-sdk #mqtt #paho #aws-iot #aws-sdk-java

Вопрос:

Я пытаюсь создать клиент Java Mqtt с использованием Eclipse Paho, который может подключаться к AWS IoT MessageBroker с использованием URL-адреса SigV4, созданного с использованием AwsIotWebSocketUrlSigner getSignedUrl метода s. Это соединение будет использовать MQTT через Websockets и имеет синтаксис URL, начинающийся с «wss://».

Код подключения выглядит следующим образом.

 IMqttAsyncClient client = new MqttAsyncClient(*presignedUrl*,MqttAsyncClient.generateClientId(), new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
IMqttToken token = client.connect(options);
token.waitForCompletion();
client.setCallback( *callBackObject* );
client.subscribe(topic, AWSIotQos.QOS1.getValue());
  

Я продолжаю получать исключение ниже. Сбой при подключении () выше.

 MqttException (0) - java.lang.NullPointerException
    at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:664)
    at java.lang.Thread.run(Thread.java:749)
Caused by: java.lang.NullPointerException
    at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.receiveHandshakeResponse(WebSocketHandshake.java:133)
    at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.execute(WebSocketHandshake.java:74)
    at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketSecureNetworkModule.start(WebSocketSecureNetworkModule.java:77)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)
  

В Eclipse Paho code здесь возникает исключение при проверке квитирования WSS.

 String connectionHeader = (String) headerMap.get(HTTP_HEADER_CONNECTION);
if (connectionHeader == null || connectionHeader.equalsIgnoreCase(HTTP_HEADER_CONNECTION_VALUE)) {
    throw new IOException("WebSocket Response header: Incorrect connection header");
}
  

Я могу подключиться с помощью клиента Javascript и presignedUrl.

Любая помощь / пример кода будут высоко оценены.

Ответ №1:

Нашел это, когда смотрел, как AWS Sdk делает это, поскольку он использует Eclipse Paho внизу. https://github.com/aws/aws-iot-device-sdk-java/blob/647449e654096172ebfcc31d79a8c582f952219d/aws-iot-device-sdk-java/src/main/java/com/amazonaws/services/iot/client/core/AwsIotWebsocketConnection.java#L46

Он добавлял порт № 443 к конечной точке клиента. По-видимому, у меня не было presignedUrl. Итак, я изменил signingUrl, чтобы также иметь порт no, и это сработало.