Бөлісу құралы:


Начало работы с управлением устройствами (Java)

Внутренние приложения могут использовать Центр Интернета вещей Azure примитивы, такие как двойники устройств и прямые методы, для удаленного запуска и мониторинга действий управления устройствами на устройствах. В этой статье показано, как серверное приложение и приложение для устройства взаимодействуют для запуска и отслеживания процесса удаленной перезагрузки устройства с помощью Центра Интернета вещей.

Примечание.

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и бесплатных уровнях Центр Интернета вещей см. в разделе "Выбор подходящего уровня Центр Интернета вещей" для решения.

Прямой метод используется для запуска действий по управлению устройствами (таких как перезагрузка, сброс к параметрам по умолчанию и обновление встроенного ПО) из внутреннего приложения в облаке. Устройство отвечает за следующие действия:

  • Обработка запроса метода, отправленного из Центра Интернета вещей.

  • Инициализация соответствующего действия на определенном устройстве.

  • Предоставление сведений об обновлении состояния в Центр Интернета вещей в сообщаемых свойствах.

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

В этой статье показано, как создать:

  • simulated-device: приложение имитированного устройства с прямым методом, который перезагружает устройство и сообщает время последней перезагрузки. Прямые методы вызываются из облака.

  • trigger-reboot: консольное приложение Java, вызывающее прямой метод в приложении имитированного устройства с помощью Центра Интернета вещей. Он отображает ответ и обновленные сообщаемые свойства.

Примечание.

Статья о пакетах SDK для Центра Интернета вещей Azure содержит сведения о различных пакетах SDK, которые можно использовать для создания приложений, работающих на устройствах и в серверной части решения.

Необходимые компоненты

  • Центр Интернета вещей в подписке Azure. Если у вас еще нет центра, выполните действия, описанные в разделе Создание центра Интернета вещей.

  • Устройство, зарегистрированное в центре Интернета вещей. Если у вас нет устройства в Центре Интернета вещей, выполните действия, описанные в разделе "Регистрация устройства".

  • Пакет SDK для Java SE 8. Щелкните ссылку Java 8 в разделе Долгосрочная поддержка, чтобы скачать все необходимое для работы с JDK 8.

  • Maven 3

  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

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

