Отправка сообщений из облака на устройства с помощью Центра Интернета вещей (Node.js)

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

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

  • Отправка сообщений из облака на устройство (C2D) из серверной части решения на одно устройство через Центр Интернета вещей

  • Получение на устройстве сообщений, передаваемых из облака на устройство

  • Запрос из серверной части решения подтверждения доставки (отзыва) для сообщений, отправленных на устройство из Центра Интернета вещей

Примечание

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

По завершении работы с этой статьей вы запустите два консольных приложения Node.js:

  • simple_sample_device: пример приложения устройства, входящего в состав пакета SDK Для Интернета вещей Microsoft Azure для Node.js, который подключается к Центру Интернета вещей и получает сообщения из облака на устройство.

  • SendCloudToDevice: приложение службы, которое отправляет сообщение из облака на устройство в приложение устройства через Центр Интернета вещей, а затем получает подтверждение о доставке.

Примечание

В Центре Интернета вещей реализована поддержка для пакетов SDK для многих платформ устройств и языков (C, Java, Python и Javascript). Эти пакеты работают на основе пакетов SDK для устройств Azure IoT.

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

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

  • Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

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

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

  • В этой статье используется пример кода из пакета SDK Для Интернета вещей Azure для Node.js.

    • Скачайте или клонируйте репозиторий SDK из GitHub на компьютер разработки.
    • Убедитесь, что на компьютере разработки установлен Node.js версии 10.0.x или более поздней. В разделе Подготовка среды разработки описана установка Node.js для работы с настоящей статьей в ОС Windows или Linux.
  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

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

В этой статье вы запустите пример приложения, имитирующий устройство, которое получает сообщения из облака на устройство, отправляемые через Центр Интернета вещей. Пример приложения simple_sample_device в составе пакета SDK Для Интернета вещей Microsoft Azure для Node.js подключается к Центру Интернета вещей и выступает в качестве имитированного устройства. В примере используется основная строка подключения зарегистрированного устройства в Центре Интернета вещей.

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

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

  2. В левой области Центра Интернета вещей в разделе Управление устройствами выберите Устройства.

  3. В списке устройств выберите соответствующее устройство.

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

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

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

В этом разделе запустите пример приложения simple_sample_device устройства, чтобы получать сообщения C2D, отправленные через Центр Интернета вещей. Откройте новую командную строку и перейдите в папку azure-iot-sdk-node\device\samples\javascript в папке, в которой вы развернете пакет SDK azure IoT Node.js. Выполните следующие команды, заменив {Your device connection string} значение заполнителя строкой подключения устройства, скопированной с зарегистрированного устройства в Центре Интернета вещей.

set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js

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

Client connected
Client connected
Client connected
Sending message: {"deviceId":"myFirstDevice","windSpeed":10.949952400617569,"temperature":26.0096515658525,"humidity":72.59398225838534}
Client connected
Client connected
send status: MessageEnqueued
Sending message: {"deviceId":"myFirstDevice","windSpeed":12.917649160180087,"temperature":27.336831253904613,"humidity":77.37300365434534}

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

Если используется AMQP и HTTPS, но не MQTT, устройство также может:

  • отказаться от сообщения, и тогда Центр Интернета вещей будет хранить сообщение в очереди для последующей обработки.
  • Отклонить сообщение, которое окончательно удаляет его из очереди устройств.

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

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

Примечание

Если в качестве транспорта используется протокол HTTPS вместо MQTT или AMQP, экземпляр клиента проверяет наличие сообщений от Центр Интернета вещей нечасто (как минимум каждые 25 минут). Дополнительные сведения о различиях между MQTT, AMQP и HTTPS см. в статьях Руководство по обмену данными между облаком и устройством и Выбор протокола связи.

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

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

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

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

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

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

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

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

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

Отправка сообщения из облака на устройство

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

  1. Создайте пустую папку sendcloudtodevicemessage. Откройте командную строку, перейдите в папку sendcloudtodevicemessage и выполните следующую команду, чтобы создать package.json файл в этой папке. Нажмите клавишу ВВОД в каждой строке, представленной npm командой , чтобы принять значение по умолчанию для этой строки:

    npm init
    
  2. В командной строке в папке sendcloudtodevicemessage выполните следующую команду, чтобы установить пакет azure-iothub.

    npm install azure-iothub --save
    
  3. В текстовом редакторе создайте файл SendCloudToDeviceMessage.js в папке sendcloudtodevicemessage.

  4. Добавьте следующие операторы require в начало файла SendCloudToDeviceMessage.js .

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Добавьте в файл SendCloudToDeviceMessage.js следующий код. Замените значения заполнителей "{строка подключения к центру Интернета вещей}" и "{идентификатор устройства}" строкой подключения к Центру Интернета вещей и идентификатором устройства, которые вы записали ранее:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Добавьте следующую функцию для вывода результатов операции в консоль.

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. Добавьте следующую функцию для вывода сообщений о доставке в консоль.

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Добавьте приведенный ниже код для отправки сообщения на устройство и обработки сообщения о доставке, получаемого после подтверждения устройством получения сообщения из облака на устройство.

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. Сохраните и закройте файл SendCloudToDeviceMessage.js .

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

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

  1. В командной строке в папке azure-iot-sdk-node\device\samples\javascript выполните следующую команду, чтобы отправить данные телеметрии в Центр Интернета вещей и прослушивать сообщения из облака на устройство:

    node simple_sample_device.js
    

    Запуск приложения виртуального устройства

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

    node SendCloudToDeviceMessage.js
    

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

    Примечание

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

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

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