使用 Eclipse Paho MQTT 客户端通过 SigV4 presignedURL 连接到 AWS IoT MessageBroker

Connect to AWS IoT MessageBroker with SigV4 presignedURL using Eclipse Paho MQTT client

我正在尝试使用 Eclipse Paho 创建一个 Java Mqtt 客户端,它可以使用 AwsIotWebSocketUrlSigner 的 [=14] 生成的 SigV4 预签名 URL 连接到 AWS IoT MessageBroker =] 方法。此连接将使用 MQTT over Websockets 并具有以“wss://”开头的 URL 语法。

连接代码如下所示。

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

我一直低于异常。上面的 connect() 失败了。

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 代码中,验证 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");
}

我可以使用 Java 脚本客户端和 presignedUrl 进行连接。

任何 help/sample 代码将不胜感激。

在查看 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 添加到 clientEndpoint。显然我的 presignedUrl 没有。所以我将 signingUrl 更改为也有端口号并且它有效。