1

我们已经启动了一个 PoC,通过 MQTT 将我们现有的一些代码连接到 Azure IoT Hub,以测试 Azure 对标准协议和工具的支持。我们正在使用 Paho 客户端,但收到返回码为 5 的 CONNACK - 未授权。

我们按照有关如何设置 IoT 中心的说明进行操作,并使用 F1(免费)扩展层创建了一个。然后我们按照另一个 Azure 文档下载了设备资源管理器,创建了一个设备并生成了一个 SAS 令牌。然后我们将所有内容都插入 Paho:

public static void main( String[] args ) {
  String deviceId = "device-fcbd127a";
  String sasToken = "SharedAccessSignature sr=CoyoteIoT.azure-devices.net%2fdevices%2fdevice-fcbd127a&sig=3acRHQXXXXXXXXXXX‌​Zg%3d&se=1468067737";
  String brokerUri = "ssl://CoyoteIoT.azure-devices.net:8883";
  String clientId = deviceId;
  System.out.println( "Connecting to " + brokerUri +" as "+clientId);

  MqttAsyncClient client = null;
  try {
    client = new MqttAsyncClient( brokerUri, clientId );
    if ( client != null ) {
      MqttConnectOptions options = new MqttConnectOptions();
      client.setCallback( new AzureCallback() );
      options.setUserName( "CoyoteIoT.azure-devices.net/device-fcbd127a"     );
      options.setPassword( sasToken.toCharArray() );
      IMqttToken token = client.connect( options );
      token.waitForCompletion( 5000 );
      if ( client.isConnected() ) {
        System.out.println( "Success!" );
      } else {
        System.out.println( "Could not connect to Azure IoT hub, timed-out" );
      }
    }
  } catch ( MqttException e ) {
    client.getDebug().dumpBaseDebug();
    e.printStackTrace();
  } finally {
    if ( client != null ) {
      try {
        client.disconnect();
      } catch ( MqttException ignore ) {}
    }
  }
}

我们已通过 Wireshark 确认已与 Azure 建立 SSL 连接,并且已发送 CONNECT 数据包。然后我们看到返回码为 5 的 CONNACK 被发送到 Paho,Azure 很快就断开了连接。然后我们查看了“共享访问策略”并尝试了不同的设置。审核日志中没有任何内容,我们对所有内容都启用了“详细”。

是否有人将 Paho(或其他第三方 Java 客户端)连接到 Azure IoT 中心?

我们在哪里可以找到任何诊断信息,以便我们自己解决这个问题?

另一方面,我们搁置了这种(MQTT)方法,并尝试通过 ReST 服务进行连接,并收到一个更加模棱两可的“500-Internal Server Error”作为响应。这使我们认为这里存在更根本的访问问题。F1 缩放中心是否仅支持 Microsoft SDK?我们缺少一些隐藏的访问控制设置吗?名称的格式是否严格,不允许某些字符或大小写?

4

4 回答 4

1

显然我们遇到了设备资源管理器实用程序的问题。它没有生成一个有效期为 365 天的 SAS 令牌,而是生成了一个有效期仅为 365 秒的令牌。

请注意se=1468067737SAS 令牌中的 2016 年 7 月 9 日 08:35:37 EDT 到期,远远超过了我们的测试执行。

于 2016-08-01T21:03:48.380 回答
0

您的 SAS 令牌看起来有点不对劲。

"SharedAccessSignature=Share[snipped]%3d&se=1468067737"

与文档中的内容相比:

"SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501"

的,包括空格。

请参阅:https ://github.com/Azure/azure-content/blob/master/articles/iot-hub/iot-hub-devguide.md#example

在努力形成密码半天后,我做了那个 PR,我向你保证这行得通:)

于 2016-07-16T10:52:17.240 回答
0

@SCote,我的建议是您可以尝试参考MqttIotHubConnection.java同样基于 Paho 的 Java 设备的 Azure IoTHub SDK 的源代码。

我查看了代码,然后UserName在 128 行发现了下面的差异,并updateConnectionOptions在 346 行设置了函数中的所有属性。

String clientIdentifier = "DeviceClientType=" + URLEncoder.encode(TransportUtils.javaDeviceClientIdentifier + TransportUtils.clientVersion, "UTF-8");
this.iotHubUserName = this.config.getIotHubHostname() + "/" + this.config.getDeviceId() + "/" + clientIdentifier;

所以我认为你可以尝试按照官方的实现来重写你的部分代码。

希望它有助于解决您的问题。

于 2016-07-18T06:33:53.597 回答
0

我尝试使用代码中指定的凭据从 Paho GUI 客户端(我已经验证已经使用我的凭据连接到 azure - 有效!!)进行连接。我最终得到一条错误消息,显示“org.eclipse.paho.client.mqttv3.MqttException:连接丢失”。我希望,您没有删除或修改您的凭证的任何部分。尝试使用此 paho GUI 应用程序验证您的凭据。

Paho GUI 客户端

于 2016-07-21T16:10:49.723 回答