繁体   English   中英

使用Java Paho连接到Azure IoT中心

[英]Connect to Azure IoT Hub with Java Paho

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

我们遵循了有关如何设置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-内部服务器错误”作为响应。 这使我们认为这里存在一个更基本的访问问题。 F1规模中心仅支持Microsoft SDK吗? 我们是否缺少一些隐藏的访问控制设置? 名称格式是否严格,不允许使用某些字符或大小写?

显然,设备浏览器实用程序存在问题。 它没有生成365天有效期的SAS令牌,而是仅生成了365秒的令牌有效期。

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

您的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,我向你保证这是可行的:)

@SCote,我的建议是,您可以尝试引用Azure IoTHub SDK的源代码MqttIotHubConnection.java ,该代码也用于基于Java且也基于Paho的设备。

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

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

因此,我认为您可以尝试遵循官方实现来重写部分代码。

希望它能帮助您解决问题。

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

Paho GUI客户端

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM