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

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

Примечание

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

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

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

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

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

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

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

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

  • dmpatterns_getstarted_service.js: консольное приложение .NET, вызывающее прямой метод в приложении имитации устройства с помощью Центра Интернета вещей. Он отображает ответ и обновленные сообщаемые свойства.

Предварительные требования

  • Центр Интернета вещей. Создайте его с помощью CLI или портал Azure.

  • Зарегистрированное устройство. Зарегистрируйте его на портале Azure.

  • Node.js 10.0.x или более поздней версии. В разделе Подготовка среды разработки описана установка Node.js для работы с настоящей статьей в ОС Windows или Linux.

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

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

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

  • создание консольного приложения Node.js, которое отвечает на прямой метод, вызываемый из облака;

  • Запустите перезагрузку имитации устройства.

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

  1. Создайте пустую папку с именем managed-device. В папке managed-device создайте файл package.json с помощью следующей команды в командной строке. Примите значения по умолчанию:

    npm init
    
  2. В командной строке в папке managed-device выполните следующую команду, чтобы установить пакет SDK для устройств azure-iot-device и пакет azure-iot-device-mqtt :

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. С помощью текстового редактора создайте файлdmpatterns_getstarted_device.js в папке managed-device .

  4. Добавьте следующие инструкции require в начале файла dmpatterns_getstarted_device.js:

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Добавьте переменную connectionString, чтобы создать с ее помощью экземпляр клиента. Замените значение заполнителя {yourdeviceconnectionstring} строкой подключения устройства, которую вы видели при регистрации устройства в Центре Интернета вещей:

    var connectionString = '{yourdeviceconnectionstring}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Добавьте следующую функцию, чтобы реализовать прямой метод на устройстве:

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', function(err) {
            if (err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. Откройте подключение к Центру Интернета вещей и запустите прослушиватель прямого метода:

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. Сохраните и закройте файл dmpatterns_getstarted_device.js.

Примечание

Для простоты в этой статье не реализуется политика повтора. В рабочем коде следует реализовать политики повторных попыток (например, с экспоненциальной задержкой), как указано в статье Обработка временных сбоев.

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

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

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

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

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

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

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

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

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

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

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

  1. Создайте пустую папку с именем trigger-reboot-on-device. В папке trigger-reboot-on-device создайте файл package.json с помощью следующей команды в командной строке. Примите значения по умолчанию:

    npm init
    
  2. В командной строке в папке trigger-reboot-on-device выполните следующую команду, чтобы установить пакет SDK для устройств azure-iothub и пакет azure-iot-device-mqtt :

    npm install azure-iothub --save
    
  3. С помощью текстового редактора создайте файлdmpatterns_getstarted_service.js в папке trigger-reboot-on-device .

  4. Добавьте следующие инструкции require в начале файла dmpatterns_getstarted_service.js:

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. Добавьте следующие объявления переменной и замените заполнитель {iothubconnectionstring} строкой подключения к своему экземпляру центра Интернета вещей, скопированной ранее в разделе Получение строки подключения центра Интернета вещей:

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. Добавьте следующую функцию, чтобы вызвать метод устройства для перезагрузки целевого устройства:

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. Добавьте следующую функцию, чтобы запросить устройство и получить сведения о времени последней перезагрузки:

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. Добавьте следующий код для вызова функций, которые активируют прямой метод перезагрузки и запросят сведения о времени последней перезагрузки:

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. Сохраните и закройте файл dmpatterns_getstarted_service.js.

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

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

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

    node dmpatterns_getstarted_device.js
    
  2. В командной строке в папке trigger-reboot-on-device выполните следующую команду, чтобы активировать удаленную перезагрузку, и запросите двойник устройства, чтобы найти время последней перезагрузки.

    node dmpatterns_getstarted_service.js
    
  3. Вы увидите ответ устройства на прямой метод перезагрузки и состояние перезагрузки в консоли.

    Ниже показан ответ устройства на прямой метод перезагрузки, отправленный службой:

    выходные данные приложения manageddevice

    Ниже показана служба, которая запускает перезагрузку и опрашивает двойник устройства, чтобы узнать время последней перезагрузки:

    выходные данные приложения triggerrebootondevice

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

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

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

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

Дальнейшие действия

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

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

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