Поделиться через


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

В этой статье показано, как использовать возможности передачи файлов Центра Интернета вещей для передачи файла в хранилище BLOB-объектов Azure с помощью Node.js.

В кратком руководстве Отправка данных телеметрии с устройства в Центр Интернета вещей и статьях Отправка сообщений из облака на устройство с помощью Центра Интернета вещей описаны базовые функции Центра Интернета вещей для обмена сообщениями между устройством и облаком. В учебнике Настройка маршрутизации сообщений с Центром Интернета вещей описан способ надежного хранения сообщений, отправляемых с устройства в облако, в хранилище BLOB-объектов Microsoft Azure. Но в некоторых случаях непросто сопоставить данные, отправляемые устройством, с относительно небольшими сообщениями, отправляемыми из устройства в облако, которые принимает Центр Интернета вещей. Например:

  • Видео
  • Большие файлы, содержащие изображения.
  • Данные вибрации с высокой частотой выборки.
  • Некоторые виды предварительно обработанных данных.

Эти файлы обычно обрабатываются в виде пакета в облаке с помощью таких инструментов, как Фабрика данных Azure или стек Hadoop. При передаче файлов с устройства вы можете рассчитывать на безопасность и надежность Центра Интернета вещей. В этой статье показано, как это сделать.

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

  • FileUpload.js — передает файл в хранилище с помощью универсального кода ресурса (URI) SAS, предоставленного вашим Центром Интернета вещей.

  • FileUploadNotification.js — получает уведомления о передаче файлов от Центра Интернета вещей.

Примечание.

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

Внимание

Функция отправки файлов на устройствах, использующих проверку подлинности на основе сертификата X.509, доступна в общедоступной предварительной версии, при этом должен быть включен режим предварительного просмотра. Общедоступная версия доступна на устройствах, использующих проверку подлинности X.509 или аттестацию сертификатов X.509 с помощью Службы подготовки устройств Azure. Дополнительные сведения о проверке подлинности на основе сертификата X.509 с помощью Центра Интернета вещей см. в разделе Поддерживаемые сертификаты X.509.

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

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

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

  • Node.js 10.0.x или более поздней версии. Рекомендуется использовать версию LTS. Вы можете скачать Node.js с сайта nodejs.org.

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

Связывание учетной записи хранения Azure с Центром Интернета вещей

Для загрузки файлов с устройства у вас должна быть учетная запись хранилища Azure и контейнер хранилища BLOB-объектов Azure, связанный с вашим центром Интернета вещей. После связывания учетной записи хранения и контейнера с центром Интернета вещей, центр Интернета вещей сможет предоставлять элементы универсального кода ресурса подписанного URL-адреса по запросу устройства. Затем устройство может использовать эти элементы для создания универсального кода ресурса подписанного URL-адреса, применяемого для проверки подлинности в службе хранилища Azure и отправки файлов в контейнер больших двоичных объектов.

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

  1. В разделе Параметры центра выберите Отправка файлов на левой панели Центра Интернета вещей.

    Снимок экрана: выбор параметров отправки файла на портале.

  2. На панели Загрузка файла выберите Контейнер хранилища Azure. В этой статье рекомендуется размещать учетную запись хранения и центр Интернета вещей в одном регионе.

    • Если у вас уже есть учетная запись хранения, которую вы хотите использовать, выберите ее в списке.

    • Чтобы создать новую учетную запись хранения, выберите +Учетная запись хранения. Укажите имя для учетной записи хранения и убедитесь, что для параметра Расположение задан тот же регион, что и для вашего центра Интернета вещей, затем нажмите OK. Новая учетная запись создается в той же группе ресурсов, что и центр Интернета вещей. По завершении развертывания выберите учетную запись хранения в списке.

    После выбора учетной записи хранения откроется панель Контейнеры.

  3. На странице Контейнеры выберите созданный контейнер больших двоичных объектов.

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

    • Выберите +Контейнер для создания контейнера больших двоичных объектов. Укажите имя для нового контейнера. Для этой статьи можно оставить для всех остальных полей значения по умолчанию. Нажмите кнопку создания. После завершения развертывания выберите контейнер в списке и нажмите Выбрать.

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

    Снимок экрана: подтверждение параметров отправки файла на портале.

