Nahrání souborů ze zařízení do cloudu pomocí Azure IoT Hubu

Tento článek ukazuje, jak:

  • Pomocí funkcí pro nahrání souborů služby IoT Hub nahrajte soubor do služby Azure Blob Storage pomocí sad SDK pro zařízení a služby Azure IoT.
  • Upozorněte ioT Hub, že se soubor úspěšně nahrál a vytvořil back-endovou službu pro příjem oznámení o nahrání souborů ze služby IoT Hub pomocí sad SDK služby Azure IoT.

V některých scénářích nemůžete snadno namapovat data, která vaše zařízení odesílají, do relativně malých zpráv typu zařízení-cloud, které IoT Hub přijímá. Možnosti nahrávání souborů ve službě IoT Hub umožňují přesun velkých nebo složitých dat do cloudu. Příklad:

  • Videa
  • Velké soubory obsahující obrázky
  • Data kmitání vzorkovaná ve vysoké frekvenci
  • Některá forma předzpracovaných dat

Tyto soubory se obvykle dávkově zpracovávají v cloudu pomocí nástrojů, jako je Azure Data Factory nebo stack Hadoop . Pokud potřebujete nahrát soubory ze zařízení, můžete dál používat zabezpečení a spolehlivost ioT Hubu. V tomto článku se dozvíte, jak na to.

Tento článek je určený k doplnění spustitelných ukázek sady SDK, na které odkazuje tento článek.

Další informace naleznete v tématu:

Důležité

Funkce nahrávání souborů na zařízeních, která používají ověřování certifikační autority (CA) X.509, je ve verzi Public Preview a musí být povolený režim náhledu. Je obecně dostupná na zařízeních, která používají ověřování kryptografického otisku X.509 nebo ověření identity certifikátu X.509 se službou Azure Device Provisioning. Další informace o ověřování X.509 ve službě IoT Hub najdete v tématu Podporované certifikáty X.509.

Požadavky

  • IoT Hub. Některá volání sady SDK vyžadují primární připojovací řetězec ioT Hubu, proto si poznamenejte připojovací řetězec.

  • Registrované zařízení. Některá volání sady SDK vyžadují primární připojovací řetězec zařízení, proto si poznamenejte připojovací řetězec.

  • Oprávnění ke službě IoT Hub Service Connect – K příjmu zpráv s oznámením o nahrání souboru potřebuje vaše back-endová služba oprávnění Service Connect . Ve výchozím nastavení se každá služba IoT Hub vytvoří pomocí zásady sdíleného přístupu s názvem služby , která toto oprávnění uděluje. Další informace najdete v tématu Připojení k centru IoT.

  • Nakonfigurujte nahrávání souborů ve službě IoT Hub propojením účtu služby Azure Storage a kontejneru Azure Blob Storage. Můžete je nakonfigurovat pomocí webu Azure Portal, Azure CLI nebo Azure PowerShellu.

Přehled

Tento postup obsahuje dvě části:

  • Nahrání souboru z aplikace zařízení
  • Příjem oznámení o nahrání souboru v back-endové aplikaci

Nahrání souboru z aplikace zařízení

Tato část popisuje, jak nahrát soubor ze zařízení do centra IoT pomocí třídy DeviceClient v sadě Azure IoT SDK pro .NET.

Tímto postupem nahrajete soubor ze zařízení do centra IoT:

  1. Připojení ke službě IoT Hub
  2. Získání identifikátoru URI SAS ze služby IoT Hub
  3. Nahrání souboru do úložiště Azure
  4. Oznámení ioT Hubu o stavu nahrání souboru

Připojení k zařízení

Volání CreateFromConnectionString pro připojení k zařízení. Předejte primární připojovací řetězec zařízení.

AMQP je výchozí přenosový protokol.

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

Získání identifikátoru URI SAS ze služby IoT Hub

Pokud chcete získat podrobnosti o nahrávání souborů, zavolejte GetFileUploadSasUriAsync . Identifikátor URI SAS se používá v dalším kroku k nahrání souboru ze zařízení do služby Blob Storage.

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

Nahrání souboru do úložiště Azure

