2016-07-15 198 views
0

我們已經啓動了一個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嗎?我們缺少一些隱藏的訪問控制設置嗎?名稱的格式是否嚴格,不允許某些字符或大小寫?

回答

1

顯然我們遇到了設備瀏覽器工具問題。它不會生成一個365天到期的SAS令牌,它只會產生365秒的令牌。

請注意SAS令牌中的se=1468067737,它的計算結果爲2016年7月8日08:35:37 EDT,過了我們的測試執行。

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用半天形成密碼後掙扎,我答應你的工作:)

+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

0

@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; 

所以我認爲你可以嘗試按照官方的實現重寫你的部分代碼。

希望它有助於解決您的問題。

0

我嘗試使用您的代碼中指定的憑據從Paho GUI客戶端(我已驗證已使用我的憑據連接到Azure - Works !!)連接。我結束了一個錯誤消息,顯示「org.eclipse.paho.client.mqttv3.MqttException:連接丟失」。我希望你沒有取消或修改你的憑證的任何部分。嘗試使用此paho GUI應用驗證您的憑證。

Paho GUI Client