Share via


Charger des fichiers sur le cloud à partir d’un appareil avec Azure IoT Hub (Java)

Cet article montre les capacités de chargement de fichiers d’IoT Hub pour charger un fichier vers un stockage blob Azure en utilisant Java.

Les articles de démarrage rapide Envoyer des données de télémétrie d’un appareil vers un hub IoT et Envoyer des messages cloud-à-appareil avec IoT Hub illustrent les fonctionnalités de messages appareil-à-cloud et cloud-à-appareil de base offertes par IoT Hub. Le tutoriel Configurer le routage des messages avec IoT Hub montre un moyen de stocker de façon fiable les messages appareil-à-cloud dans Stockage Blob Azure. Cependant, dans certains scénarios, vous ne pouvez pas mapper facilement les données que vos appareils envoient dans les messages appareil-à-cloud relativement petits acceptés par IoT Hub. Par exemple :

  • Vidéos
  • Fichiers volumineux qui contiennent des images
  • Données de vibration échantillonnées à une fréquence élevée
  • Un certain type de données prétraitées.

Ces fichiers sont généralement traités par lot dans le cloud à l’aide d’outils tels que Azure Data Factory ou de la pile Hadoop. Si vous avez besoin de charger des fichiers à partir d’un appareil, vous pouvez toujours exploiter la sécurité et la fiabilité d’IoT Hub. Cet article vous montre comment procéder. Découvrez deux exemples à partir d’azure-iot-sdk-java dans GitHub.

Notes

IoT Hub prend en charge plusieurs plateformes d’appareils et langages (notamment C, .NET et JavaScript) par le biais de kits Azure IoT device SDK. Consultez le Centre de développement Azure IoT pour savoir comment connecter votre appareil à Azure IoT Hub.

Important

La fonctionnalité de chargement de fichiers sur les appareils qui utilisent l’authentification par l’autorité de certification X.509 est en préversion publique, et le mode aperçu doit être activé. Elle est généralement disponible sur les appareils qui utilisent l’authentification par empreinte X.509 ou l’attestation de certificat X.509 avec le service de provisionnement des appareils Azure. Pour en savoir plus sur l’authentification X.509 avec IoT Hub, consultez les certificats X.509 pris en charge.

Prérequis

  • Un IoT Hub. Créez-en un avec l’interface CLI ou le portail Azure.

  • Appareil inscrit. Inscrivez-en un dans le portail Azure.

  • Java SE Development Kit 8. Veillez à sélectionner Java 8 sous Prise en charge à long terme pour accéder aux téléchargements du kit JDK 8.

  • Maven 3

  • Le port 8883 doit être ouvert dans votre pare-feu. L’exemple d’appareil décrit dans cet article utilise le protocole MQTT, qui communique via le port 8883. Ce port peut être bloqué dans certains environnements réseau professionnels et scolaires. Pour plus d’informations sur les différentes façons de contourner ce problème, consultez Connexion à IoT Hub (MQTT).

Associer un compte Azure Storage à IoT Hub

Pour télécharger des fichiers à partir d’un appareil, vous devez disposer d’un compte de stockage Azure et d’un conteneur Stockage Blob Azure associés à votre IoT Hub. Une fois que vous associez le compte de stockage et le conteneur à votre hub IoT, il peut fournir les éléments d’un URI SAS lorsqu’il est demandé par un appareil. L’appareil peut ensuite utiliser ces éléments pour construire l’URI SAS qu’il utilise pour s’authentifier auprès du Stockage Azure et charger des fichiers dans le conteneur d’objets blob.

