Caricare file da un dispositivo al cloud con l'hub IoTUpload files from your device to the cloud with IoT Hub

Questa esercitazione si basa sul codice contenuto nell'esercitazione Inviare messaggi da cloud a dispositivo con l'hub IoT e illustra come usare le funzionalità di caricamento dei file dell'hub IoT per caricare un file in Archiviazione BLOB di Azure.This tutorial builds on the code in the Send Cloud-to-Device messages with IoT Hub tutorial to show you how to use the file upload capabilities of IoT Hub to upload a file to Azure blob storage. L'esercitazione illustra come:The tutorial shows you how to:

  • Specificare in modo sicuro un dispositivo con un URI del BLOB di Azure per il caricamento di un file.Securely provide a device with an Azure blob URI for uploading a file.
  • Usare le notifiche di caricamento di file dell'hub IoT per attivare l'elaborazione del file nel back-end dell'app.Use the IoT Hub file upload notifications to trigger processing the file in your app back end.

Le esercitazioni Introduzione all'hub IoT e Inviare messaggi da cloud a dispositivo con l'hub IoT illustrano le funzionalità di messaggistica di base da dispositivo a cloud e da cloud a dispositivo dell'hub IoT.The Get started with IoT Hub and Send Cloud-to-Device messages with IoT Hub tutorials show the basic device-to-cloud and cloud-to-device messaging functionality of IoT Hub. L'esercitazione Elaborare messaggi da dispositivo a cloud illustra come archiviare in modo affidabile i messaggi da dispositivo a cloud nell'archivio BLOB di Azure.The Process Device-to-Cloud messages tutorial describes a way to reliably store device-to-cloud messages in Azure blob storage. Tuttavia in alcuni scenari non è possibile mappare facilmente i dati che i dispositivi inviano in messaggi relativamente ridotti da dispositivo a cloud, che l'hub IoT accetta.However, in some scenarios you cannot easily map the data your devices send into the relatively small device-to-cloud messages that IoT Hub accepts. ad esempio:For example:

  • File di grandi dimensioni che contengono immaginiLarge files that contain images
  • VideoVideos
  • Dati di vibrazione campionati ad alta frequenzaVibration data sampled at high frequency
  • Qualche tipo di dati pre-elaborati.Some form of preprocessed data.

Questi dati in genere vengono elaborati in batch nel cloud con strumenti come Azure Data Factory o lo stack Hadoop.These files are typically batch processed in the cloud using tools such as Azure Data Factory or the Hadoop stack. Quando è necessario caricare file da un dispositivo, è comunque possibile usare la sicurezza e l'affidabilità dell'hub IoT.When you need to upland files from a device, you can still use the security and reliability of IoT Hub.

