Я не могу DeviceClient.connect () на устройство, созданное с помощью GatewayClient на платформе IOT

У меня есть система, в которой устройства используют REST для связи с моим сервером, который действует как шлюз IOT для регистрации и отправки событий от имени устройств. Это нормально работает. Теперь я хотел бы добавить удаленное управление / управление на устройство, для которого я создаю DeviceClient (с использованием API Java). Устройство использует тот же ключ API и токен аутентификации, что и шлюз, и я могу видеть устройство в представлении «Устройства» на панели управления, но когда я подключаюсь (), я получаю сбой подключения. Разрешено ли устройствам, созданным под шлюзом, подключаться напрямую к платформе IOT? Если да, то любые предложения.

Looks like one or more connection parameters are wrong !!!
Apr 27, 2017 9:19:40 AM com.ibm.iotf.client.AbstractClient connect
SEVERE: main: Connecting to Watson IoT Platform failed - one or more connection parameters are wrong !!!
Not authorized to connect (5)
    at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:28)
    at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:990)
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:118)
    at java.lang.Thread.run(Thread.java:745)

Свойства подключения следующие:

{API-Key=a-sl0l32-..., iotp.enabled=true, type=AudioSensor, 
 Organization-ID=sl0l32, Authentication-Method=token, Authentication-Token=...., 
 id=cognitiveear-gmail.com-sensor-name}

и мое устройство отображается на панели управления следующим образом:

Device ID cognitiveear-gmail.com-sensor-name
Device Type AudioSensor
Date Added Thursday, April 27, 2017
Added By a-sl0l32-rsmowsjmuj
Connection State Registered Refresh

person David Wood    schedule 27.04.2017    source источник
comment
Вы сказали, что устройство использует тот же ключ API и токен аутентификации - я ожидаю, что оно подключится с идентификатором устройства и учетными данными. Если вы предоставите свою 6-символьную организацию, я проверю журналы на наличие ошибок.   -  person ValerieLampkin    schedule 27.04.2017
comment
Обновлено сообщение, чтобы включить свойства, используемые DeviceClient.   -  person David Wood    schedule 28.04.2017
comment
Вы не используете ключи API, если подключаетесь как Устройство. Как правило, ставить ключи API на устройства - не лучшая практика. Как говорит Валери, вы используете свой токен (или сертификат, или токен + сертификат). Примеры устройств java на github даст вам хорошую отправную точку.   -  person amadain    schedule 03.05.2017
comment
Я не хочу вручную регистрировать каждое из возможных сотен устройств, как того требуют образцы github. Устройства должны зарегистрироваться. Есть ли способ зарегистрировать / создать устройство с помощью DeviceClient?   -  person David Wood    schedule 05.05.2017


Ответы (3)


Когда вы видите этот вывод: «Похоже, что один или несколько параметров подключения неверны !!!» Скорее всего, значения, которые вы используете для подключения, неверны.

Для шлюза просмотрите этот образец ссылки: https://github.com/ibm-messaging/iot-gateway-samples/tree/master/java/advanced-gateway-sample

Вам нужно будет установить:

  • ID организации = [ID вашей организации]
  • Device-Type = [Тип вашего шлюзового устройства]
  • Device-ID = [ваш идентификатор устройства шлюза]
  • Authentication-Method = токен
  • Authentication-Token = [ваш токен шлюза]

Для устройств см. https://github.com/ibm-messaging/iot-device-samples/tree/master/java

Вам нужно будет установить:

  • ID организации = [ID вашей организации]
  • Тип устройства = [Тип вашего устройства]
  • Device-ID = [ваш идентификатор устройства]
  • Authentication-Method = токен
  • Authentication-Token = [токен вашего устройства]
person Mike T    schedule 27.04.2017
comment
Я обновил вопрос, чтобы показать, что я предоставляю данные, которые вы предлагаете. - person David Wood; 28.04.2017

Проверяя журналы, я вижу ошибку для этого периода времени: Ошибка аутентификации токена (токен устройства / шлюза недействителен), поэтому вы вводите неправильные учетные данные для аутентификации.

Когда вы настраиваете свое устройство с платформой, есть момент, когда вы можете создать токен аутентификации, если вы его не создавали, он был автоматически сгенерирован для вас. Этот токен не подлежит восстановлению после создания устройства, последняя страница в настройке устройства сообщает вам, что вы не сможете получить доступ к токену после этого момента. Поэтому, если вы не помните, что это за токен, вам может потребоваться создать новый экземпляр устройства и записать токен аутентификации. Этот токен аутентификации будет использоваться для пароля, в то время как имя пользователя «use-token-auth» остается фактическим именем пользователя.

Если вы автоматически регистрируете устройства, вы устанавливаете токен или позволяете ему автоматически генерироваться?

person ValerieLampkin    schedule 28.04.2017

Я использовал подход шлюза для регистрации своих устройств, поскольку все мои датчики общались с моим единственным сервером. Однако теперь, когда я хочу получать события на устройствах, мне нужно, чтобы устройства регистрировались непосредственно на платформе IOT. Это в первую очередь для того, чтобы я мог получить токен аутентификации для создания DeviceClient, с помощью которого я затем могу регистрироваться для событий. Для регистрации устройства я использовал APIClient.

    String deviceID = "test-device";
    String deviceTypeID = "test-type";

    Properties props = new Properties(); 
    props.put("Organization-ID","...");
    props.put("API-Key","...");
    props.put("Authentication-Token","...");
    APIClient apiClient = new APIClient(props); 

    // Make sure the device type exists.
    try {
        apiClient.getDeviceType(deviceTypeID);
    } catch (Exception e) { // Device does not exist!
        JsonObject deviceType = new JsonObject();
        deviceType.addProperty("id", deviceTypeID);
        apiClient.addDeviceType(deviceType);
    }
    // Now create the device and get its auth token
    try {
        apiClient.getDevice(deviceTypeID, deviceID);
        apiClient.deleteDevice(deviceTypeID, deviceID);
    } catch (Exception e) { // Device does not exist!
    }
    JsonObject device = new JsonObject();
    device.addProperty("deviceId", deviceID);
    JsonObject resp = apiClient.registerDevice(deviceTypeID, device); 
    String authToken = resp.get("authToken").getAsString();

    // Now create the DeviceClient 
    props.put("Authentication-Method", "token");
    props.put("Authentication-Token", authToken);
    props.put("id", deviceID);
    props.put("type", deviceTypeID);
    DeviceClient devClient = new DeviceClient(props);
    devClient.connect();
    ...
person David Wood    schedule 04.05.2017