Pour associer un compte de Stockage Azure à votre hub IoT :

  1. DansParamètres hub, sélectionnez Chargement de fichiers dans le volet gauche de votre hub IoT.

    Capture d’écran présentant les paramètres de téléchargement de fichiers à partir du portail.

  2. Dans le voletChargement de fichiers sélectionnez Conteneur de stockage Azure. Pour cet article, il est recommandé que votre compte de stockage et votre IoT Hub se trouvent dans la même région.

    • Si vous avez déjà un compte de stockage que vous souhaitez utiliser, sélectionnez-le dans la liste.

    • Pour créer un nouveau compte de stockage, sélectionnez +Compte de stockage. Donnez un nom au compte de stockage et veillez à ce que l’Emplacement soit défini sur la même région que votre hub IoT, puis sélectionnez OK. Le nouveau compte est créé dans le même groupe de ressources que votre IoT Hub. Une fois le déploiement terminé, sélectionnez le compte de stockage dans la liste.

    Une fois le compte de stockage sélectionné, le volet Conteneurs s’ouvre.

  3. Dans le volet Conteneurs, sélectionnez le conteneur d’objets blob.

    • Si vous disposez déjà d’un conteneur d’objets blob que vous souhaitez utiliser, sélectionnez-le dans la liste et cliquez sur Sélectionner.

    • Sélectionnez + Conteneur pour créer un nouveau conteneur d’objets blob. Donnez un nom au nouveau conteneur. Dans le cadre de cet article, vous pouvez conserver les valeurs par défaut de tous les autres champs. Sélectionnez Create (Créer). Une fois le déploiement terminé, sélectionnez le conteneur dans la liste et cliquez sur Sélectionner.

  4. De nouveau dans le volet Chargement de fichiers veillez à ce que les notifications de fichiers soient configurées sur On. Vous pouvez garder les valeurs par défaut de tous les autres paramètres. Sélectionnez Enregistrer et attendez l’exécution des paramètres avant de passer à la section suivante.

    Capture d’écran présentant les paramètres de confirmation de chargement du fichier dans le portail.

Pour plus d’informations sur la création d’un compte de stockage Azure, consultez Créer un compte de stockage. Pour obtenir des instructions plus détaillées sur la façon d’associer un compte de stockage et un conteneur d’objets blob à un hub IoT, consultez Configurer les chargements de fichiers à l’aide du portail Azure.

Créer un projet au moyen de Maven

Créez un répertoire pour votre projet et démarrez un interpréteur de commandes dans ce répertoire. Sur la ligne de commande, exécutez la commande suivante :

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Cela génère un répertoire portant le même nom que artifactId et une structure de projet standard :

  my-app
  |-- pom.xml
   -- src
      -- main
         -- java
            -- com
               -- mycompany
                  -- app
                     --App.Java

