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


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

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

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

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

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

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

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

Дополнительные сведения можно найти здесь

Prerequisites

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

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

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

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

Overview

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

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

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

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

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

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

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

Приложение устройства может пройти проверку подлинности в Центре Интернета вещей с помощью следующих методов:

  • X.509 certificate
  • Общий ключ доступа

Проверка подлинности с помощью сертификата X.509

Чтобы подключить устройство к Центру Интернета вещей с помощью сертификата X.509:

  1. Используйте DeviceAuthenticationWithX509Certificate для создания объекта, содержащего сведения об устройстве и сертификате. DeviceAuthenticationWithX509Certificate передается в качестве второго параметра DeviceClient.Create (шаг 2).

  2. Используйте DeviceClient.Create для подключения устройства к Центру Интернета вещей с помощью сертификата X.509.

В этом примере сведения об устройстве и сертификате заполняются в объекте authDeviceAuthenticationWithX509Certificate , передаваемом в DeviceClient.Create.

В этом примере показаны значения входных параметров сертификата в качестве локальных переменных для ясности. В рабочей системе храните конфиденциальные входные параметры в переменных среды или другом безопасном расположении хранилища. Например, используйте Environment.GetEnvironmentVariable("HOSTNAME") для чтения переменной среды имени узла.

RootCertPath = "~/certificates/certs/sensor-thl-001-device.cert.pem";
Intermediate1CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate1.cert.pem";
Intermediate2CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate2.cert.pem";
DevicePfxPath = "~/certificates/certs/sensor-thl-001-device.cert.pfx";
DevicePfxPassword = "1234";
DeviceName = "MyDevice";
HostName = "xxxxx.azure-devices.net";

var chainCerts = new X509Certificate2Collection();
chainCerts.Add(new X509Certificate2(RootCertPath));
chainCerts.Add(new X509Certificate2(Intermediate1CertPath));
chainCerts.Add(new X509Certificate2(Intermediate2CertPath));
using var deviceCert = new X509Certificate2(DevicePfxPath, DevicePfxPassword);
using var auth = new DeviceAuthenticationWithX509Certificate(DeviceName, deviceCert, chainCerts);

using var deviceClient = DeviceClient.Create(
    HostName,
    auth,
    TransportType.Amqp);

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

Примеры кода

Примеры аутентификации устройства с помощью сертификата X.509 можно найти в статье:

Проверка подлинности с помощью общего ключа доступа

Вызовите 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.

В этом примере BlockBlobClient передаётся SAS URI для создания клиента блока Blob в хранилище Azure и загрузки файла.

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 содержит методы, которые службы могут использовать для получения уведомлений о отправке файлов.

Пакет службы NuGet добавить

Для приложений серверной службы требуется пакет NuGet Microsoft.Azure.Devices .

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

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

  • Политика общего доступа
  • Microsoft Entra

Important

В этой статье содержатся шаги по подключению к службе с помощью подписанного URL-адреса. Этот метод проверки подлинности удобнее для тестирования и оценки, но проверка подлинности в службе с помощью идентификатора Microsoft Entra или управляемых удостоверений является более безопасным подходом. Дополнительные сведения см. в рекомендациях по безопасности решений > Интернета вещей Cloud Security.

Подключение с помощью политики общего доступа

Подключите серверное приложение к устройству с помощью CreateFromConnectionString. Приложению требуется разрешение на подключение службы . Укажите эту строку подключения политики совместного доступа в качестве параметра fromConnectionString. Дополнительные сведения о политиках общего доступа см. в разделе "Управление доступом к Центру Интернета вещей" с помощью подписанных URL-адресов.

Рассмотрим пример.

using Microsoft.Azure.Devices;
static ServiceClient serviceClient;
static string connectionString = "{Shared access policy connection string}";
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

Подключение с помощью Microsoft Entra

Бэкенд-приложение, использующее Microsoft Entra, должно успешно аутентифицироваться и получить метку безопасности перед подключением к Центру Интернета вещей. Этот токен передается методу подключения IoT Hub. Общие сведения о настройке и использовании Microsoft Entra для Центра Интернета вещей см. в разделе "Управление доступом к Центру Интернета вещей" с помощью идентификатора Microsoft Entra.

Настройка приложения Microsoft Entra

Необходимо настроить приложение Microsoft Entra, настроенное для предпочитаемых учетных данных проверки подлинности. Приложение содержит такие параметры, как секрет клиента, используемый серверным приложением для проверки подлинности. Доступные конфигурации проверки подлинности приложений:

  • Секрет клиента
  • Certificate
  • Учетные данные федеративного удостоверения

