使用Java Paho连接到Azure IoT Hub

时间:2016-07-15 20:10:39

标签: java azure mqtt azure-iot-hub

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

我们按照instructions关于如何设置IoT Hub并使用F1(免费)比例层创建了一个。然后我们跟踪another Azure document并下载了设备资源管理器,创建了一个设备并生成了一个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数据包。然后我们看到CONNACK的返回代码为5,发送给Paho和Azure,此后很快就丢弃了连接。然后,我们查看了“共享访问策略”并尝试了不同的设置。审计日志中没有任何内容,我们为所有内容打开了“详细”。

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

我们在哪里可以找到任何诊断信息,以便我们自行排除故障?

另一方面,我们搁置了这个(MQTT)方法并尝试通过ReST服务进行连接,并收到更加模糊的“500内部服务器错误”作为响应。这使我们认为这里有一个更基本的访问问题。 F1 scale hub是否仅支持Microsoft SDK?我们缺少一些隐藏的访问控制设置吗?名称的格式是否严格,不允许某些字符或大小写?

4 个答案:

答案 0 :(得分:1)

显然我们遇到了Device Explorer实用程序的问题。而不是生成365天到期的SAS令牌,它只生成一个令牌只有365秒。

请注意SAS令牌中的se=1468067737,它的评估结果为2016年7月9日08:35:37,并且已经过了我们的测试执行。

答案 1 :(得分:0)

您的SAS令牌看起来有些偏差。

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

VS。文档中有什么:

ArrayAdapter

,包含空格。

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

我在努力设置密码半天后做了那个PR,我保证你有效:)

答案 2 :(得分:0)

@SCote,我的建议是你可以尝试引用Azure IoTHub SDK的源代码MqttIotHubConnection.java来获取基于Paho的Java设备。

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

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

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

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

答案 3 :(得分:0)

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

Paho GUI Client