Более подробные инструкции по созданию учетной записи хранения Azure см. в статье Создание учетной записи хранения. Более подробные инструкции по связыванию учетной записи хранения и контейнера больших двоичных объектов с центром Интернета вещей см. в статье Настройка отправки файлов с помощью портал Azure.

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

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

  1. Создайте пустую папку с именем fileupload. В папке fileupload создайте файл package.json, указав приведенную ниже команду в командной строке. Примите значения по умолчанию:

    npm init
    
  2. В командной строке перейдите в папку fileupload и выполните следующую команду для установки пакета SDK для устройства azure-iot-device, а также пакетов azure-iot-device-mqtt и @azure/storage-blob:

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. С помощью текстового редактора создайте файл FileUpload.js в папке fileupload и скопируйте в него следующий код.

    'use strict';
    
    const Client = require('azure-iot-device').Client;
    const Protocol = require('azure-iot-device-mqtt').Mqtt;
    const errors = require('azure-iot-common').errors;
    const path = require('path');
    
    const {
      AnonymousCredential,
      BlockBlobClient,
      newPipeline
    } = require('@azure/storage-blob');
    
    // make sure you set these environment variables prior to running the sample.
    const deviceConnectionString = process.env.DEVICE_CONNECTION_STRING;
    const localFilePath = process.env.PATH_TO_FILE;
    const storageBlobName = path.basename(localFilePath);
    
    async function uploadToBlob(localFilePath, client) {
      const blobInfo = await client.getBlobSharedAccessSignature(storageBlobName);
      if (!blobInfo) {
        throw new errors.ArgumentError('Invalid upload parameters');
      }
    
      const pipeline = newPipeline(new AnonymousCredential(), {
        retryOptions: { maxTries: 4 },
        telemetry: { value: 'HighLevelSample V1.0.0' }, // Customized telemetry string
        keepAliveOptions: { enable: false }
      });
    
      // Construct the blob URL to construct the blob client for file uploads
      const { hostName, containerName, blobName, sasToken } = blobInfo;
      const blobUrl = `https://${hostName}/${containerName}/${blobName}${sasToken}`;
    
      // Create the BlockBlobClient for file upload to the Blob Storage Blob
      const blobClient = new BlockBlobClient(blobUrl, pipeline);
    
      // Setup blank status notification arguments to be filled in on success/failure
      let isSuccess;
      let statusCode;
      let statusDescription;
    
      try {
        const uploadStatus = await blobClient.uploadFile(localFilePath);
        console.log('uploadStreamToBlockBlob success');
    
        // Save successful status notification arguments
        isSuccess = true;
        statusCode = uploadStatus._response.status;
        statusDescription = uploadStatus._response.bodyAsText;
    
        // Notify IoT Hub of upload to blob status (success)
        console.log('notifyBlobUploadStatus success');
      }
      catch (err) {
        isSuccess = false;
        statusCode = err.code;
        statusDescription = err.message;
    
        console.log('notifyBlobUploadStatus failed');
        console.log(err);
      }
    
      await client.notifyBlobUploadStatus(blobInfo.correlationId, isSuccess, statusCode, statusDescription);
    }
    
    // Create a client device from the connection string and upload the local file to blob storage.
    const deviceClient = Client.fromConnectionString(deviceConnectionString, Protocol);
    uploadToBlob(localFilePath, deviceClient)
      .catch((err) => {
        console.log(err);
      })
      .finally(() => {
        process.exit();
      });
    
  4. Сохраните и закройте файл FileUpload.js.

  5. Скопируйте файл изображения в папку fileupload и присвойте ему имя, например myimage.png.

  6. Добавьте переменные среды для строки подключения устройства и путь к файлу, который требуется передать. Устройство строка подключения при регистрации устройства в Центре Интернета вещей.

    • Для Windows:

      set DEVICE_CONNECTION_STRING={your device connection string}
      set PATH_TO_FILE={your image filepath}
      
    • Для Linux/Bash:

      export DEVICE_CONNECTION_STRING="{your device connection string}"
      export PATH_TO_FILE="{your image filepath}"
      

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

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

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

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

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

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

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

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

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

Получение уведомления о передачи файла

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

  1. Создайте пустую папку с именем fileuploadnotification. В папке fileuploadnotification создайте файл package.json, указав приведенную ниже команду в командной строке. Примите значения по умолчанию:

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

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

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

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Считывание строки подключения для Центра Интернета вещей из среды:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. Добавьте следующий код, чтобы создать клиент службы из строки подключения:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. Откройте клиент и воспользуйтесь функцией getFileNotificationReceiver, чтобы получить обновления состояния.

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFileNotificationReceiver(function receiveFileUploadNotification(err, receiver){
          if (err) {
            console.error('error getting the file notification receiver: ' + err.toString());
          } else {
            receiver.on('message', function (msg) {
              console.log('File upload from device:')
              console.log(msg.getData().toString('utf-8'));
              receiver.complete(msg, function (err) {
                if (err) {
                  console.error('Could not finish the upload: ' + err.message);
                } else {
                  console.log('Upload complete');
                }
              });
            });
          }
        });
      }
    });
    

    Примечание.

    Если вы хотите получать уведомления об отключении в процессе ожидания сведений об отправке файлов, необходимо зарегистрировать 'error' с помощью receiver.on. Чтобы продолжить получать уведомления об отправке файлов, необходимо повторно подключиться к Центру Интернета вещей с помощью метода serviceClient.open.

  8. Сохраните и закройте файл FileUploadNotification.js.

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

    • Для Windows:

      set IOT_HUB_CONNECTION_STRING={your iot hub connection string}
      
    • Для Linux/Bash:

      export IOT_HUB_CONNECTION_STRING="{your iot hub connection string}"
      

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

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

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

node FileUploadNotification.js

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

node FileUpload.js

После завершения передачи приложение FileUpload выдает следующие выходные данные:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

Вот пример выходных данных из приложения FileUploadNotification после завершения передачи:

Service client connected
File upload from device:
{"deviceId":"myDeviceId","blobUri":"https://{your storage account name}.blob.core.windows.net/device-upload-container/myDeviceId/image.png","blobName":"myDeviceId/image.png","lastUpdatedTime":"2021-07-23T23:27:06+00:00","blobSizeInBytes":26214,"enqueuedTimeUtc":"2021-07-23T23:27:07.2580791Z"}

Проверка отправки файла

На портале можно просмотреть отправленный файл в контейнере хранилища, который вы настроили.

  1. Войдите в учетную запись хранения на портале Azure.

  2. В левой области учетной записи хранения выберите Контейнеры.

  3. Выберите контейнер, в который вы отправили файл.

  4. Выберите папку по названию своего устройства.

  5. Выберите большой двоичный объект, в который вы отправили файл. В этой статье это большой двоичный объект с тем же именем, что и у файла.

    Снимок экрана: просмотр отправленного файла на портале Azure.

  6. Просмотрите свойства BLOB-объекта на открывшейся странице. Можно нажать кнопку Скачать, чтобы скачать файл и просмотреть его содержимое локально.

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

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