Nahrání souboru do úložiště Azure:

  1. Vytvořte objekt blockBlobClient a předejte identifikátor URI pro nahrání souboru.

  2. Pomocí metody UploadAsync nahrajte soubor do služby Blob Storage a předejte identifikátor URI SAS. Volitelně můžete přidat možnosti nahrání objektu blob a parametry tokenu zrušení.

Klient Azure Blob vždy používá jako protokol HTTPS k nahrání souboru do Služby Azure Storage.

V tomto příkladu se předá identifikátor URI SAS k BlockBlobClient vytvoření klienta objektů blob bloku služby Azure Storage a nahraje soubor:

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

Oznámení ioT Hubu o stavu nahrání souboru

Pomocí CompleteFileUploadAsync upozorněte službu IoT Hub, že klient zařízení dokončil nahrávání a předal objekt FileUploadCompletionNotification . Příznak IsSuccess označuje, jestli nahrávání proběhlo úspěšně. Po oznámení služba IoT Hub uvolní prostředky přidružené k nahrání (identifikátor URI SAS).

Pokud jsou povolená oznámení o nahrávání souborů, služba IoT Hub odešle zprávu s oznámením o nahrání souboru do back-endových služeb, které jsou nakonfigurované pro oznámení o nahrání souboru.

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

Ukázka nahrání souboru sady SDK

Sada SDK obsahuje tuto ukázku nahrání souboru.

Přijetí oznámení o nahrání souboru v back-endové aplikaci

Můžete vytvořit back-endovou službu pro příjem zpráv oznámení o nahrání souboru z Centra IoT.

Třída ServiceClient obsahuje metody, které mohou služby použít k přijímání oznámení o nahrávání souborů.

Příjem oznámení o nahrání souboru:

  1. Volání CreateFromConnectionString pro připojení k IoT Hubu Předejte primární připojovací řetězec ioT Hubu.
  2. Vytvořte CancellationToken.
  3. Volání GetFileNotificationReceiver vytvořit příjemce oznámení.
  4. Pomocí smyčky ReceiveAsync počkejte na oznámení o nahrání souboru.

Příklad:

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

Přehled

Tento postup obsahuje dvě části:

  • Nahrání souboru z aplikace zařízení
  • Příjem oznámení o nahrání souboru v back-endové aplikaci

Nahrání souboru z aplikace zařízení

Tato část popisuje, jak nahrát soubor ze zařízení do centra IoT pomocí třídy DeviceClient ze sady Azure IoT SDK pro Javu.

Tímto postupem nahrajete soubor ze zařízení do centra IoT:

  1. Připojení k zařízení
  2. Získání identifikátoru URI SAS ze služby IoT Hub
  3. Nahrání souboru do Azure Storage
  4. Odeslání oznámení o stavu nahrání souboru do ioT Hubu

Protokol připojení

Operace nahrávání souborů vždy používají protokol HTTPS, ale DeviceClient může definovat IotHubClientProtocol pro jiné služby, jako jsou telemetrie, metoda zařízení a dvojče zařízení.

IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;

Připojení k zařízení

DeviceClient Vytvořte instanci pro připojení k zařízení pomocí primárního připojovací řetězec zařízení.

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

Získání identifikátoru URI SAS ze služby IoT Hub

Volání getFileUploadSasUri získat FileUploadSasUriResponse objektu.

FileUploadSasUriResponse zahrnuje tyto metody a návratové hodnoty. Návratové hodnoty je možné předávat metodám nahrávání souborů.

metoda Vrácená hodnota
getCorrelationId() ID korelace
getContainerName() Název kontejneru
getBlobName() Název objektu blob
getBlobUri() Blob URI

Příklad:

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

Nahrání souboru do Azure Storage

Předáním koncového bodu identifikátoru URI objektu blob objektu BlobClientBuilder.buildclient vytvořte objekt BlobClient .

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

Volání uploadFromFile pro nahrání souboru do blob Storage.

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

Odeslání oznámení o stavu nahrání souboru do ioT Hubu

Po pokusu o nahrání souboru odešlete do služby IoT Hub oznámení o stavu nahrávání.