В этом разделе приведена процедура создания консольного приложения Java, которое имитирует устройство. Приложение прослушивает вызовы прямого метода перезагрузки из вашего Центра Интернета вещей и немедленно отвечает на такие вызовы. Затем приложение на некоторое время переходит в спящий режим, чтобы имитировать процесс перезагрузки, после чего использует переданное свойство для уведомления внутреннего приложения trigger-reboot о завершении перезагрузки.

  1. В папке dm-get-started создайте проект Maven с именем simulated-device, выполнив в командной строке следующую команду:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=simulated-device -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. В командной строке перейдите к папке simulated-device.

  3. Откройте в текстовом редакторе файл pom.xml из папки simulated-device и добавьте приведенную ниже зависимость в узел dependencies. Эта зависимость позволит вам использовать в приложении пакет iot-service-client для обмена данными с Центром Интернета вещей:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-device-client</artifactId>
      <version>1.17.5</version>
    </dependency>
    

    Примечание.

    Наличие последней версии пакета iot-device-client можно проверить с помощью поиска Maven.

  4. Добавьте указанную ниже зависимость в узел dependencies. Эта зависимость настраивает NOP для интерфейса ведения журнала Apache SLF4J, который используется пакетом SDK клиента устройства для реализации ведения журнала. Эта конфигурация является необязательной, но если ее опустить, при запуске приложения может появиться предупреждение в консоли. Дополнительные сведения о ведении журнала в пакете SDK клиента устройства см. в разделе Ведение журнала в файле сведений Примеры для пакета SDK для устройств Azure IoT для Java.

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.28</version>
    </dependency>
    
  5. Добавьте следующий узел, build, после узла dependencies. Эта конфигурация дает указание Maven использовать Java версии 1.8 для создания приложения:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </build>
    
  6. Сохраните и закройте файл pom.xml.

  7. Откройте в текстовом редакторе исходный файл simulated-device\src\main\java\com\mycompany\app\App.java.

  8. Добавьте в файл следующие инструкции import .

    import com.microsoft.azure.sdk.iot.device.*;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.*;
    
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.time.LocalDateTime;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.HashSet;
    
  9. Добавьте в класс App . Замените {yourdeviceconnectionstring} строкой подключения устройства, которую вы видели при регистрации устройства в Центре Интернета вещей:

    private static final int METHOD_SUCCESS = 200;
    private static final int METHOD_NOT_DEFINED = 404;
    
    private static IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
    private static String connString = "{yourdeviceconnectionstring}";
    private static DeviceClient client;
    
  10. Чтобы реализовать обработчик обратного вызова для событий состояния прямого метода, добавьте следующий вложенный класс в класс App:

    protected static class DirectMethodStatusCallback implements IotHubEventCallback
    {
      public void execute(IotHubStatusCode status, Object context)
      {
        System.out.println("IoT Hub responded to device method operation with status " + status.name());
      }
    }
    
  11. Чтобы реализовать обработчик обратного вызова для событий состояния двойника устройства, добавьте следующий вложенный класс в класс App:

    protected static class DeviceTwinStatusCallback implements IotHubEventCallback
    {
        public void execute(IotHubStatusCode status, Object context)
        {
            System.out.println("IoT Hub responded to device twin operation with status " + status.name());
        }
    }
    
  12. Чтобы реализовать обработчик обратного вызова для событий свойства, добавьте следующий вложенный класс в класс App:

    protected static class PropertyCallback implements PropertyCallBack<String, String>
    {
      public void PropertyCall(String propertyKey, String propertyValue, Object context)
      {
        System.out.println("PropertyKey:     " + propertyKey);
        System.out.println("PropertyKvalue:  " + propertyKey);
      }
    }
    
  13. Для реализации потока для имитации перезагрузка устройства добавьте указанный ниже вложенный класс в класс App. Поток бездействует в течение пяти секунд, а затем устанавливает переданное свойство lastReboot:

    protected static class RebootDeviceThread implements Runnable {
      public void run() {
        try {
          System.out.println("Rebooting...");
          Thread.sleep(5000);
          Property property = new Property("lastReboot", LocalDateTime.now());
          Set<Property> properties = new HashSet<Property>();
          properties.add(property);
          client.sendReportedProperties(properties);
          System.out.println("Rebooted");
        }
        catch (Exception ex) {
          System.out.println("Exception in reboot thread: " + ex.getMessage());
        }
      }
    }
    
  14. Чтобы реализовать прямой метод на устройстве, добавьте указанный ниже вложенный класс в класс App. Когда приложение имитации получает вызов прямого метода reboot, оно возвращает вызывающему объекту подтверждение, а затем запускает поток для обработки перезагрузки:

    protected static class DirectMethodCallback implements com.microsoft.azure.sdk.iot.device.DeviceTwin.DeviceMethodCallback
    {
      @Override
      public DeviceMethodData call(String methodName, Object methodData, Object context)
      {
        DeviceMethodData deviceMethodData;
        switch (methodName)
        {
          case "reboot" :
          {
            int status = METHOD_SUCCESS;
            System.out.println("Received reboot request");
            deviceMethodData = new DeviceMethodData(status, "Started reboot");
            RebootDeviceThread rebootThread = new RebootDeviceThread();
            Thread t = new Thread(rebootThread);
            t.start();
            break;
          }
          default:
          {
            int status = METHOD_NOT_DEFINED;
            deviceMethodData = new DeviceMethodData(status, "Not defined direct method " + methodName);
          }
        }
        return deviceMethodData;
      }
    }
    
  15. Измените сигнатуру метода main, чтобы создавать следующие исключения:

    public static void main(String[] args) throws IOException, URISyntaxException
    
  16. Для создания экземпляра DeviceClient замените код в методе main следующим кодом:

    System.out.println("Starting device client sample...");
    client = new DeviceClient(connString, protocol);
    
  17. Чтобы запустить прослушивание вызовов прямого метода, добавьте следующий код в метод main:

    try
    {
      client.open();
      client.subscribeToDeviceMethod(new DirectMethodCallback(), null, new DirectMethodStatusCallback(), null);
      client.startDeviceTwin(new DeviceTwinStatusCallback(), null, new PropertyCallback(), null);
      System.out.println("Subscribed to direct methods and polling for reported properties. Waiting...");
    }
    catch (Exception e)
    {
      System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \n" +  e.getMessage());
      client.close();
      System.out.println("Shutting down...");
    }
    
  18. Для завершения работы симулятора устройства добавьте следующий код в метод main:

    System.out.println("Press any key to exit...");
    Scanner scanner = new Scanner(System.in);
    scanner.nextLine();
    scanner.close();
    client.close();
    System.out.println("Shutting down...");
    
  19. Сохраните и закройте файл simulated-device\src\main\java\com\mycompany\app\App.java.

  20. Создайте приложение simulated-device и исправьте все ошибки. В командной строке перейдите к папке simulated-device и выполните следующую команду:

    mvn clean package -DskipTests
    

