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

В этой статье демонстрируются следующие возможности.

  • Используйте возможности отправки файлов Центр Интернета вещей для отправки файла в Хранилище BLOB-объектов Azure с помощью пакетов SDK для устройств и служб Azure IoT.
  • Уведомите Центр Интернета вещей, что файл был успешно отправлен и создайте серверную службу для получения уведомлений о отправке файлов из Центр Интернета вещей с помощью пакетов SDK службы Интернета вещей Azure.

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

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

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

Эта статья предназначена для дополнения примеров пакета SDK для запуска, на которые ссылается эта статья.

Дополнительные сведения см. в разделе:

Внимание

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

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

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

  • Зарегистрированное устройство. Для некоторых вызовов пакета SDK требуется основной строка подключения устройства, поэтому запишите строка подключения.

  • Центр Интернета вещей разрешение Service Connect. Чтобы получать сообщения уведомления об отправке файлов, серверная служба должна иметь разрешение Service Connect. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение. Дополнительные сведения см. в разделе "Подключение к Центру Интернета вещей".

  • Настройте отправку файлов в Центре Интернета вещей, связав учетную запись служба хранилища Azure и контейнер Хранилище BLOB-объектов Azure. Эти параметры можно настроить с помощью портал Azure, Azure CLI или Azure PowerShell.

Обзор

В этом руководстве содержатся два раздела:

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

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

В этом разделе описывается отправка файла с устройства в Центр Интернета вещей с помощью класса DeviceClient в пакете SDK Для Интернета вещей Azure для .NET.

Выполните следующую процедуру, чтобы отправить файл с устройства в Центр Интернета вещей:

  1. Подключение к Центру Интернета вещей
  2. Получение URI SAS из Центра Интернета вещей
  3. Отправка файла в хранилище Azure
  4. Уведомление Центра Интернета вещей о состоянии отправки файлов

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

Вызовите CreateFromConnectionString для подключения к устройству. Передайте основной строка подключения устройства.

AMQP — это протокол транспорта по умолчанию.

static string connectionString = "{device primary connection string}";
deviceClient = DeviceClient.CreateFromConnectionString(connectionString);

Получение URI SAS из Центра Интернета вещей

Вызовите GetFileUploadSasUriAsync , чтобы получить сведения о отправке файла. URI SAS используется на следующем шаге для отправки файла с устройства в хранилище BLOB-объектов.

const string filePath = "TestPayload.txt";
using var fileStreamSource = new FileStream(filePath, FileMode.Open);
var fileName = Path.GetFileName(fileStreamSource.Name);
var fileUploadSasUriRequest = new FileUploadSasUriRequest
{
    BlobName = fileName
};

FileUploadSasUriResponse sasUri = await _deviceClient.GetFileUploadSasUriAsync(fileUploadSasUriRequest, System.Threading.CancellationToken cancellationToken = default);
Uri uploadUri = sasUri.GetBlobUri();

Отправка файла в хранилище Azure

Чтобы отправить файл в хранилище Azure, выполните приведенные действия.

  1. Создайте объект blockBlobClient, передав URI отправки файла.

  2. Используйте метод UploadAsync для отправки файла в хранилище BLOB-объектов, передав URI SAS. При необходимости можно добавить параметры отправки BLOB-объектов и параметры маркера отмены.

Клиент BLOB-объектов Azure всегда использует HTTPS в качестве протокола для отправки файла в служба хранилища Azure.

В этом примере передается универсальный код ресурса (URI) SAS для BlockBlobClient создания клиента служба хранилища Azure блочного BLOB-объекта и отправки файла:

var blockBlobClient = new BlockBlobClient(uploadUri);
await blockBlobClient.UploadAsync(fileStreamSource, null, null);

Уведомление Центра Интернета вещей о состоянии отправки файлов

Используйте CompleteFileUploadAsync , чтобы уведомить Центр Интернета вещей о том, что клиент устройства завершил отправку, передав объект FileUploadCompletionNotification . Флаг IsSuccess указывает, выполнена ли отправка успешно. После уведомления центр Интернета вещей освобождает ресурсы, связанные с отправкой (URI SAS).

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

var successfulFileUploadCompletionNotification = new FileUploadCompletionNotification
{
    // Mandatory. Must be the same value as the correlation id returned in the sas uri response
    CorrelationId = sasUri.CorrelationId,

    // Mandatory. Will be present when service client receives this file upload notification
    IsSuccess = true,

    // Optional, user defined status code. Will be present when service client receives this file upload notification
    StatusCode = 200,

    // Optional, user-defined status description. Will be present when service client receives this file upload notification
    StatusDescription = "Success"
};

await _deviceClient.CompleteFileUploadAsync(successfulFileUploadCompletionNotification);

Пример отправки файла ПАКЕТА SDK

Пакет SDK включает этот пример отправки файлов.

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

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

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

Чтобы получить уведомление о отправке файла:

  1. Вызовите CreateFromConnectionString для подключения к Центру Интернета вещей. Передайте основной строка подключения центра Интернета вещей.
  2. Создайте отменуToken.
  3. Вызовите GetFileNotificationReceiver , чтобы создать приемник уведомлений.
  4. Используйте цикл с ReceiveAsync , чтобы ждать уведомления о отправке файла.

Например:

using Microsoft.Azure.Devices;
static ServiceClient serviceClient;
static string connectionString = "{IoT hub connection string}";
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

// Define the cancellation token
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;

// Create a notification receiver
var notificationReceiver = serviceClient.GetFileNotificationReceiver();
Console.WriteLine("\nReceiving file upload notification from service");

// Check for file upload notifications
while (true)
{
    var fileUploadNotification = await notificationReceiver.ReceiveAsync(token);
    if (fileUploadNotification == null) continue;
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("Received file upload notification: {0}", 
        string.Join(", ", fileUploadNotification.BlobName));
    Console.ResetColor();
    await notificationReceiver.CompleteAsync(fileUploadNotification);
}

Обзор

В этом руководстве содержатся два раздела:

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

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

В этом разделе описывается отправка файла с устройства в Центр Интернета вещей с помощью класса DeviceClient из пакета SDK Интернета вещей Azure для Java.

Выполните следующую процедуру, чтобы отправить файл с устройства в Центр Интернета вещей:

  1. Подключение к устройству
  2. Получение URI SAS из Центра Интернета вещей
  3. Отправка файла в служба хранилища Azure
  4. Отправка уведомления о состоянии отправки файлов в Центр Интернета вещей

Протокол подключения

Операции отправки файлов всегда используют ПРОТОКОЛ HTTPS, но DeviceClient может определить IotHubClientProtocol для других служб, таких как телеметрия, метод устройства и двойник устройства.

IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;

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

Создайте DeviceClient экземпляр устройства для подключения к устройству с помощью основного строка подключения устройства.

String connString = "{IoT hub connection string}";
DeviceClient client = new DeviceClient(connString, protocol);

Получение URI SAS из Центра Интернета вещей

Вызовите getFileUploadSasUri , чтобы получить объект FileUploadSasUriResponse .

FileUploadSasUriResponse включает эти методы и возвращаемые значения. Возвращаемые значения можно передать в методы отправки файлов.

Способ Возвращаемое значение
getCorrelationId() Идентификатор корреляции
getContainerName() Имя контейнера
getBlobName() Имя BLOB-объекта
getBlobUri() URI BLOB-объекта

Например:

FileUploadSasUriResponse sasUriResponse = client.getFileUploadSasUri(new FileUploadSasUriRequest(file.getName()));

System.out.println("Successfully got SAS URI from IoT hub");
System.out.println("Correlation Id: " + sasUriResponse.getCorrelationId());
System.out.println("Container name: " + sasUriResponse.getContainerName());
System.out.println("Blob name: " + sasUriResponse.getBlobName());
System.out.println("Blob Uri: " + sasUriResponse.getBlobUri());

Отправка файла в служба хранилища Azure

Передайте конечную точку URI большого двоичного объекта в BLOBClientBuilder.buildclient, чтобы создать объект BlobClient.

BlobClient blobClient =
    new BlobClientBuilder()
        .endpoint(sasUriResponse.getBlobUri().toString())
        .buildClient();

Вызовите uploadFromFile , чтобы отправить файл в хранилище BLOB-объектов.

String fullFileName = "Path of the file to upload";
blobClient.uploadFromFile(fullFileName);

Отправка уведомления о состоянии отправки файлов в Центр Интернета вещей

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

Создайте объект FileUploadCompletionNotification. Передайте состояние успешной отправки и isSuccess отправки correlationId файла. isSuccess true Передайте значение, когда отправка файла прошла успешно, false когда нет.

FileUploadCompletionNotification должен вызываться даже при сбое отправки файла. Центр Интернета вещей имеет фиксированное число URI SAS, которое разрешено использовать в любое время. После отправки файла необходимо освободить универсальный код ресурса (URI) SAS, чтобы создать другой URI SAS. Если URI SAS не освобождается через этот API, он освобождает себя в конечном итоге на основе того, сколько URI SAS настроены для жизни в центре Интернета вещей.

В этом примере передается успешное состояние.

FileUploadCompletionNotification completionNotification = new FileUploadCompletionNotification(sasUriResponse.getCorrelationId(), true);
client.completeFileUpload(completionNotification);

Закройте клиент

client Освободить ресурсы.

client.closeNow();

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

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

Чтобы создать приложение уведомления о отправке файла, выполните приведенные действия.

  1. Подключение к клиенту службы Центра Интернета вещей
  2. Проверка уведомления о отправке файла

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