Vytvořte FileUploadCompletionNotification objekt. Předejte stav úspěšného nahrání souboru a isSuccess odešlete hocorrelationId. isSuccess true Pokud ne, předejte hodnotu při false úspěšném nahrání souboru.

FileUploadCompletionNotification musí být volána i v případě, že se nahrávání souboru nezdaří. IoT Hub má pevný počet identifikátorů URI SAS, který může být v daném okamžiku aktivní. Až nahrávání souboru dokončíte, měli byste identifikátor URI SAS uvolnit, aby bylo možné vygenerovat další identifikátor URI SAS. Pokud identifikátor URI SAS není prostřednictvím tohoto rozhraní API uvolněný, uvolní se nakonec na základě toho, jak dlouho se identifikátory URI SAS konfigurují tak, aby v centru IoT žili.

Tento příklad předá úspěšný stav.

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

Zavření klienta

Uvolněte client prostředky.

client.closeNow();

Přijetí oznámení o nahrání souboru v back-endové aplikaci

Můžete vytvořit back-endovou aplikaci pro příjem oznámení o nahrávání souborů.

Vytvoření aplikace pro nahrání souboru s oznámením:

  1. Připojení k klientovi služby IoT Hub
  2. Kontrola oznámení o nahrání souboru

Třída ServiceClient obsahuje metody, které mohou služby použít k přijímání oznámení o nahrávání souborů.

Připojení k klientovi služby IoT Hub

Vytvoření objektu IotHubServiceClientProtocol Připojení používá AMQPS protokol.

Volání createFromConnectionString pro připojení ke službě IoT Hub Předejte primární připojovací řetězec ioT Hubu.

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

Kontrola stavu nahrání souboru

Kontrola stavu nahrání souboru:

  1. Vytvořte objekt getFileUploadNotificationReceiver .
  2. Pro připojení ke službě IoT Hub použijte open .
  3. Volání příjmu a zkontroluje stav nahrání souboru. Tato metoda vrátí fileUploadNotification objekt. Pokud se zobrazí oznámení o nahrání, můžete zobrazit pole stavu nahrání pomocí metod fileUploadNotification .

Příklad:

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

Ukázky nahrávání souborů sady SDK

Ukázky pro nahrání dvou souborů v Javě.

Instalace balíčků

Před voláním jakéhokoli souvisejícího kódu je nutné nainstalovat knihovnu azure-iot-device.

pip install azure-iot-device

Balíček azure.storage.blob slouží k nahrání souboru.

pip install azure.storage.blob

Nahrání souboru z aplikace zařízení

Tato část popisuje, jak nahrát soubor ze zařízení do centra IoT pomocí třídy IoTHubDeviceClient ze sady Azure IoT SDK pro Python.

Tímto postupem nahrajete soubor ze zařízení do centra IoT:

  1. Připojení k zařízení
  2. Získání informací o službě Blob Storage
  3. Nahrání souboru do služby Blob Storage
  4. Oznámení ioT Hubu o stavu nahrání

Import knihoven

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

Připojení k zařízení

Připojení k zařízení:

  1. Voláním create_from_connection_string přidejte primární připojovací řetězec zařízení.

  2. Voláním připojení připojte klienta zařízení.

Příklad:

# 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()

Získání informací o službě Blob Storage

Zavolejte get_storage_info_for_blob a získejte informace z centra IoT o propojeném účtu Azure Storage. Tyto informace zahrnují název hostitele, název kontejneru, název objektu blob a token SAS. Metoda get_storage_info_for_blob také vrátí correlation_id, který se používá v notify_blob_upload_status metodě. Je to correlation_id způsob označení objektu blob, na kterém pracujete.

# 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)

Nahrání souboru do služby Blob Storage

Nahrání souboru do služby Blob Storage:

  1. Pomocí from_blob_url vytvořte objekt BlobClient z adresy URL objektu blob.
  2. Voláním upload_blob nahrajte soubor do služby Blob Storage.

Tento příklad analyzuje blob_info strukturu a vytvoří adresu URL, kterou používá k inicializaci objektu BlobClient. Potom se zavolá upload_blob k nahrání souboru do služby Blob Storage.

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)

Oznámení ioT Hubu o stavu nahrání

Pomocí notify_blob_upload_status upozorněte službu IoT Hub na stav operace Blob Storage. Předejte získané correlation_id metodou get_storage_info_for_blob . IoT correlation_id Hub používá k upozornění jakékoli služby, která může naslouchat oznámení o stavu úlohy nahrání souboru.

Tento příklad upozorní službu IoT Hub na úspěšné nahrání souboru:

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

Vypnutí klienta zařízení

Vypněte klienta. Jakmile se tato metoda zavolá, jakýkoli pokus o další volání klienta způsobí vyvolání ClientError .

device_client.shutdown()

Ukázky nahrávání souborů sady SDK

Sada SDK obsahuje dvě ukázky nahrávání souborů:

Přehled

Tento postup obsahuje dvě části:

  • Nahrání souboru z aplikace zařízení
  • Příjem oznámení o nahrání souboru v back-endové aplikaci

Nahrání souboru z aplikace zařízení

Tato část popisuje, jak nahrát soubor ze zařízení do centra IoT pomocí balíčku azure-iot-device v sadě Azure IoT SDK pro Node.js.

Instalace balíčků SADY SDK

Spuštěním tohoto příkazu nainstalujte sadu SDK zařízení azure-iot-device , azure-iot-device-mqtt a balíčky @azure/storage-blob na vývojovém počítači:

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

Balíček zařízení azure-iot-device obsahuje objekty, které jsou rozhraní se zařízeními IoT.

Postupujte podle tohoto postupu pro nahrání souboru ze zařízení do ioT Hubu:

  1. Získání sdílených přístupových podpisů objektů blob
  2. Nahrání souboru do Azure Storage
  3. Odeslání oznámení o stavu nahrání souboru do ioT Hubu

Vytváření modulů

Pomocí nainstalovaných balíčků vytvořte moduly klienta, protokolu, chyb a cest.

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

Získání identifikátoru URI SAS ze služby IoT Hub

Pomocí getBlobSharedAccessSignature získejte token SAS propojeného účtu úložiště ze služby IoT Hub. Jak je popsáno v požadavcích, centrum IoT je propojené se službou Blob Storage.

Příklad:

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

Nahrání souboru do IoT Hubu

Nahrání souboru ze zařízení do IoT Hubu:

  1. Vytvoření kanálu streamu
  2. Vytvoření adresy URL objektu blob
  3. Vytvoření BlockBlobClient pro nahrání souboru do služby Blob Storage
  4. Volání uploadFile pro nahrání souboru do služby Blob Storage
  5. Volání notifyBlobUploadStatus pro oznámení IoT Hubu, že nahrávání proběhlo úspěšně nebo selhalo

Příklad:

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

Příjem oznámení o nahrání souboru v back-endové aplikaci

Můžete vytvořit back-endovou aplikaci, která zkontroluje klienta služby IoT Hub pro odesílání oznámení o nahrávání souborů zařízení.

Vytvoření aplikace pro nahrání souboru s oznámením:

  1. Připojení k klientovi služby IoT Hub
  2. Kontrola oznámení o nahrání souboru

Připojení k klientovi služby IoT Hub

Třída ServiceClient obsahuje metody, které mohou služby použít k přijímání oznámení o nahrávání souborů.

Připojte se ke službě IoT Hub pomocí fromConnectionString. Předejte primární připojovací řetězec ioT Hubu.

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

Otevřete připojení k IoT Hubu.

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

Kontrola oznámení o nahrání souboru

Kontrola odesílání oznámení o nahrávání souborů:

  1. Volání getFileNotificationReceiver Zadejte název metody zpětného volání pro nahrání souboru, která se volá při přijetí zpráv oznámení.
  2. Zpracování oznámení o nahrání souboru v metodě zpětného volání

Tento příklad nastaví příjemce zpětného receiveFileUploadNotification volání oznámení. Příjemce interpretuje informace o stavu nahrání souboru a vytiskne stavovou zprávu do konzoly.

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

Ukázka nahrání souboru sady SDK

Sada SDK obsahuje ukázku pro nahrání do rozšířeného objektu blob.