Подключение устройства к предварительно настроенному решению для удаленного мониторинга (Node.js)

Общие сведения о сценарии

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

  • наружная температура;
  • внутренняя температура;
  • влажность.

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

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

Для работы с этим руководством требуется активная учетная запись Azure. Если ее нет, можно создать бесплатную пробную учетную запись всего за несколько минут. Дополнительные сведения см. в разделе Бесплатная пробная версия Azure.

Перед началом работы

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

Подготовка предварительно настроенного решения для удаленного мониторинга

Созданное в этом руководстве устройство отправляет данные в экземпляр предварительно настроенного решения для удаленного мониторинга. Если вы еще не подготовили это решение в своей учетной записи Azure, то выполните следующие действия:

  1. Чтобы создать решение, на странице https://www.azureiotsolutions.com/ щелкните +.
  2. На панели Удаленный мониторинг щелкните Выбрать.
  3. На странице Create Remote monitoring solution (Создание решения для удаленного мониторинга) введите имя решения по своему усмотрению, выберите регион для развертывания и подписку Azure, которую нужно использовать. Затем щелкните Создать решение.
  4. Дождитесь завершения процесса подготовки.

Предупреждение

В предварительно настроенных решениях используются платные службы Azure. Закончив работу с предварительно настроенным решением, не забудьте удалить его из подписки, чтобы избежать ненужных расходов. На странице https://www.azureiotsolutions.com/ можно полностью удалить предварительно настроенное решение из подписки.

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

Панель мониторинга решения

Подготовка устройства в решении для удаленного мониторинга

Примечание

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

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

Чтобы добавить устройство в решение для удаленного мониторинга, выполните следующие действия на панели мониторинга решения:

  1. В левом нижнем углу панели мониторинга щелкните Добавить устройство.

    Добавление устройства

  2. На панели Пользовательское устройство нажмите кнопку Добавить.

    Добавление пользовательского устройства

  3. Установите переключатель Позвольте мне определить собственный идентификатор устройства. Введите идентификатор устройства, например mydevice, и нажмите кнопку Проверить идентификатор, чтобы убедиться, что такое имя не используется. Затем нажмите кнопку Создать, чтобы подготовить устройство.

    Добавление идентификатора устройства

  4. Запишите учетные данные (идентификатор устройства, имя узла в Центре Интернета вещей и ключ устройства). Эти значения потребуются клиентскому приложению при подключении к решению для удаленного мониторинга. Затем нажмите кнопку Done(Готово).

    Просмотр учетных данных устройства

  5. Выберите устройство в списке устройств на панели мониторинга решения. Затем на панели Сведения об устройстве щелкните Включить устройство. Теперь текущее состояние устройства — Работает. Решение для удаленного мониторинга теперь может получать данные телеметрии с устройства и вызывать методы на устройстве.

Создание примера решения Node.js