À l’aide d’un éditeur de texte, remplacez le fichier pom.xml par ce qui suit :


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
      <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-device-client</artifactId>
      <version>1.30.1</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.29</version>
    </dependency>    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-shade-plugin</artifactId>
          <version>2.4</version>
          <executions>
              <execution>
                  <phase>package</phase>
                  <goals>
                    <goal>shade</goal>
                  </goals>
                  <configuration>
                      <filters>
                          <filter>
                              <artifact>*:*</artifact>
                              <excludes>
                                  <exclude>META-INF/*.SF</exclude>
                                  <exclude>META-INF/*.RSA</exclude>
                              </excludes>
                          </filter>
                      </filters>
                      <shadedArtifactAttached>true</shadedArtifactAttached>
                      <shadedClassifierName>with-deps</shadedClassifierName>
                  </configuration>
              </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Charger un fichier à partir d’une application d’appareil

Copiez le fichier que vous souhaitez charger dans le dossier my-app de votre arborescence de projets. À l’aide d’un éditeur de texte, remplacez App.java par le code suivant. Indiquez la chaîne de connexion et le nom de fichier de votre appareil à l’endroit indiqué. Vous avez copié la chaîne de connexion de l’appareil au moment de l’inscription de ce dernier.

package com.mycompany.app;

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobClientBuilder;
import com.microsoft.azure.sdk.iot.deps.serializer.FileUploadCompletionNotification;
import com.microsoft.azure.sdk.iot.deps.serializer.FileUploadSasUriRequest;
import com.microsoft.azure.sdk.iot.deps.serializer.FileUploadSasUriResponse;
import com.microsoft.azure.sdk.iot.device.DeviceClient;
import com.microsoft.azure.sdk.iot.device.IotHubClientProtocol;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Scanner;

public class App 
{
    /**
     * Upload a single file to blobs using IoT Hub.
     *
     */
    public static void main(String[] args)throws IOException, URISyntaxException
    {
        String connString = "Your device connection string here";
        String fullFileName = "Path of the file to upload";

        System.out.println("Starting...");
        System.out.println("Beginning setup.");

        // File upload will always use HTTPS, DeviceClient will use this protocol only
        //   for the other services like Telemetry, Device Method and Device Twin.
        IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;

        System.out.println("Successfully read input parameters.");

        DeviceClient client = new DeviceClient(connString, protocol);

        System.out.println("Successfully created an IoT Hub client.");

        try
        {
            File file = new File(fullFileName);
            if (file.isDirectory())
            {
                throw new IllegalArgumentException(fullFileName + " is a directory, please provide a single file name, or use the FileUploadSample to upload directories.");
            }

            System.out.println("Retrieving SAS URI from IoT Hub...");
            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());

            System.out.println("Using the Azure Storage SDK to upload file to Azure Storage...");

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

                blobClient.uploadFromFile(fullFileName);
            }
            catch (Exception e)
            {
                System.out.println("Exception encountered while uploading file to blob: " + e.getMessage());

                System.out.println("Failed to upload file to Azure Storage.");

                System.out.println("Notifying IoT Hub that the SAS URI can be freed and that the file upload failed.");

                // Note that this is done even when the file upload fails. IoT Hub has a fixed number of SAS URIs allowed active
                // at any given time. Once you are done with the file upload, you should free your SAS URI so that other
                // SAS URIs can be generated. If a SAS URI is not freed through this API, then it will free itself eventually
                // based on how long SAS URIs are configured to live on your IoT Hub.
                FileUploadCompletionNotification completionNotification = new FileUploadCompletionNotification(sasUriResponse.getCorrelationId(), false);
                client.completeFileUpload(completionNotification);

                System.out.println("Notified IoT Hub that the SAS URI can be freed and that the file upload was a failure.");

                client.closeNow();
                return;
            }

            System.out.println("Successfully uploaded file to Azure Storage.");

            System.out.println("Notifying IoT Hub that the SAS URI can be freed and that the file upload was a success.");
            FileUploadCompletionNotification completionNotification = new FileUploadCompletionNotification(sasUriResponse.getCorrelationId(), true);
            client.completeFileUpload(completionNotification);
            System.out.println("Successfully notified IoT Hub that the SAS URI can be freed, and that the file upload was a success");
        }
        catch (Exception e)
        {
            System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \nERROR: " +  e.getMessage());
            System.out.println("Shutting down...");
            client.closeNow();
        }

        System.out.println("Press any key to exit...");

        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();
        System.out.println("Shutting down...");
        client.closeNow();
    }
}

Génération et exécution de l’application

Dans une invite de commandes, exécutez la commande suivante dans le dossier my-app :

mvn clean package -DskipTests

Une fois la génération terminée, exécutez la commande suivante pour exécuter l’application :

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

Vous pouvez utiliser le portail pour afficher le fichier chargé dans le conteneur de stockage que vous avez configuré :

Capture d’écran montrant un fichier qui a été chargé dans votre conteneur de stockage.

Recevoir une notification de téléchargement de fichier