Приложения Microsoft Entra могут требовать определенные разрешения ролей в зависимости от выполняемых операций. Например, роль Участника работы с двойниками IoT Hub необходима для предоставления прав чтения и записи к двойникам устройств и модулей IoT Hub. Дополнительные сведения см. в статье "Управление доступом к Центру Интернета вещей" с помощью назначения ролей Azure RBAC.

Дополнительные сведения о настройке приложения Microsoft Entra см. в кратком руководстве: Регистрация приложения на платформе удостоверений Майкрософт.

Проверка подлинности с помощью DefaultAzureCredential

Самый простой способ использовать Microsoft Entra для проверки подлинности серверного приложения — это использовать DefaultAzureCredential, но в рабочей среде рекомендуется использовать другой метод, включая определенный TokenCredential или оптимизированный ChainedTokenCredential. Для простоты, в этом разделе описывается аутентификация с использованием DefaultAzureCredential и секрета клиента. Дополнительные сведения об преимуществах и недостатках использования DefaultAzureCredentialсм. в руководстве по использованию DefaultAzureCredential.

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

Для Microsoft Entra требуются следующие пакеты NuGet и соответствующие using инструкции:

  • Azure.Core
  • Azure.Identity
using Azure.Core;
using Azure.Identity;

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

string clientSecretValue = "xxxxxxxxxxxxxxx";
string clientID = "xxxxxxxxxxxxxx";
string tenantID = "xxxxxxxxxxxxx";

Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", clientSecretValue);
Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", clientID);
Environment.SetEnvironmentVariable("AZURE_TENANT_ID", tenantID);

TokenCredential tokenCredential = new DefaultAzureCredential();

Затем результирующий TokenCredential можно передать в метод подключения к Центру Интернета вещей для любого клиента пакета SDK, который поддерживает учетные данные Microsoft Entra.

В этом примере TokenCredential передается в ServiceClient.Create для создания объекта подключения ServiceClient.

string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);

В этом примере TokenCredential передается RegistryManager.Create чтобы создать объект RegistryManager.

string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
Пример кода

Рабочий пример проверки подлинности службы Microsoft Entra см. в примере проверки подлинности на основе ролей.

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

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

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

Рассмотрим пример.

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

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

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

Overview

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

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

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

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

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

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

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

Приложение устройства может пройти проверку подлинности в Центре Интернета вещей с помощью следующих методов:

  • X.509 certificate
  • Общий ключ доступа

Проверка подлинности с помощью сертификата X.509

Чтобы подключить устройство к Центру Интернета вещей с помощью сертификата X.509:

  1. Создайте объект SSLContext с помощью buildSSLContext.
  2. SSLContext Добавьте сведения в объект ClientOptions.
  3. Вызов DeviceClient с помощью ClientOptions сведений для создания подключения к Центру Интернета вещей.

В этом примере показаны значения входных параметров сертификата в качестве локальных переменных для ясности. В рабочей системе храните конфиденциальные входные параметры в переменных среды или другом безопасном расположении хранилища. Например, используйте Environment.GetEnvironmentVariable("PUBLICKEY"), чтобы прочитать строку переменной окружения сертификата открытого ключа.

private static final String publicKeyCertificateString =
        "-----BEGIN CERTIFICATE-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END CERTIFICATE-----\n";

//PEM encoded representation of the private key
private static final String privateKeyString =
        "-----BEGIN EC PRIVATE KEY-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END EC PRIVATE KEY-----\n";

SSLContext sslContext = SSLContextBuilder.buildSSLContext(publicKeyCertificateString, privateKeyString);
ClientOptions clientOptions = ClientOptions.builder().sslContext(sslContext).build();
DeviceClient client = new DeviceClient(connString, protocol, clientOptions);

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

Примеры кода

Примеры аутентификации устройства с помощью сертификата X.509 можно найти в статье:

Проверка подлинности с помощью общего ключа доступа

Операции отправки файлов всегда используют ПРОТОКОЛ 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 включает эти методы и возвращаемые значения. Возвращаемые значения можно передать в методы отправки файлов.

Method Возвращаемое значение
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 blob в 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 . Передайте состояние успешной загрузки файла correlationId и isSuccess после загрузки. isSuccess true Передайте значение, когда отправка файла прошла успешно, false когда нет.

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

