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:
- Přehled nahrávání souborů ve službě IoT Hub
- Seznámení se službou Azure Blob Storage
- Sady Azure IoT SDK
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:
- Připojení ke službě IoT Hub
- Získání identifikátoru URI SAS ze služby IoT Hub
- Nahrání souboru do úložiště Azure
- 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:
Vytvořte objekt blockBlobClient a předejte identifikátor URI pro nahrání souboru.
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:
- Volání CreateFromConnectionString pro připojení k IoT Hubu Předejte primární připojovací řetězec ioT Hubu.
- Vytvořte CancellationToken.
- Volání GetFileNotificationReceiver vytvořit příjemce oznámení.
- 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:
- Připojení k zařízení
- Získání identifikátoru URI SAS ze služby IoT Hub
- Nahrání souboru do Azure Storage
- 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:
- Připojení k klientovi služby IoT Hub
- 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:
- Vytvořte objekt getFileUploadNotificationReceiver .
- Pro připojení ke službě IoT Hub použijte open .
- 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:
- Připojení k zařízení
- Získání informací o službě Blob Storage
- Nahrání souboru do služby Blob Storage
- 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í:
Voláním create_from_connection_string přidejte primární připojovací řetězec zařízení.
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:
- Pomocí from_blob_url vytvořte objekt BlobClient z adresy URL objektu blob.
- 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:
- Získání sdílených přístupových podpisů objektů blob
- Nahrání souboru do Azure Storage
- 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:
- Vytvoření kanálu streamu
- Vytvoření adresy URL objektu blob
- Vytvoření BlockBlobClient pro nahrání souboru do služby Blob Storage
- Volání uploadFile pro nahrání souboru do služby Blob Storage
- 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:
- Připojení k klientovi služby IoT Hub
- 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ů:
- 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í.
- 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.