Убедитесь, что на компьютере разработки установлен компонент Node.js 0.11.5 или более поздней версии. Можно запустить node --version в командной строке, чтобы проверить версию.

  1. Создайте папку RemoteMonitoring на компьютере разработки. Перейдите к этой папке в среде командной строки.

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

    npm init
    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. В папке RemoteMonitoring создайте файл с именем remote_monitoring.js. Откройте этот файл в текстовом редакторе.

  4. Откройте файл remote-monitoring.js и добавьте следующие инструкции require:

    'use strict';
    
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    var Client = require('azure-iot-device').Client;
    var ConnectionString = require('azure-iot-device').ConnectionString;
    var Message = require('azure-iot-device').Message;
    
  5. После операторов require добавьте указанные ниже объявления переменных. Замените значения заполнителей [Device Id] и [Device Key] ранее записанными значениями для своего устройства, отображенными на панели мониторинга решения для удаленного мониторинга. Замените [IoTHub Name] именем узла Центра Интернета вещей, отображенным на панели мониторинга решения. Например, если имя узла Центра Интернета вещей — contoso.azure-devices.net, замените [имя_Центра_Интернета_вещей] на contoso.

    var connectionString = 'HostName=[IoTHub Name].azure-devices.net;DeviceId=[Device Id];SharedAccessKey=[Device Key]';
    var deviceId = ConnectionString.parse(connectionString).DeviceId;
    
  6. Добавьте следующие переменные для определения некоторых базовых данных телеметрии:

    var temperature = 50;
    var humidity = 50;
    var externalTemperature = 55;
    
  7. Добавьте следующую вспомогательную функцию для вывода результатов операции:

    function printErrorFor(op) {
        return function printError(err) {
            if (err) console.log(op + ' error: ' + err.toString());
        };
    }
    
  8. Добавьте следующую вспомогательную функцию для создания случайных значений телеметрии:

    function generateRandomIncrement() {
        return ((Math.random() * 2) - 1);
    }
    
  9. Добавьте следующее определение для объекта DeviceInfo, который отправляет устройство во время запуска:

    var deviceMetaData = {
        'ObjectType': 'DeviceInfo',
        'IsSimulatedDevice': 0,
        'Version': '1.0',
        'DeviceProperties': {
            'DeviceID': deviceId,
            'HubEnabledState': 1
        }
    };
    
  10. Добавьте следующее определение для сообщаемых значений двойников устройств. Это определение включает в себя описания прямых методов, которые поддерживает устройство.

    var reportedProperties = {
        "Device": {
            "DeviceState": "normal",
            "Location": {
                "Latitude": 47.642877,
                "Longitude": -122.125497
            }
        },
        "Config": {
            "TemperatureMeanValue": 56.7,
            "TelemetryInterval": 45
        },
        "System": {
            "Manufacturer": "Contoso Inc.",
            "FirmwareVersion": "2.22",
            "InstalledRAM": "8 MB",
            "ModelNumber": "DB-14",
            "Platform": "Plat 9.75",
            "Processor": "i3-9",
            "SerialNumber": "SER99"
        },
        "Location": {
            "Latitude": 47.642877,
            "Longitude": -122.125497
        },
        "SupportedMethods": {
            "Reboot": "Reboot the device",
            "InitiateFirmwareUpdate--FwPackageURI-string": "Updates device Firmware. Use parameter FwPackageURI to specifiy the URI of the firmware file"
        },
    }
    
  11. Добавьте следующую функцию для обработки вызова прямого метода Reboot:

    function onReboot(request, response) {
        // Implement actual logic here.
        console.log('Simulated reboot...');
    
        // Complete the response
        response.send(200, "Rebooting device", 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.' );
            }
        });
    }
    
  12. Добавьте следующую функцию для обработки вызова прямого метода InitiateFirmwareUpdate. Этот прямой метод использует параметр, чтобы указать расположение образа встроенного ПО для загрузки, и инициирует асинхронное обновление встроенного ПО на устройстве:

    function onInitiateFirmwareUpdate(request, response) {
        console.log('Simulated firmware update initiated, using: ' + request.payload.FwPackageURI);
    
        // Complete the response
        response.send(200, "Firmware update initiated", 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.' );
            }
        });
    
        // Add logic here to perform the firmware update asynchronously
    }
    
  13. Добавьте следующий код для создания экземпляра клиента:

    var client = Client.fromConnectionString(connectionString, Protocol);
    
  14. Добавьте следующий код, который:

    • открывает подключение;
    • отправляет объект DeviceInfo;
    • настраивает обработчик для требуемых свойств;
    • отправляет сообщаемые свойства;
    • регистрирует обработчики для прямых методов;
    • начинает отправку данных телеметрии.
    client.open(function (err) {
        if (err) {
            printErrorFor('open')(err);
        } else {
            console.log('Sending device metadata:\n' + JSON.stringify(deviceMetaData));
            client.sendEvent(new Message(JSON.stringify(deviceMetaData)), printErrorFor('send metadata'));
    
            // Create device twin
            client.getTwin(function(err, twin) {
                if (err) {
                    console.error('Could not get device twin');
                } else {
                    console.log('Device twin created');
    
                    twin.on('properties.desired', function(delta) {
                        console.log('Received new desired properties:');
                        console.log(JSON.stringify(delta));
                    });
    
                    // Send reported properties
                    twin.properties.reported.update(reportedProperties, function(err) {
                        if (err) throw err;
                        console.log('twin state reported');
                    });
    
                    // Register handlers for direct methods
                    client.onDeviceMethod('Reboot', onReboot);
                    client.onDeviceMethod('InitiateFirmwareUpdate', onInitiateFirmwareUpdate);
                }
            });
    
            // Start sending telemetry
            var sendInterval = setInterval(function () {
                temperature += generateRandomIncrement();
                externalTemperature += generateRandomIncrement();
                humidity += generateRandomIncrement();
    
                var data = JSON.stringify({
                    'DeviceID': deviceId,
                    'Temperature': temperature,
                    'Humidity': humidity,
                    'ExternalTemperature': externalTemperature
                });
    
                console.log('Sending device event data:\n' + data);
                client.sendEvent(new Message(data), printErrorFor('send event'));
            }, 5000);
    
            client.on('error', function (err) {
                printErrorFor('client')(err);
                if (sendInterval) clearInterval(sendInterval);
                client.close(printErrorFor('client.close'));
            });
        }
    });
    
  15. Сохраните изменения в файле remote_monitoring.js.

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

    node remote_monitoring.js
    

Просмотр данных телеметрии устройства на панели мониторинга

На панели мониторинга в решении для удаленного мониторинга можно просматривать данные телеметрии, отправляемые устройством в Центр Интернета вещей.

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

  2. В списке устройств отображается текущее состояние устройства — Работает. Если это не так, то на панели Сведения об устройстве щелкните Включить устройство.

    Просмотр состояния устройства

  3. Щелкните Панель мониторинга, чтобы вернуться на панель мониторинга, в раскрывающемся списке Device to View (Устройство для просмотра) выберите свое устройство, чтобы просмотреть его данные телеметрии. Телеметрия из примера приложения — 50 единиц данных о внутренней температуре, 55 единиц данных о наружной температуре и 50 единиц данных о влажности.

    Просмотр телеметрии устройства

Вызов метода на устройстве

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

  1. На панели мониторинга решения для удаленного мониторинга в левой панели щелкните Устройства, чтобы перейти к списку устройств.

  2. Щелкните Идентификатор устройства для устройства в списке устройств.

  3. На панели Сведения об устройстве щелкните Методы.

    Методы устройства

  4. В раскрывающемся списке Метод выберите InitiateFirmwareUpdate, а затем в поле FWPACKAGEURI введите фиктивный URL-адрес. Щелкните Вызвать метод, чтобы вызвать метод на устройстве.

    Вызов метода устройства

  5. Когда устройство обрабатывает метод, в консоли отображается сообщение о выполнении кода устройства. Результаты метода добавляются в журнал на портале решения:

    Просмотр журнала методов

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

В статье Настройка предварительно настроенного решения приведен ряд способов расширения этого примера. В их число входит использование реальных датчиков и реализация дополнительных команд.

Дополнительные сведения см. в статье Разрешения на сайте azureiotsuite.com.