Этот пример соответствует успешному состоянию.

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

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

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

client.closeNow();

Создание серверного приложения

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

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

Добавьте инструкции импорта

Добавьте следующие инструкции импорта, чтобы использовать Azure IoT Java SDK и обработчик исключений.

import com.microsoft.azure.sdk.iot.service.*;
import java.io.IOException;
import java.net.URISyntaxException;

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

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

  • Политика общего доступа
  • Microsoft Entra

Important

В этой статье содержатся шаги по подключению к службе с помощью подписанного URL-адреса. Этот метод проверки подлинности удобнее для тестирования и оценки, но проверка подлинности в службе с помощью идентификатора Microsoft Entra или управляемых удостоверений является более безопасным подходом. Дополнительные сведения см. в рекомендациях по безопасности решений > Интернета вещей Cloud Security.

Подключение с помощью политики общего доступа

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

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

IotHubServiceClientProtocol принимает только перечислимые типы AMQPS или AMQPS_WS.

private static final IotHubServiceClientProtocol protocol =    
    IotHubServiceClientProtocol.AMQPS;
Создание объекта ServiceClient

Создайте объект ServiceClient , предоставляя строку подключения и протокол Центра Интернета вещей.

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

В качестве параметра конструктору ServiceClient предоставьте политику общего доступа службы . Дополнительные сведения о политиках общего доступа см. в разделе "Управление доступом к Центру Интернета вещей" с помощью подписанных URL-адресов.

String iotHubConnectionString = "HostName=xxxxx.azure-devices.net;SharedAccessKeyName=service;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxx";
private static final ServiceClient serviceClient (iotHubConnectionString, protocol);
Открытие подключения между приложением и Центром Интернета вещей

Откройте подключение отправителя AMQP. Этот метод создает соединение между приложением и Центром Интернета вещей.

serviceClient.open();

Подключение с помощью Microsoft Entra

Бэкенд-приложение, использующее Microsoft Entra, должно успешно аутентифицироваться и получить метку безопасности перед подключением к Центру Интернета вещей. Этот токен передается методу подключения IoT Hub. Общие сведения о настройке и использовании Microsoft Entra для Центра Интернета вещей см. в разделе "Управление доступом к Центру Интернета вещей" с помощью идентификатора Microsoft Entra.

Общие сведения о проверке подлинности пакета SDK для Java см. в статье "Проверка подлинности Azure с помощью Java и удостоверений Azure".

Для простоты в этом разделе рассматривается описание проверки подлинности с помощью секрета клиента.

Настройка приложения Microsoft Entra

Необходимо настроить приложение Microsoft Entra, настроенное для предпочитаемых учетных данных проверки подлинности. Приложение содержит такие параметры, как секрет клиента, используемый серверным приложением для проверки подлинности. Доступные конфигурации проверки подлинности приложений:

  • Секрет клиента
  • Certificate
  • Учетные данные федеративного удостоверения

Приложения Microsoft Entra могут требовать определенные разрешения ролей в зависимости от выполняемых операций. Например, роль Участника работы с двойниками IoT Hub необходима для предоставления прав чтения и записи к двойникам устройств и модулей IoT Hub. Дополнительные сведения см. в статье "Управление доступом к Центру Интернета вещей" с помощью назначения ролей Azure RBAC.

Дополнительные сведения о настройке приложения Microsoft Entra см. в кратком руководстве: Регистрация приложения на платформе удостоверений Майкрософт.

Проверка подлинности с помощью DefaultAzureCredential

Самый простой способ использовать Microsoft Entra для проверки подлинности серверного приложения — это использовать DefaultAzureCredential, но в рабочей среде рекомендуется использовать другой метод, включая определенный TokenCredential или оптимизированный ChainedTokenCredential. Дополнительные сведения о преимуществах и недостатках использования DefaultAzureCredential см. в разделе Цепочки учетных данных в клиентской библиотеке удостоверений Azure для Java.

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

Учетные данные приложения Microsoft Entra можно аутентифицировать с помощью DefaultAzureCredentialBuilder. Сохраните параметры подключения, такие как client secret, tenantID, clientID и значения client secret в качестве переменных среды. Создав TokenCredential, передайте его в ServiceClient или другой построитель в качестве параметра "credential".

В этом примере DefaultAzureCredentialBuilder пытается выполнить проверку подлинности подключения из списка, описанного в defaultAzureCredential. Результат успешной аутентификации Microsoft Entra — это учетные данные токена безопасности, передаваемые конструктору, например ServiceClient.

TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
Проверка подлинности с помощью ClientSecretCredentialBuilder

С помощью ClientSecretCredentialBuilder можно создать учетные данные с помощью сведений о секрете клиента. В случае успешного выполнения этот метод возвращает TokenCredential, который можно передать ServiceClient или другому конструктору в качестве параметра 'credential'.

В этом примере в переменные среды добавлены секрет клиента регистрации приложений Microsoft Entra, идентификатор клиента и значения идентификатора клиента. Эти переменные среды используются ClientSecretCredentialBuilder для создания учетных данных.

string clientSecretValue = System.getenv("AZURE_CLIENT_SECRET");
string clientID = System.getenv("AZURE_CLIENT_ID");
string tenantID = System.getenv("AZURE_TENANT_ID");

TokenCredential credential =
     new ClientSecretCredentialBuilder()
          .tenantId(tenantID)
          .clientId(clientID)
          .clientSecret(clientSecretValue)
          .build();
Другие классы проверки подлинности

Пакет SDK для Java также включает следующие классы, которые проходят проверку подлинности серверного приложения с помощью Microsoft Entra:

Примеры кода

Примеры использования службы проверки подлинности Microsoft Entra можно найти в примере проверки подлинности на основе ролей.

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

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

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

Рассмотрим пример.

FileUploadNotificationReceiver receiver = serviceClient.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.

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

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

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

Приложение устройства может пройти проверку подлинности в Центре Интернета вещей с помощью следующих методов:

  • X.509 certificate
  • Общий ключ доступа

Проверка подлинности с помощью сертификата X.509

Чтобы подключить устройство к Центру Интернета вещей с помощью сертификата X.509:

  1. Добавление параметров сертификата X.509 с помощью create_from_x509_certificate
  2. Вызов connect для подключения клиента устройства

В этом примере показаны значения входных параметров сертификата в качестве локальных переменных для ясности. В рабочей системе храните конфиденциальные входные параметры в переменных среды или другом безопасном расположении хранилища. Например, используйте os.getenv("HOSTNAME") для чтения переменной среды имени узла.

# The Azure IoT hub name
hostname = "xxxxx.azure-devices.net"

# The device that has been created on the portal using X509 CA signing or self-signing capabilities
device_id = "MyDevice"

# The X.509 certificate file name
cert_file = "~/certificates/certs/sensor-thl-001-device.cert.pfx"
key_file = "~/certificates/certs/sensor-thl-001-device.cert.key"
# The optional certificate pass phrase
pass_phrase = "1234"

x509 = X509(
    cert_file,
    key_file,
    pass_phrase,
)

# The client object is used to interact with your Azure IoT hub.
device_client = IoTHubDeviceClient.create_from_x509_certificate(
    hostname=hostname, device_id=device_id, x509=x509
)

# Connect to IoT Hub
await device_client.connect()

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

Примеры кода

Рабочие примеры проверки подлинности сертификата X.509 см. в примерах, имена файлов которых заканчиваются в сценариях x509 в концентраторе Async.

Проверка подлинности с помощью общего ключа доступа

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

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

Рассмотрим пример.

# 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 - это способ IoT Hub отметить 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-адреса blob.
  2. Вызовите upload_blob для отправки файла в хранилище BLOB-объектов.

В этом примере анализируется blob_info структура для создания URL-адреса, который используется для инициализации BlobClient. Затем он вызывает upload_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)

Уведомить концентратор IoT о статусе загрузки

Используйте notify_blob_upload_status для уведомления IoT-центра о статусе операции 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)

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

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

device_client.shutdown()

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

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

Overview

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

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

В этом разделе описывается отправка файла с устройства в Центр Интернета вещей с помощью пакета azure-iot-device в пакете Azure IoT SDK для 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. Подключение устройства к Центру Интернета вещей
  2. Получение SAS-токена для Blob из IoT Hub
  3. Отправка файла в службу хранилища Azure
  4. Отправка уведомления о состоянии отправки файлов в Центр Интернета вещей

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

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

const Protocol = require('azure-iot-device-mqtt').Mqtt;
const errors = require('azure-iot-common').errors;
const path = require('path');

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

Приложение устройства может пройти проверку подлинности в Центре Интернета вещей с помощью следующих методов:

  • X.509 certificate
  • Общий ключ доступа

Проверка подлинности с помощью сертификата X.509

