【问题标题】:Connect to AWS IoT MessageBroker with SigV4 presignedURL using Eclipse Paho MQTT client使用 Eclipse Paho MQTT 客户端通过 SigV4 presignedURL 连接到 AWS IoT MessageBroker
【发布时间】:2020-10-15 02:57:27
【问题描述】:

我正在尝试使用 Eclipse Paho 创建一个 Java Mqtt 客户端,该客户端可以使用使用AwsIotWebSocketUrlSignergetSignedUrl 方法生成的 SigV4 预签名 URL 连接到 AWS IoT MessageBroker。此连接将使用基于 Websockets 的 MQTT,并具有以“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");
}

我可以使用 Javascript 客户端和 presignedUrl 进行连接。

非常感谢任何帮助/示例代码。

【问题讨论】:

    标签: aws-sdk mqtt paho aws-iot aws-sdk-java


    【解决方案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

    它正在向 clientEndpoint 添加端口号 443。显然我拥有的 presignedUrl 没有它。所以我将signingUrl更改为也有端口号并且它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多