Получение строки подключения центра Интернета вещей

В этой статье вы создадите серверную службу, которая вызывает прямой метод на устройстве. Чтобы вызвать прямой метод на устройстве через Центр Интернета вещей, службе требуется разрешение service connect. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра Интернета вещей выберите Политики общего доступа.

  3. В списке политик выберите политику службы.

  4. Скопируйте основную строку подключения и сохраните значение.

Снимок экрана: извлечение строки подключения из Центра Интернета вещей на портале Azure.

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Создание приложения службы для активации перезагрузки

В этом разделе приведена процедура создания консольного приложения Java, которое выполняет следующие действия:

  1. вызывает прямой метод перезагрузки в приложении имитации устройства;

  2. отображает ответ;

  3. опрашивает переданные свойства, отправляемые с устройства, для определения завершения перезагрузки.

Это консольное приложение подключается к Центру Интернета вещей для вызова прямого метода и чтения переданных свойств.

  1. Создайте пустую папку с именем dm-get-started.

  2. В папке dm-get-started создайте проект Maven с именем trigger-reboot, выполнив в командной строке следующую команду:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=trigger-reboot -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  3. В командной строке перейдите к папке trigger-reboot.

  4. Откройте в текстовом редакторе файл pom.xml из папки trigger-reboot и добавьте зависимости, приведенные ниже, в узел dependencies. Эта зависимость позволит вам использовать в приложении пакет iot-service-client для обмена данными с Центром Интернета вещей:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-service-client</artifactId>
      <version>1.17.1</version>
      <type>jar</type>
    </dependency>
    

    Примечание.

    Наличие последней версии пакета iot-service-client можно проверить с помощью поиска Maven.

  5. Добавьте следующий узел, build, после узла dependencies. Эта конфигурация дает указание Maven использовать Java версии 1.8 для создания приложения:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </build>
    
  6. Сохраните и закройте файл pom.xml.

  7. Откройте в текстовом редакторе файл trigger-reboot\src\main\java\com\mycompany\app\App.java.

  8. Добавьте в файл следующие инструкции import .

    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceMethod;
    import com.microsoft.azure.sdk.iot.service.devicetwin.MethodResult;
    import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;
    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceTwin;
    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceTwinDevice;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
  9. Добавьте в класс App . Замените {youriothubconnectionstring} строкой подключения Центра Интернета вещей, скопированной ранее в разделе Получение строки подключения центра Интернета вещей:

    public static final String iotHubConnectionString = "{youriothubconnectionstring}";
    public static final String deviceId = "myDeviceId";
    
    private static final String methodName = "reboot";
    private static final Long responseTimeout = TimeUnit.SECONDS.toSeconds(30);
    private static final Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);
    
  10. Для реализации потока, который считывает переданные свойства с двойника устройства каждые 10 секунд, добавьте следующий вложенный класс в класс App:

    private static class ShowReportedProperties implements Runnable {
      public void run() {
        try {
          DeviceTwin deviceTwins = DeviceTwin.createFromConnectionString(iotHubConnectionString);
          DeviceTwinDevice twinDevice = new DeviceTwinDevice(deviceId);
          while (true) {
            System.out.println("Get reported properties from device twin");
            deviceTwins.getTwin(twinDevice);
            System.out.println(twinDevice.reportedPropertiesToString());
            Thread.sleep(10000);
          }
        } catch (Exception ex) {
          System.out.println("Exception reading reported properties: " + ex.getMessage());
        }
      }
    }
    
  11. Измените сигнатуру основного метода, чтобы создавать следующие исключения:

    public static void main(String[] args) throws IOException
    
  12. Для вызова прямого метода перезагрузки на имитируемом устройстве замените код в методе main на следующий код:

    System.out.println("Starting sample...");
    DeviceMethod methodClient = DeviceMethod.createFromConnectionString(iotHubConnectionString);
    
    try
    {
      System.out.println("Invoke reboot direct method");
      MethodResult result = methodClient.invoke(deviceId, methodName, responseTimeout, connectTimeout, null);
    
      if(result == null)
      {
        throw new IOException("Invoke direct method reboot returns null");
      }
      System.out.println("Invoked reboot on device");
      System.out.println("Status for device:   " + result.getStatus());
      System.out.println("Message from device: " + result.getPayload());
    }
    catch (IotHubException e)
    {
        System.out.println(e.getMessage());
    }
    
  13. Добавьте следующий код в метод main для запуска потока, опрашивающего переданные свойства на имитируемом устройстве:

    ShowReportedProperties showReportedProperties = new ShowReportedProperties();
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.execute(showReportedProperties);
    
  14. Чтобы иметь возможность остановить приложение, добавьте следующий код в метод main:

    System.out.println("Press ENTER to exit.");
    System.in.read();
    executor.shutdownNow();
    System.out.println("Shutting down sample...");
    
  15. Сохраните и закройте файл trigger-reboot\src\main\java\com\mycompany\app\App.java.

  16. Выполните сборку внутреннего приложения trigger-reboot и исправьте ошибки (при наличии). В командной строке перейдите к папке trigger-reboot и выполните следующую команду:

    mvn clean package -DskipTests
    