Подключение к клиенту службы Центра Интернета вещей

Создание объекта IotHubServiceClientProtocol. Подключение использует AMQPS протокол.

Вызов createFromConnectionString для подключения к Центру Интернета вещей. Передайте основной строка подключения центра Интернета вещей.

private static final String connectionString = "{IoT hub primary connection string}";
private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
ServiceClient sc = ServiceClient.createFromConnectionString(connectionString, protocol);

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

Чтобы проверить состояние отправки файла, выполните следующие действия.

  1. Создайте объект getFileUploadNotificationReceiver.
  2. Используйте открытую для подключения к Центру Интернета вещей.
  3. Вызов, чтобы проверить состояние отправки файла. Этот метод возвращает объект fileUploadNotification . Если уведомление о отправке получено, можно просмотреть поля состояния отправки с помощью методов fileUploadNotification .

Например:

FileUploadNotificationReceiver receiver = sc.getFileUploadNotificationReceiver();
receiver.open();
FileUploadNotification fileUploadNotification = receiver.receive(2000);

if (fileUploadNotification != null)
{
    System.out.println("File Upload notification received");
    System.out.println("Device Id : " + fileUploadNotification.getDeviceId());
    System.out.println("Blob Uri: " + fileUploadNotification.getBlobUri());
    System.out.println("Blob Name: " + fileUploadNotification.getBlobName());
    System.out.println("Last Updated : " + fileUploadNotification.getLastUpdatedTimeDate());
    System.out.println("Blob Size (Bytes): " + fileUploadNotification.getBlobSizeInBytes());
    System.out.println("Enqueued Time: " + fileUploadNotification.getEnqueuedTimeUtcDate());
}
else
{
    System.out.println("No file upload notification");
}

// Close the receiver object
receiver.close();

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

Существует два примера отправки файлов Java.

Установка пакетов

Перед вызовом любого связанного кода необходимо установить библиотеку azure-iot-device.

pip install azure-iot-device

Пакет azure.storage.blob используется для отправки файла.

pip install azure.storage.blob

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

В этом разделе описывается отправка файла с устройства в Центр Интернета вещей с помощью класса IoTHubDeviceClient из пакета SDK Интернета вещей Azure для Python.

Выполните следующую процедуру, чтобы отправить файл с устройства в Центр Интернета вещей:

  1. Подключение к устройству
  2. Получение сведений о хранилище BLOB-объектов
  3. Отправка файла в хранилище BLOB-объектов
  4. Уведомление Центра Интернета вещей о состоянии отправки

Импорт библиотек

import os
from azure.iot.device import IoTHubDeviceClient
from azure.core.exceptions import AzureError
from azure.storage.blob import BlobClient

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

Чтобы подключиться к устройству, выполните следующие действия.

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

  2. Вызовите подключение для подключения клиента устройства.

Например:

# Add your IoT hub primary connection string
CONNECTION_STRING = "{Device primary connection string}"
device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)

# Connect the client
device_client.connect()

Получение сведений о хранилище BLOB-объектов

Вызовите get_storage_info_for_blob, чтобы получить сведения из Центра Интернета вещей о связанной учетной записи служба хранилища Azure. Эти сведения включают имена узла, контейнера и BLOB-объекта, а также маркер SAS. Метод get_storage_info_for_blob также возвращает correlation_idзначение, которое используется в методе notify_blob_upload_status . Это correlation_id Центр Интернета вещей способ пометить, над каким BLOB-объектом вы работаете.

# Get the storage info for the blob
PATH_TO_FILE = "{Full path to local file}"
blob_name = os.path.basename(PATH_TO_FILE)
blob_info = device_client.get_storage_info_for_blob(blob_name)

Отправка файла в хранилище BLOB-объектов

Чтобы отправить файл в хранилище BLOB-объектов, выполните приведенные действия.

  1. Используйте from_blob_url для создания объекта BlobClient из URL-адреса БОЛЬШОго двоичного объекта.
  2. Вызовите upload_blob для отправки файла в хранилище BLOB-объектов.

В этом примере анализируется blob_info структура для создания URL-адреса, который он использует для инициализации BLOBClient. Затем он вызывает upload_blob отправку файла в хранилище BLOB-объектов.

try:
    sas_url = "https://{}/{}/{}{}".format(
        blob_info["hostName"],
        blob_info["containerName"],
        blob_info["blobName"],
        blob_info["sasToken"]
    )

    print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))

    # Upload the specified file
    with BlobClient.from_blob_url(sas_url) as blob_client:
        with open(file_name, "rb") as f:
            result = blob_client.upload_blob(f, overwrite=True)
            return (True, result)

except FileNotFoundError as ex:
    # catch file not found and add an HTTP status code to return in notification to IoT hub
    ex.status_code = 404
    return (False, ex)

except AzureError as ex:
    # catch Azure errors that might result from the upload operation
    return (False, ex)

Уведомление Центра Интернета вещей о состоянии отправки

Используйте notify_blob_upload_status для уведомления Центра Интернета вещей о состоянии операции хранилища BLOB-объектов. correlation_id Передайте полученный методомget_storage_info_for_blob. Центр correlation_id Интернета вещей используется для уведомления любой службы, которая может прослушивать уведомление о состоянии задачи отправки файла.

В этом примере центр Интернета вещей уведомляет об успешной отправке файлов:

device_client.notify_blob_upload_status(storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)

Завершение работы клиента устройства

Завершите работу клиента. После вызова этого метода любая попытка дальнейших вызовов клиентов приводит к возникновению клиентаError .

device_client.shutdown()

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

Пакет SDK включает два примера отправки файлов:

Обзор

В этом руководстве содержатся два раздела:

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

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

В этом разделе описывается, как отправить файл с устройства в Центр Интернета вещей с помощью пакета azure-iot-device в пакете SDK Для Интернета вещей Azure для Node.js.

Установка пакетов SDK

Выполните следующую команду, чтобы установить пакет SDK для устройств Azure-iot-device , azure-iot-device-mqtt и пакеты @azure/storage-blob на компьютере разработки:

npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save

Пакет azure-iot-device содержит объекты, которые интерфейсирует с устройствами Интернета вещей.

Выполните следующую процедуру для отправки файла с устройства в Центр Интернета вещей:

  1. Получение подписанных URL-адресов BLOB-объектов
  2. Отправка файла в служба хранилища Azure
  3. Отправка уведомления о состоянии отправки файлов в Центр Интернета вещей

Создание модулей

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

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');

Получение URI SAS из Центра Интернета вещей

Используйте getBlobSharedAccessSignature , чтобы получить маркер SAS связанной учетной записи хранения из Центра Интернета вещей. Как описано в предварительных требованиях, центр Интернета вещей связан с хранилищем BLOB-объектов.

Например:

// make sure you set these environment variables prior to running the sample.
const localFilePath = process.env.PATH_TO_FILE;
const storageBlobName = path.basename(localFilePath);
const blobInfo = await client.getBlobSharedAccessSignature(storageBlobName);
if (!blobInfo) {
throw new errors.ArgumentError('Invalid upload parameters');
}

Отправка файла в Центр Интернета вещей

Чтобы отправить файл с устройства в Центр Интернета вещей, выполните приведенные действия.

  1. Создание конвейера потоков
  2. Создание URL-адреса БОЛЬШОго двоичного объекта
  3. Создание BlockBlobClient для отправки файлов в хранилище BLOB-объектов
  4. Вызов uploadFile для отправки файла в хранилище BLOB-объектов
  5. Вызов notifyBlobUploadStatus , чтобы уведомить Центр Интернета вещей об успешной отправке или сбое

Например:

// Open the pipeline
const pipeline = newPipeline(new AnonymousCredential(), {
retryOptions: { maxTries: 4 },
telemetry: { value: 'HighLevelSample V1.0.0' }, // Customized telemetry string
keepAliveOptions: { enable: false }
});

// Construct the blob URL
const { hostName, containerName, blobName, sasToken } = blobInfo;
const blobUrl = `https://${hostName}/${containerName}/${blobName}${sasToken}`;

// Create the BlockBlobClient for file upload to Blob Storage
const blobClient = new BlockBlobClient(blobUrl, pipeline);

// Setup blank status notification arguments to be filled in on success/failure
let isSuccess;
let statusCode;
let statusDescription;

const uploadStatus = await blobClient.uploadFile(localFilePath);
console.log('uploadStreamToBlockBlob success');

  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);
  }

// Send file upload status notification to IoT hub
await client.notifyBlobUploadStatus(blobInfo.correlationId, isSuccess, statusCode, statusDescription);

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

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

Чтобы создать приложение уведомления о отправке файла, выполните приведенные действия.

  1. Подключение к клиенту службы Центра Интернета вещей
  2. Проверка уведомления о отправке файла

Подключение к клиенту службы Центра Интернета вещей

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

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

const Client = require('azure-iothub').Client;
const connectionString = "{IoT hub primary connection string}";
const serviceClient = Client.fromConnectionString(connectionString);

Откройте подключение к Центру Интернета вещей.

//Open the connection to IoT hub
serviceClient.open(function (err) {
  if (err) {
    console.error('Could not connect: ' + err.message);
  } else {
    console.log('Service client connected');

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

Чтобы проверить отправку файлов, выполните приведенные действия.

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

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

//Set up the receiveFileUploadNotification notification message callback receiver
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');
      }
    });
  });
}

Пример отправки файла ПАКЕТА SDK

Пакет SDK включает отправку в расширенный пример BLOB-объектов.