Dans cette section, vous allez créer une application console Java qui reçoit des messages de notification de chargement de fichiers envoyés par IoT Hub.

  1. Créez un répertoire pour votre projet et démarrez un interpréteur de commandes dans ce répertoire. Sur la ligne de commande, exécutez la commande suivante :

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Dans votre invite de commandes, accédez au nouveau dossier my-app.

  3. À l’aide d’un éditeur de texte, remplacez le fichier pom.xml dans le dossier my-app par ce qui suit. L’ajout de la dépendance de client de service vous permet d’utiliser le package iothub-java-service-client dans votre application pour communiquer avec votre service IoT Hub :

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <name>my-app</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <dependencies>
          <dependency>
          <groupId>com.microsoft.azure.sdk.iot</groupId>
          <artifactId>iot-device-client</artifactId>
          <version>1.30.1</version>
        </dependency>
        <dependency>
          <groupId>com.microsoft.azure.sdk.iot</groupId>
          <artifactId>iot-service-client</artifactId>
          <version>1.7.23</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.29</version>
        </dependency>    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                  <source>1.7</source>
                  <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
              <artifactId>maven-shade-plugin</artifactId>
              <version>2.4</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <goals>
                        <goal>shade</goal>
                      </goals>
                      <configuration>
                          <filters>
                              <filter>
                                  <artifact>*:*</artifact>
                                  <excludes>
                                      <exclude>META-INF/*.SF</exclude>
                                      <exclude>META-INF/*.RSA</exclude>
                                  </excludes>
                              </filter>
                          </filters>
                          <shadedArtifactAttached>true</shadedArtifactAttached>
                          <shadedClassifierName>with-deps</shadedClassifierName>
                      </configuration>
                  </execution>
              </executions>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    Notes

    Vous pouvez rechercher la dernière version de iot-service-client avec la recherche Maven.

  4. Enregistrez et fermez le fichier pom.xml.

  5. Obtenez la chaîne de connexion du service IoT Hub.

    Pour obtenir la chaîne de connexion IoT Hub pour la stratégie service, procédez comme suit :

    1. Dans le portail Azure, sélectionnez Groupes de ressources. Sélectionnez le groupe de ressources dans lequel se trouve votre hub, puis sélectionnez votre hub dans la liste des ressources.

    2. Dans le volet de gauche de votre IoT Hub, sélectionnez Stratégies d’accès partagé.

    3. Dans la liste des stratégies, sélectionnez la stratégie service.

    4. Copiez la Chaîne de connexion principale, puis enregistrez la valeur.

    Capture d’écran qui montre comment récupérer la chaîne de connexion de votre IoT Hub dans le portail Azure.

    Pour plus d’informations sur les autorisations et les stratégies d’accès partagé IoT Hub, consultez Contrôle d’accès et autorisations.

  6. À l’aide d’un éditeur de texte, ouvrez le fichier my-app\src\main\java\com\mycompany\app\App.java et remplacez le code par ce qui suit.

    package com.mycompany.app;
    
    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;
    
    
    public class App 
    {
        private static final String connectionString = "{Your service connection string here}";
        private static final IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
    
        public static void main(String[] args) throws Exception
        {
            ServiceClient sc = ServiceClient.createFromConnectionString(connectionString, protocol);
    
            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");
            }
    
            receiver.close();
        }
    
    }
    
  7. Enregistrez et fermez le fichier my-app\src\main\java\com\mycompany\app\App.java.

  8. Utilisez la commande suivante pour générer l’application et vérifier l’absence d’erreurs :

    mvn clean package -DskipTests
    

Exécution de l'application

Vous êtes maintenant prêt à exécuter l’application.

Dans une invite de commandes, exécutez la commande suivante dans le dossier my-app :

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

La capture d’écran suivante montre la sortie de l’application read-file-upload-notification :

Sortie de l’application read-file-upload-notification

Étapes suivantes

Dans cet article, vous avez appris à utiliser les fonctionnalités de téléchargement de fichier d’IoT Hub pour simplifier les chargements de fichiers à partir d’appareils. Vous pouvez approfondir cette fonctionnalité en lisant les articles suivants :

Pour explorer davantage les capacités de IoT Hub, consultez :