Сертификат X.509 прикреплён к транспортному соединению между устройством и узлом Интернета вещей.

Чтобы настроить подключение к Центру Интернета вещей с помощью сертификата X.509, выполните следующее:

  1. Вызовите функцию fromConnectionString, чтобы добавить строку подключения устройства или модуля удостоверения и тип транспорта к объекту Client. Добавьте x509=true в строку подключения, чтобы указать, что сертификат добавляется в DeviceClientOptions. Рассмотрим пример.

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

      HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true

    • Строка подключения идентификационного модуля:

      HostName=xxxxx.azure-devices.net;DeviceId=Device-1;ModuleId=Module-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true

  2. Настройте переменную JSON с сведениями о сертификате и передайте ее в DeviceClientOptions.

  3. Для добавления X.509 сертификата и ключа (и, при необходимости, парольной фразы) в транспорт клиента, вызовите функцию setOptions.

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

В этом примере показаны сведения о конфигурации сертификата в переменной JSON. Конфигурация сертификации clientOptions передается setOptions, и подключение открывается с помощью open.

const Client = require('azure-iot-device').Client;
const Protocol = require('azure-iot-device-mqtt').Mqtt;
// Connection string illustrated for demonstration only. Never hard-code the connection string in production. Instead use an environmental variable or other secure storage.
const connectionString = `HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true`
const client = Client.fromConnectionString(connectionString, Protocol);

var clientOptions = {
   cert: myX509Certificate,
   key: myX509Key,
   passphrase: passphrase,
   http: {
     receivePolicy: {
       interval: 10
     }
   }
 }

 client.setOptions(clientOptions);
 client.open(connectCallback);

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

Пример кода

Рабочий пример проверки подлинности сертификата X.509 см. в разделе "Простой пример устройства X.509".

Проверка подлинности с помощью общего ключа доступа

Выбор транспортного протокола

Объект Client поддерживает следующие протоколы:

  • Amqp
  • Http — При использовании Http, Client экземпляр проверяет наличие сообщений из IoT Hub редко (как минимум каждые 25 минут).
  • Mqtt
  • MqttWs
  • AmqpWs

Установите необходимые транспортные протоколы на компьютере разработки.

Например, эта команда устанавливает Amqp протокол:

npm install azure-iot-device-amqp --save

Дополнительные сведения о различиях между поддержкой MQTT, AMQP и HTTPS см. в руководстве по обмену данными между облаком и устройством и выборе протокола связи.

Создание клиентского объекта

Client Создайте объект с помощью установленного пакета.

Рассмотрим пример.

const Client = require('azure-iot-device').Client;
Создание объекта протокола

Protocol Создайте объект с помощью установленного транспортного пакета.

В этом примере назначается протокол AMQP:

const Protocol = require('azure-iot-device-amqp').Amqp;
Добавление строки подключения устройства и протокола транспорта

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

  • connStr — строка подключения устройства.
  • transportCtor — транспортный протокол.

В этом примере используется транспортный Amqp протокол:

const deviceConnectionString = "{IoT hub device connection string}"
const Protocol = require('azure-iot-device-mqtt').Amqp;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);
Открытие подключения к Центру Интернета вещей

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

Рассмотрим пример.

client.open(function(err) {
  if (err) {
    console.error('error connecting to hub: ' + err);
    process.exit(1);
  }
})

Получение маркера SAS из Центра управления Интернетом вещей

Используйте getBlobSharedAccessSignature, чтобы получить токен SAS связанной учетной записи хранения из IoT-центра.

Рассмотрим пример.

// 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 Storage
  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);

Отправка локального файла в хранилище блобов

Локальный файл можно загрузить в хранилище Blob с компьютера.

const deviceClient = Client.fromConnectionString(deviceConnectionString, Protocol);
uploadToBlob(localFilePath, deviceClient)
  .catch((err) => {
    console.log(err);
  })
  .finally(() => {
    process.exit();
  });

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

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

Создание серверного приложения

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

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

Установка пакета SDK службы

Выполните следующую команду, чтобы установить azure-iothub на компьютере разработки:

npm install azure-iothub --save

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

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

  • Политика общего доступа
  • Microsoft Entra

Important

В этой статье содержатся шаги по подключению к службе с помощью подписанного URL-адреса. Этот метод проверки подлинности удобнее для тестирования и оценки, но проверка подлинности в службе с помощью идентификатора Microsoft Entra или управляемых удостоверений является более безопасным подходом. Дополнительные сведения см. в рекомендациях по безопасности решений > Интернета вещей Cloud Security.

Подключение с помощью политики общего доступа

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

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

В качестве параметра укажите строку подключения политики общего доступа службы . Дополнительные сведения о политиках общего доступа см. в разделе "Управление доступом к Центру Интернета вещей" с помощью подписанных URL-адресов.

var Client = require('azure-iothub').Client;
var connectionString = '{IoT hub shared access policy connection string}';
var client = Client.fromConnectionString(connectionString);

Подключение с помощью Microsoft Entra

Бэкенд-приложение, использующее Microsoft Entra, должно успешно аутентифицироваться и получить метку безопасности перед подключением к Центру Интернета вещей. Этот токен передается методу подключения IoT Hub. Общие сведения о настройке и использовании Microsoft Entra для Центра Интернета вещей см. в разделе "Управление доступом к Центру Интернета вещей" с помощью идентификатора Microsoft Entra.

Общие сведения о проверке подлинности пакета SDK Node.js см. в следующих статье:

Настройка приложения Microsoft Entra

Необходимо настроить приложение Microsoft Entra, настроенное для предпочитаемых учетных данных проверки подлинности. Приложение содержит такие параметры, как секрет клиента, используемый серверным приложением для проверки подлинности. Доступные конфигурации проверки подлинности приложений:

  • Секрет клиента
  • Certificate
  • Учетные данные федеративного удостоверения

Приложения Microsoft Entra могут требовать определенные разрешения ролей в зависимости от выполняемых операций. Например, роль Участника работы с двойниками IoT Hub необходима для предоставления прав чтения и записи к двойникам устройств и модулей IoT Hub. Дополнительные сведения см. в статье "Управление доступом к Центру Интернета вещей" с помощью назначения ролей Azure RBAC.

Дополнительные сведения о настройке приложения Microsoft Entra см. в кратком руководстве: Регистрация приложения на платформе удостоверений Майкрософт.

Проверка подлинности с помощью DefaultAzureCredential

Самый простой способ использовать Microsoft Entra для проверки подлинности серверного приложения — это использовать DefaultAzureCredential, но в рабочей среде рекомендуется использовать другой метод, включая определенный TokenCredential или оптимизированный ChainedTokenCredential. Для простоты, в этом разделе описывается аутентификация с использованием DefaultAzureCredential и секрета клиента. Дополнительные сведения о преимуществах и недостатках использования DefaultAzureCredential см. в разделе "Цепочки учетных данных" в клиентской библиотеке удостоверений Azure для JavaScript

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

Для Microsoft Entra требуется этот пакет:

npm install --save @azure/identity

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

import { DefaultAzureCredential } from "@azure/identity";

// Azure SDK clients accept the credential as a parameter
const credential = new DefaultAzureCredential();

Затем полученный токен учетных данных можно передать в fromTokenCredential для подключения любого клиента SDK, который принимает учетные данные Microsoft Entra, к узлу Интернета вещей.

fromTokenCredential требуется два параметра:

  • URL-адрес службы Azure— URL-адрес службы Azure должен находиться в формате {Your Entra domain URL}.azure-devices.net без https:// префикса. Например: MyAzureDomain.azure-devices.net.
  • Токен Azure для учетных данных

В этом примере учетные данные Azure получаются с помощью DefaultAzureCredential. Затем url-адрес домена и учетные данные домена Azure предоставляются для Registry.fromTokenCredential создания подключения к Центру Интернета вещей.

const { DefaultAzureCredential } = require("@azure/identity");

let Registry = require('azure-iothub').Registry;

// Define the client secret values
clientSecretValue = 'xxxxxxxxxxxxxxx'
clientID = 'xxxxxxxxxxxxxx'
tenantID = 'xxxxxxxxxxxxx'

// Set environment variables
process.env['AZURE_CLIENT_SECRET'] = clientSecretValue;
process.env['AZURE_CLIENT_ID'] = clientID;
process.env['AZURE_TENANT_ID'] = tenantID;

// Acquire a credential object
const credential = new DefaultAzureCredential()

// Create an instance of the IoTHub registry
hostName = 'MyAzureDomain.azure-devices.net';
let registry = Registry.fromTokenCredential(hostName,credential);
Примеры кода

Примеры работы аутентификации службы Microsoft Entra см. в примерах удостоверений Azure.

Создание приемника обратного вызова уведомления о отправке файла

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

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

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

//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 включает пример отправки файлов .