Caricare file da un dispositivo al cloud con l'hub IoT

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. L'esercitazione illustra come:

  • Specificare in modo sicuro un dispositivo con un URI del BLOB di Azure per il caricamento di un file.
  • Usare le notifiche di caricamento di file dell'hub IoT per attivare l'elaborazione del file nel back-end dell'app.

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. 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. 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. ad esempio:

  • File di grandi dimensioni che contengono immagini
  • Video
  • Dati di vibrazione campionati ad alta frequenza
  • Qualche tipo di dati pre-elaborati.

Questi dati in genere vengono elaborati in batch nel cloud con strumenti come Azure Data Factory o lo stack Hadoop. Quando è necessario caricare file da un dispositivo, è comunque possibile usare la sicurezza e l'affidabilità dell'hub IoT.

Al termine di questa esercitazione verranno eseguite due app console Java:

  • simulated-device, una versione modificata dell'app creata nell'esercitazione [Inviare messaggi da cloud a dispositivo con l'hub IoT]. Ciò consente di caricare un file nell'archivio tramite un URI con firma di accesso condiviso fornito dall'hub IoT.
  • read-file-upload-notification, che riceve le notifiche di caricamento file dall'hub IoT.
Nota

L'hub IoT supporta numerose piattaforme e linguaggi (inclusi C, .NET e Javascript) tramite gli Azure IoT SDK per dispositivi. Vedere il Centro per sviluppatori di IoT di Azure per istruzioni dettagliate su come connettere il dispositivo all'Hub IoT di Azure.

Per completare l'esercitazione, sono necessari gli elementi seguenti:

Associare un account di archiviazione di Azure all'hub IoT

Poiché l'app per dispositivo simulato carica un file in un BLOB, è necessario avere un account di Archiviazione di Azure associato all'hub IoT. Quando si associa un account di Archiviazione di Azure a un hub IoT, l'hub IoT genera un URI di firma di accesso condiviso. 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. 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.

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. Assicurarsi che un contenitore BLOB venga associato all'hub IoT e che siano abilitate le notifiche file.

Abilitazione di notifiche file nel portale

Caricare un file da un'app per dispositivi

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.

  1. Copiare un file di immagine nella cartella simulated-device e rinominarlo myimage.png.

  2. Aprire il file simulated-device\src\main\java\com\mycompany\app\App.java in un editor di testo.

  3. Aggiungere la dichiarazione di variabile alla classe App:

    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:

    // 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:

    // 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:

    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:

    mvn clean package -DskipTests
    

Ricevere la notifica di caricamento di un file

In questa sezione viene creata un'app console Java che riceve messaggi di notifica di caricamento file dall'hub IoT.

Per completare questa sezione è necessaria la stringa di connessione iothubowner. È possibile trovare la stringa di connessione nel portale di Azure nel pannello Criteri di accesso condiviso.

  1. Creare un progetto Maven denominato read-file-upload-notification usando questo comando al prompt dei comandi. Si noti che si tratta di un lungo comando singolo:

    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.

  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. L'aggiunta della dipendenza consente di usare il pacchetto iothub-java-service-client nell'applicazione per comunicare con il servizio hub IoT:

    <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.

  4. Salvare e chiudere il file pom.xml.

  5. Aprire il file read-file-upload-notification\src\main\java\com\mycompany\app\App.java in un editor di testo.

  6. Aggiungere al file le istruzioni import seguenti:

    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 :

    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:

    // 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:

    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.

  11. Usare il comando seguente per compilare l'app read-file-upload-notification e verificare la presenza di eventuali errori:

    mvn clean package -DskipTests
    

Eseguire le applicazioni

A questo punto è possibile eseguire le applicazioni.

Al prompt dei comandi nella cartella read-file-upload-notification eseguire il comando seguente:

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

Al prompt dei comandi nella cartella simulated-device eseguire il comando seguente:

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

Lo screenshot seguente presenta l'output dell'app simulated-device:

Output dell'app simulated-device

Lo screenshot seguente presenta l'output dell'app read-file-upload-notification:

Output dell'app read-file-upload-notification

Per visualizzare il file caricato nel contenitore di archiviazione configurato, è possibile usare il portale:

File caricato

Passaggi successivi

In questa esercitazione si è appreso come usare le funzionalità di caricamento file dell'hub IoT per semplificare i caricamenti di file dai dispositivi. È possibile continuare a esplorare le funzionalità e gli scenari dell'hub IoT vedendo i seguenti articoli:

Per altre informazioni sulle funzionalità dell'hub IoT, vedere: