Подключение устройства к предварительно настроенному решению для удаленного мониторинга (Node.js)
Общие сведения о сценарии
В этом примере создается устройство, которое отправляет следующие данные телеметрии в предварительно настроенное решение для удаленного мониторинга:
- наружная температура;
- внутренняя температура;
- влажность.
В целях упрощения код на устройстве генерирует образцы значений, но мы рекомендуем расширить пример и подключить к устройству реальные датчики и отправить реальные данные телеметрии.
Устройство также может отвечать на методы, вызываемые из панели мониторинга решения, и значения требуемых свойств, заданные на панели мониторинга решения.
Для работы с этим руководством требуется активная учетная запись Azure. Если ее нет, можно создать бесплатную пробную учетную запись всего за несколько минут. Дополнительные сведения см. в разделе Бесплатная пробная версия Azure.
Перед началом работы
До написания кода для устройства необходимо подготовить свое предварительно настроенное решение для удаленного мониторинга, а затем подготовить в нем новое пользовательское устройство.
Подготовка предварительно настроенного решения для удаленного мониторинга
Созданное в этом руководстве устройство отправляет данные в экземпляр предварительно настроенного решения для удаленного мониторинга. Если вы еще не подготовили это решение в своей учетной записи Azure, то выполните следующие действия:
- Чтобы создать решение, на странице https://www.azureiotsolutions.com/ щелкните +.
- На панели Удаленный мониторинг щелкните Выбрать.
- На странице Create Remote monitoring solution (Создание решения для удаленного мониторинга) введите имя решения по своему усмотрению, выберите регион для развертывания и подписку Azure, которую нужно использовать. Затем щелкните Создать решение.
- Дождитесь завершения процесса подготовки.
Предупреждение
В предварительно настроенных решениях используются платные службы Azure. Закончив работу с предварительно настроенным решением, не забудьте удалить его из подписки, чтобы избежать ненужных расходов. На странице https://www.azureiotsolutions.com/ можно полностью удалить предварительно настроенное решение из подписки.
После завершения подготовки решения для удаленного мониторинга щелкните Запустить , чтобы открыть панель мониторинга этого решения в браузере.
Подготовка устройства в решении для удаленного мониторинга
Примечание
Если вы уже подготовили устройство в решении, пропустите этот шаг. При создании клиентского приложения необходимо знать учетные данные устройства.
Чтобы устройство смогло подключиться к предварительно настроенному решению, оно должно пройти идентификацию в Центре Интернета вещей с использованием допустимых учетных данных. Учетные данные устройства можно получить на панели мониторинга решения. Вы добавите их в клиентское приложение далее в этом учебнике.
Чтобы добавить устройство в решение для удаленного мониторинга, выполните следующие действия на панели мониторинга решения:
В левом нижнем углу панели мониторинга щелкните Добавить устройство.
На панели Пользовательское устройство нажмите кнопку Добавить.
Установите переключатель Позвольте мне определить собственный идентификатор устройства. Введите идентификатор устройства, например mydevice, и нажмите кнопку Проверить идентификатор, чтобы убедиться, что такое имя не используется. Затем нажмите кнопку Создать, чтобы подготовить устройство.
Запишите учетные данные (идентификатор устройства, имя узла в Центре Интернета вещей и ключ устройства). Эти значения потребуются клиентскому приложению при подключении к решению для удаленного мониторинга. Затем нажмите кнопку Done(Готово).
Выберите устройство в списке устройств на панели мониторинга решения. Затем на панели Сведения об устройстве щелкните Включить устройство. Теперь текущее состояние устройства — Работает. Решение для удаленного мониторинга теперь может получать данные телеметрии с устройства и вызывать методы на устройстве.
Создание примера решения Node.js
Убедитесь, что на компьютере разработки установлен компонент Node.js 0.11.5 или более поздней версии. Можно запустить node --version
в командной строке, чтобы проверить версию.
Создайте папку RemoteMonitoring на компьютере разработки. Перейдите к этой папке в среде командной строки.
Выполните следующие команды, чтобы скачать и установить пакеты, необходимые для выполнения примера приложения:
npm init npm install azure-iot-device azure-iot-device-mqtt --save
В папке RemoteMonitoring создайте файл с именем remote_monitoring.js. Откройте этот файл в текстовом редакторе.
Откройте файл 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;
После операторов
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;
Добавьте следующие переменные для определения некоторых базовых данных телеметрии:
var temperature = 50; var humidity = 50; var externalTemperature = 55;
Добавьте следующую вспомогательную функцию для вывода результатов операции:
function printErrorFor(op) { return function printError(err) { if (err) console.log(op + ' error: ' + err.toString()); }; }
Добавьте следующую вспомогательную функцию для создания случайных значений телеметрии:
function generateRandomIncrement() { return ((Math.random() * 2) - 1); }
Добавьте следующее определение для объекта DeviceInfo, который отправляет устройство во время запуска:
var deviceMetaData = { 'ObjectType': 'DeviceInfo', 'IsSimulatedDevice': 0, 'Version': '1.0', 'DeviceProperties': { 'DeviceID': deviceId, 'HubEnabledState': 1 } };
Добавьте следующее определение для сообщаемых значений двойников устройств. Это определение включает в себя описания прямых методов, которые поддерживает устройство.
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" }, }
Добавьте следующую функцию для обработки вызова прямого метода 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.' ); } }); }
Добавьте следующую функцию для обработки вызова прямого метода 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 }
Добавьте следующий код для создания экземпляра клиента:
var client = Client.fromConnectionString(connectionString, Protocol);
Добавьте следующий код, который:
- открывает подключение;
- отправляет объект 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')); }); } });
Сохраните изменения в файле remote_monitoring.js.
Выполните следующую команду в командной строке, чтобы запустить пример приложения:
node remote_monitoring.js
Просмотр данных телеметрии устройства на панели мониторинга
На панели мониторинга в решении для удаленного мониторинга можно просматривать данные телеметрии, отправляемые устройством в Центр Интернета вещей.
В браузере вернитесь на панель мониторинга решения для удаленного мониторинга, в левой панели щелкните Устройства, чтобы перейти к списку устройств.
В списке устройств отображается текущее состояние устройства — Работает. Если это не так, то на панели Сведения об устройстве щелкните Включить устройство.
Щелкните Панель мониторинга, чтобы вернуться на панель мониторинга, в раскрывающемся списке Device to View (Устройство для просмотра) выберите свое устройство, чтобы просмотреть его данные телеметрии. Телеметрия из примера приложения — 50 единиц данных о внутренней температуре, 55 единиц данных о наружной температуре и 50 единиц данных о влажности.
Вызов метода на устройстве
На панели мониторинга в решении для удаленного мониторинга можно вызывать методы на своих устройствах через Центр Интернета вещей. Например, в решении для удаленного мониторинга можно вызвать метод, имитирующий перезагрузку устройства.
На панели мониторинга решения для удаленного мониторинга в левой панели щелкните Устройства, чтобы перейти к списку устройств.
Щелкните Идентификатор устройства для устройства в списке устройств.
На панели Сведения об устройстве щелкните Методы.
В раскрывающемся списке Метод выберите InitiateFirmwareUpdate, а затем в поле FWPACKAGEURI введите фиктивный URL-адрес. Щелкните Вызвать метод, чтобы вызвать метод на устройстве.
Когда устройство обрабатывает метод, в консоли отображается сообщение о выполнении кода устройства. Результаты метода добавляются в журнал на портале решения:
Дальнейшие действия
В статье Настройка предварительно настроенного решения приведен ряд способов расширения этого примера. В их число входит использование реальных датчиков и реализация дополнительных команд.
Дополнительные сведения см. в статье Разрешения на сайте azureiotsuite.com.