Запуск приложений

Теперь все готово к запуску приложений.

  1. В командной строке в папке simulated-device выполните следующую команду, чтобы начать прослушивать вызовы метода перезагрузки из центра Интернета вещей:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    Приложение имитации устройства Центра Интернета вещей на языке Java для прослушивания вызовов прямого метода перезагрузки

  2. В командной строке в папке trigger-reboot выполните следующую команду, чтобы вызвать метод перезагрузки на имитируемом устройстве из центра Интернета вещей:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    Приложение службы Центра Интернета вещей на языке Java для вызова прямого метода перезагрузки

  3. Ответ имитируемого устройства на вызов прямого метода перезагрузки:

    Ответ приложения имитации устройства Центра Интернета вещей на языке Java на вызов прямого метода

Настройка и расширенные возможности действий по управлению устройствами

Решения Интернета вещей позволяют расширить определенный набор шаблонов управления устройствами или добавить пользовательские шаблоны. Для этого используются примитивы — двойники устройств и методы передачи из облака на устройство. Примеры других действий по управлению устройствами: сброс к параметрам по умолчанию, обновление встроенного ПО, обновление программного обеспечения, управление питанием, управление сетями и подключениями и шифрование данных.

Периоды обслуживания устройств

Как правило устройства настраиваются на выполнение действий по очереди, что позволяет свести к минимуму прерывания в работе и время простоя. Периоды обслуживания устройств — это распространенный шаблон для определения времени, когда выполняется обновление конфигурации устройства. Ваши серверные решения могут использовать необходимые свойства двойника устройства для определения и активации на устройстве политики, которая задает период обслуживания. Когда устройство получает политику периода обслуживания, оно может использовать сообщаемые свойства двойника устройства для предоставления сведений о состоянии политики. Затем серверное приложение может использовать запросы двойника устройства для подтверждения соответствия устройств и каждой политики.

Следующие шаги

В этой статье для запуска удаленной перезагрузки устройства использовался прямой метод. Здесь использовались сообщаемые свойства для передачи с устройства сведений о последней перезагрузке, а также выполняли запрос к двойнику устройства для поиска значения времени последней перезагрузки устройства из облака.

Для продолжения работы с Центром Интернета вещей и шаблонами управления устройствами, такими как полное обновление на основе образа, ознакомьтесь со статьейРабота с Обновлением устройств для Центра Интернета вещей Azure: использование эталонного образа для Raspberry Pi 3 B+.

Дополнительные сведения о расширении решения Центра Интернета вещей и планировании вызовов методов на нескольких устройствах см. в разделе Планирование и трансляция заданий.