2016-07-15 23 views
0

Wir haben ein PoC gestartet, um einen Teil unseres bestehenden Codes mit dem Azure IoT Hub über MQTT zu verbinden, um die Unterstützung von Azure für Standardprotokolle und -tools zu testen. Wir verwenden den Paho-Client, erhalten jedoch einen CONNACK mit einem Rückgabecode von 5 - Nicht autorisiert.Verbinden mit Azure IoT Hub mit Java Paho

Wir verfolgten die instructions auf, wie man einen IoT-Hub einrichtet und einen mit der F1 (frei) Skalierungsstufe erstellt. Wir folgten dann another Azure document und luden den Geräte-Explorer herunter, erstellten ein Gerät und generierten ein SAS-Token. Wir gesteckt dann alles in 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) {} 
    } 
    } 
} 

Wir haben mit Wireshark bestätigt, dass eine SSL-Verbindung zu Azure gemacht wird und dass das CONNECT-Paket gesendet wird. Wir sehen dann das CONNACK mit einem Rückkehrcode von 5 an Paho und Azure, der die Verbindung bald darauf löscht. Wir haben uns dann die "Richtlinien für den gemeinsamen Zugriff" angesehen und verschiedene Einstellungen ausprobiert. Es gibt nichts in den Audit-Protokollen und wir haben "verbose" für alles aktiviert.

Hat jemand Paho (oder einen anderen Java-Client von Drittanbietern) mit dem Azure IoT Hub verbunden?

Wo finden wir irgendwelche diagnostischen Informationen, damit wir selbst diese Fehler beheben können?

Nebenbei bemerkt, haben wir diesen Ansatz (MQTT) auf Eis gelegt und versucht, eine Verbindung über die ReST-Dienste herzustellen und einen noch mehrdeutigen "500-Internal Server Error" als Antwort zu erhalten. Dies lässt uns glauben, dass es hier ein grundlegenderes Zugangsproblem gibt. Unterstützt der F1-Scale-Hub nur das Microsoft SDK? Gibt es versteckte Einstellungen für die Zugriffskontrolle, die wir vermissen? Ist das Format der Namen streng, bestimmte Zeichen oder Fälle nicht erlaubt?

Antwort

1

Anscheinend hatten wir Probleme mit dem Geräte-Explorer-Dienstprogramm. Anstatt ein SAS-Token mit einem Ablauf von 365 Tagen zu generieren, generierte es nur für 365 Sekunden ein Token.

Beachten Sie die se=1468067737 in der SAS-Token, es handelt sich um einen Ablauf von Jul 09 08:35:37 EDT 2016, weit nach unserer Testausführung.

0

Ihr SAS-Token sieht ein wenig aus.

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

vs. was in der Dokumentation ist:

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

Ja, Leerzeichen enthalten.

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

ich gemacht, dass PR, nachdem sie mit kämpfen, um das Passwort für einen halben Tag bilden, ich Ihnen versprechen, das funktioniert :)

+0

Guter Fang, aber immer noch keine Freude. SAS-Token geändert in 'String sasToken =" SharedAccessSignature sr = CoyoteIoT.azure-devices.net% 2fdevices% 2fdevice-fcbd127a & sig = 3acRHQXXXXXXXXXXX Zg% 3d & se = 1468067737 ";' erhält immer noch den Rückgabecode 5. Das Beispiel für das SAS-Token wurde geändert mit Ihrem Feedback - Danke! – SCote

+0

Also arbeitet MQTT.fx mit IoT Hub, testete es selbst - http://mqttfx.jfx4ee.org/. Es ist auf Paho gebaut. Ich schätze, Wiresharking seinen Verkehr und zu sehen, was anders ist als was auch immer Ihr Code auf dem Draht produziert, wäre ein guter Anfang. – evilSnobu

+0

Wenn Sie nach einem schnellen Weg suchen, TLS zu schnüffeln, verwenden Sie einfach STunnel. Funktioniert auch unter Windows wunderbar - https://www.stunnel.org/index.html – evilSnobu

0

@SCote, mein Vorschlag ist, dass Sie versuchen können, beziehen der Quellcode MqttIotHubConnection.java von Azure IoTHub SDK für Gerät mit Java, das ebenfalls auf Paho basiert.

Ich sah den Code, dann fand den Unterschied unten für UserName an der Linie 128 und richten Sie alle Eigenschaften in der Funktion updateConnectionOptions an der Linie 346.

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

So denke ich, können Sie versuchen, die offizielle Implementierung zu folgen, um Ihren Teil-Code neu zu schreiben.

Ich hoffe, es hilft bei der Lösung Ihres Problems.

0

Ich versuchte Verbindung von Paho GUI-Client (die ich validiert bereits Verbindung zu azurblau mit meinen Anmeldeinformationen - funktioniert !!) mit Ihren Anmeldeinformationen in Ihrem Code angegeben. Ich endete mit einer Fehlermeldung, die "org.eclipse.paho.client.mqttv3.MqttException: Connection lost" zeigte.Ich hoffe, Sie haben keine Teile Ihrer Anmeldedaten gelöscht oder geändert. Versuchen Sie, Ihre Anmeldeinformationen mit dieser Paho-GUI-App zu validieren.

Paho GUI Client.