Al termine di questa esercitazione verranno eseguite due app console Java:At the end of this tutorial you run two Java console apps:

  • simulated-device, una versione modificata dell'app creata nell'esercitazione [Inviare messaggi da cloud a dispositivo con l'hub IoT].simulated-device, a modified version of the app created in the [Send Cloud-to-Device messages with IoT Hub] tutorial. Ciò consente di caricare un file nell'archivio tramite un URI con firma di accesso condiviso fornito dall'hub IoT.This app uploads a file to storage using a SAS URI provided by your IoT hub.
  • read-file-upload-notification, che riceve le notifiche di caricamento file dall'hub IoT.read-file-upload-notification, which receives file upload notifications from your IoT hub.

Nota

L'hub IoT supporta numerose piattaforme e linguaggi (inclusi C, .NET e Javascript) tramite gli Azure IoT SDK per dispositivi.IoT Hub supports many device platforms and languages (including C, .NET, and Javascript) through Azure IoT device SDKs. Vedere il Centro per sviluppatori di IoT di Azure per istruzioni dettagliate su come connettere il dispositivo all'Hub IoT di Azure.Refer to the [Azure IoT Developer Center] for step-by-step instructions on how to connect your device to Azure IoT Hub.

Per completare l'esercitazione, sono necessari gli elementi seguenti:To complete this tutorial, you need the following:

Associare un account di archiviazione di Azure all'hub IoTAssociate an Azure Storage account to IoT Hub

Poiché l'app per dispositivo simulato carica un file in un BLOB, è necessario avere un account di Archiviazione di Azure associato all'hub IoT.Because the simulated device app uploads a file to a blob, you must have an Azure Storage account associated to IoT Hub. Quando si associa un account di Archiviazione di Azure a un hub IoT, l'hub IoT genera un URI di firma di accesso condiviso.When you associate an Azure Storage account with an IoT hub, the IoT hub generates a SAS URI. Un dispositivo può usare questo URI di firma di accesso condiviso per eseguire l'upload di un file in modo sicuro in un contenitore BLOB.A device can use this SAS URI to securely upload a file to a blob container. Il servizio hub IoT e gli SDK di dispositivo coordinano il processo che genera l'URI di firma di accesso condiviso e lo rendono disponibile per un dispositivo che lo userà per caricare un file.The IoT Hub service and the device SDKs coordinate the process that generates the SAS URI and makes it available to a device to use to upload a file.

Seguire le istruzioni in Configurare i caricamenti dei file con il portale di Azure per associare un account di archiviazione di Azure all'hub IoT.Follow the instructions in Configure file uploads using the Azure portal to associate an Azure Storage account to your IoT hub. Assicurarsi che un contenitore BLOB venga associato all'hub IoT e che siano abilitate le notifiche file.Make sure that a blob container is associated with your IoT hub and that file notifications are enabled.

Abilitazione di notifiche file nel portale

Caricare un file da un'app per dispositiviUpload a file from a device app

In questa sezione viene modificata l'app per dispositivi creata in Inviare messaggi da cloud a dispositivo con l'hub IoT per caricare un file nell'hub IoT.In this section, you modify the device app you created in Send Cloud-to-Device messages with IoT Hub to upload a file to IoT hub.

  1. Copiare un file di immagine nella cartella simulated-device e rinominarlo myimage.png.Copy an image file to the simulated-device folder and rename it myimage.png.

  2. Aprire il file simulated-device\src\main\java\com\mycompany\app\App.java in un editor di testo.Using a text editor, open the simulated-device\src\main\java\com\mycompany\app\App.java file.

  3. Aggiungere la dichiarazione di variabile alla classe App:Add the variable declaration to the App class:

    private static String fileName = "myimage.png";
    
  4. Per elaborare i messaggi di richiamata dello stato di caricamento del file, aggiungere la classe annidata seguente alla classe App:To process file upload status callback messages, add the following nested class to the App class:

    // Define a callback method to print status codes from IoT Hub.
    protected static class FileUploadStatusCallBack implements IotHubEventCallback {
      public void execute(IotHubStatusCode status, Object context) {
        System.out.println("IoT Hub responded to file upload for " + fileName
            + " operation with status " + status.name());
      }
    }
    
  5. Per caricare le immagini nell'hub IoT, aggiungere il metodo seguente alla classe App:To upload images to IoT Hub, add the following method to the App class to upload images to IoT Hub:

    // Use IoT Hub to upload a file asynchronously to Azure blob storage.
    private static void uploadFile(String fullFileName) throws FileNotFoundException, IOException
    {
      File file = new File(fullFileName);
      InputStream inputStream = new FileInputStream(file);
      long streamLength = file.length();
    
      client.uploadToBlobAsync(fileName, inputStream, streamLength, new FileUploadStatusCallBack(), null);
    }
    
  6. Modificare il metodo main per chiamare il metodo uploadFile come illustrato nel frammento di codice seguente:Modify the main method to call the uploadFile method as shown in the following snippet:

    client.open();
    
    try
    {
      // Get the filename and start the upload.
      String fullFileName = System.getProperty("user.dir") + File.separator + fileName;
      uploadFile(fullFileName);
      System.out.println("File upload started with success");
    }
    catch (Exception e)
    {
      System.out.println("Exception uploading file: " + e.getCause() + " \nERROR: " + e.getMessage());
    }
    
    MessageSender sender = new MessageSender();
    
  7. Usare il comando seguente per compilare l'app simulated-device e verificare la presenza di eventuali errori:Use the following command to build the simulated-device app and check for errors:

    mvn clean package -DskipTests
    

Ricevere la notifica di caricamento di un fileReceive a file upload notification

In questa sezione viene creata un'app console Java che riceve messaggi di notifica di caricamento file dall'hub IoT.In this section, you create a Java console app that receives file upload notification messages from IoT Hub.

Per completare questa sezione è necessaria la stringa di connessione iothubowner.You need the iothubowner connection string for your IoT Hub to complete this section. È possibile trovare la stringa di connessione nel portale di Azure nel pannello Criteri di accesso condiviso.You can find the connection string in the Azure portal on the Shared access policy blade.

  1. Creare un progetto Maven denominato read-file-upload-notification usando questo comando al prompt dei comandi.Create a Maven project called read-file-upload-notification using the following command at your command prompt. Si noti che si tratta di un lungo comando singolo:Note this command is a single, long command:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=read-file-upload-notification -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Al prompt dei comandi passare alla nuova cartella read-file-upload-notification.At your command prompt, navigate to the new read-file-upload-notification folder.

  3. In un editor di testo aprire il file pom.xml nella cartella read-file-upload-notification e aggiungere la dipendenza seguente al nodo dependencies.Using a text editor, open the pom.xml file in the read-file-upload-notification folder and add the following dependency to the dependencies node. L'aggiunta della dipendenza consente di usare il pacchetto iothub-java-service-client nell'applicazione per comunicare con il servizio hub IoT:Adding the dependency enables you to use the iothub-java-service-client package in your application to communicate with your IoT hub service:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-service-client</artifactId>
      <version>1.7.23</version>
    </dependency>
    

    Nota

    È possibile cercare la versione più recente di iot-service-client usando la ricerca di Maven.You can check for the latest version of iot-service-client using Maven search.

  4. Salvare e chiudere il file pom.xml.Save and close the pom.xml file.

  5. Aprire il file read-file-upload-notification\src\main\java\com\mycompany\app\App.java in un editor di testo.Using a text editor, open the read-file-upload-notification\src\main\java\com\mycompany\app\App.java file.

  6. Aggiungere al file le istruzioni import seguenti:Add the following import statements to the file:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
  7. Aggiungere le variabili a livello di classe seguenti alla classe App :Add the following class-level variables to the App class:

    private static final String connectionString = "{Your IoT Hub connection string}";
    private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
    private static FileUploadNotificationReceiver fileUploadNotificationReceiver = null;
    
  8. Per stampare le informazioni relative al caricamento del file nella console, aggiungere la classe annidata seguente alla classe App:To print information about the file upload to the console, add the following nested class to the App class:

    // Create a thread to receive file upload notifications.
    private static class ShowFileUploadNotifications implements Runnable {
      public void run() {
        try {
          while (true) {
            System.out.println("Recieve file upload notifications...");
            FileUploadNotification fileUploadNotification = fileUploadNotificationReceiver.receive();
            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());
            }
          }
        } catch (Exception ex) {
          System.out.println("Exception reading reported properties: " + ex.getMessage());
        }
      }
    }
    
  9. Per avviare il thread che rimane in ascolto delle notifiche di caricamento del file, aggiungere il codice seguente al metodo main:To start the thread that listens for file upload notifications, add the following code to the main method:

    public static void main(String[] args) throws IOException, URISyntaxException, Exception {
      ServiceClient serviceClient = ServiceClient.createFromConnectionString(connectionString, protocol);
    
      if (serviceClient != null) {
        serviceClient.open();
    
        // Get a file upload notification receiver from the ServiceClient.
        fileUploadNotificationReceiver = serviceClient.getFileUploadNotificationReceiver();
        fileUploadNotificationReceiver.open();
    
        // Start the thread to receive file upload notifications.
        ShowFileUploadNotifications showFileUploadNotifications = new ShowFileUploadNotifications();
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.execute(showFileUploadNotifications);
    
        System.out.println("Press ENTER to exit.");
        System.in.read();
        executor.shutdownNow();
        System.out.println("Shutting down sample...");
        fileUploadNotificationReceiver.close();
        serviceClient.close();
      }
    }
    
  10. Salvare e chiudere il file read-file-upload-notification\src\main\java\com\mycompany\app\App.java.Save and close the read-file-upload-notification\src\main\java\com\mycompany\app\App.java file.

  11. Usare il comando seguente per compilare l'app read-file-upload-notification e verificare la presenza di eventuali errori:Use the following command to build the read-file-upload-notification app and check for errors:

    mvn clean package -DskipTests
    

