2016-07-15 3 views
0

Мы начали PoC, чтобы подключить некоторый из нашего существующего кода Azure IoT Hub через MQTT, чтобы протестировать поддержку Azure для стандартных протоколов и инструментов. Мы используем клиента Paho, но получаем CONNACK с кодом возврата 5 - Not Authorized.Подключение к Azure IoT Hub с Java Paho

Мы следовали за instructions о том, как настроить концентратор IoT и создать его с помощью шкалы уровня F1 (бесплатно). Затем мы следовали за another Azure document и загрузили Device Explorer, создали устройство и сгенерировали токен SAS. Затем мы подключены все в Pāho:

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 IoT Hub?

Где мы находим какую-либо диагностическую информацию, чтобы мы могли самостоятельно устранить эту проблему?

На стороне примечания мы отложили этот подход (MQTT) и попытались подключиться через службы ReST и получить еще более неоднозначную «500-Internal Server Error» в качестве ответа. Это заставляет нас думать, что здесь есть более фундаментальный вопрос доступа. Является ли концентратор F1 только поддержкой Microsoft SDK? Есть ли какие-то скрытые настройки контроля доступа, которые нам не хватает? Является ли формат имен строгим, не позволяя определенным символам или случаю?

ответ

1

По-видимому, у нас были проблемы с утилитой Device Explorer. Вместо того, чтобы генерировать токен SAS с истечением 365 дней, он генерировал токен всего лишь 365 секунд.

Обратите внимание: se=1468067737 в токене SAS, он выдается по истечении 09 июля 08:35:37 EDT 2016, что уже прошло после нашего выполнения теста.

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 = 3acRHQXXXXXXXXXX Zg% 3d & se = 1468067737 ";' все еще получает код возврата 5. Примерный токен SAS был изменен с вашими отзывами - Спасибо! – SCote

+0

Итак, MQTT.fx работает с IoT Hub, тестировал его сам - http://mqttfx.jfx4ee.org/. Он построен на Пахо. Я думаю, Wiresharking его трафик и видя, что отличается от того, что ваш код производит на проводе, было бы хорошим местом для начала. – evilSnobu

+0

Если вы ищете быстрый способ понюхать TLS, просто используйте STunnel. Прекрасно работает и в Windows - https://www.stunnel.org/index.html – evilSnobu

0

@SCote, мое предложение заключается в том, что вы можете попробовать обратиться к исходный код MqttIotHubConnection.java Azure IoTHub SDK для устройства с Java, который также основан на Paho.

Я просмотрел код, затем нашел разницу ниже для UserName на линии 128 и настроил все свойства в функции updateConnectionOptions на линии 346.

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

Так что я думаю, что вы можете попробовать следовать OFFICAL реализации переписывать свой частичный код.

Надеюсь, это поможет решить вашу проблему.

0

Я попытался подключиться к клиенту GUI Paho (который я уже проверил, уже подключившись к лазурью с моими учетными данными - Works!) С вашими учетными данными, указанными в вашем коде. У меня появилось сообщение об ошибке, показывающее «org.eclipse.paho.client.mqttv3.MqttException: Connection lost».Надеюсь, вы не устранили или не изменили какие-либо части своих учетных данных. Попробуйте подтвердить свои учетные данные с помощью этого приложения GUI для paho.

Paho GUI Client.

Смежные вопросы