使用Java Paho连接到Azure IoT Hub

问题描述:

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

我们根据instructions关于如何设置IoT Hub并使用F1(免费)规模层创建了一个。然后我们跟着another Azure document下载了Device Explorer,创建了一个设备并生成了一个SAS令牌。然后,我们插入到一切泛美卫生组织:

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是一个SSL连接到Azure和该CONNECT数据包被发送制造。然后我们看到CONNACK的返回码5被发送到Paho,然后Azure不久之后就断开连接。然后我们查看了“共享访问策略”并尝试了不同的设置。审计日志中没有任何内容,我们对所有内容都进行了“冗长”的打开。

有没有人将Paho(或其他第三方Java客户端)连接到Azure物联网集线器?

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

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

显然我们遇到了设备浏览器工具问题。它不会生成一个365天到期的SAS令牌,它只会产生365秒的令牌。

请注意SAS令牌中的se=1468067737,它的计算结果为2016年7月8日08:35:37 EDT,过了我们的测试执行。

您的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用半天形成密码后挣扎,我答应你的工作:)

+0

好的但仍然没有喜悦。将SAS令牌更改为'String sasToken =“SharedAccessSignature sr = CoyoteIoT.azure-devices.net%2fdevices%2fdevice-fcbd127a&sig = 3acRHQXXXXXXXXXXX Zg%3d&se = 1468067737”;'仍然得到5的返回码。示例SAS令牌已更改与您的反馈 - 谢谢! – SCote

+0

因此,MQTT.fx与IoT Hub协同工作,自己对其进行测试 - http://mqttfx.jfx4ee.org/。它建在Paho上。我猜想Wiresharking它的流量和看到什么是不同的,不管你的代码在电汇上产生什么将是一个很好的开始。 – evilSnobu

+0

如果想要快速嗅探TLS,只需使用STunnel即可。在Windows上也能很好地工作 - https://www.stunnel.org/index.html – evilSnobu

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

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

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

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

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

我尝试使用您的代码中指定的凭据从Paho GUI客户端(我已验证已使用我的凭据连接到Azure - Works !!)连接。我结束了一个错误消息,显示“org.eclipse.paho.client.mqttv3.MqttException:连接丢失”。我希望你没有取消或修改你的凭证的任何部分。尝试使用此paho GUI应用验证您的凭证。

Paho GUI Client