Eseguire le applicazioniRun the applications

A questo punto è possibile eseguire le applicazioni.Now you are ready to run the applications.

Al prompt dei comandi nella cartella read-file-upload-notification eseguire il comando seguente:At a command prompt in the read-file-upload-notification folder, run the following command:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App"

Al prompt dei comandi nella cartella simulated-device eseguire il comando seguente:At a command prompt in the simulated-device folder, run the following command:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App"

Lo screenshot seguente presenta l'output dell'app simulated-device:The following screenshot shows the output from the simulated-device app:

Output dell'app simulated-device

Lo screenshot seguente presenta l'output dell'app read-file-upload-notification:The following screenshot shows the output from the read-file-upload-notification app:

Output dell'app read-file-upload-notification

Per visualizzare il file caricato nel contenitore di archiviazione configurato, è possibile usare il portale:You can use the portal to view the uploaded file in the storage container you configured:

File caricato

Passaggi successiviNext steps

In questa esercitazione si è appreso come usare le funzionalità di caricamento file dell'hub IoT per semplificare i caricamenti di file dai dispositivi.In this tutorial, you learned how to use the file upload capabilities of IoT Hub to simplify file uploads from devices. È possibile continuare a esplorare le funzionalità e gli scenari dell'hub IoT vedendo i seguenti articoli:You can continue to explore IoT hub features and scenarios with the following articles:

Per altre informazioni sulle funzionalità dell'hub IoT, vedere:To further explore the capabilities of IoT Hub, see: