Hochladen von Dateien von Ihrem Gerät in die Cloud mit Azure IoT Hub (Java)

In diesem Artikel wird gezeigt, wie eine Datei mithilfe der Dateiuploadfunktionen von IoT Hub mit Java in Azure Blob Storage hochgeladen wird.

Die Schnellstartartikel enden von Telemetriedaten von einem Gerät an einen IoT Hub und Senden von Cloud-zu-Gerät-Nachrichten mit IoT Hub zeigen die grundlegende Gerät-zu-Cloud- und Cloud-zu-Gerät-Funktionalität von IoT Hub. Im Tutorial Konfigurieren der Nachrichtenweiterleitung mit IoT Hub wird eine Möglichkeit für das zuverlässige Speichern von Gerät-zu-Cloud-Nachrichten in Azure Blob Storage gezeigt. In einigen Szenarien können Sie jedoch nicht einfach die von Ihren Geräten gesendeten Daten den relativ kleinen Gerät-zu-Cloud-Nachrichten zuordnen, die IoT Hub akzeptiert. Beispiel:

  • Videos
  • Große Dateien, die Bilder enthalten
  • Vibrationsdaten, die mit hoher Häufigkeit als Stichproben erfasst werden
  • Eine Form vorverarbeiteter Daten.

Diese Dateien werden normalerweise als Batch in der Cloud mit Tools wie Azure Data Factory oder dem Hadoop-Stapel verarbeitet. Wenn Sie Dateien von einem Gerät hochladen müssen, können Sie weiterhin die Sicherheit und Zuverlässigkeit des IoT Hub nutzen. In diesem Artikel erfahren Sie, welche Schritte erforderlich sind. Sehen Sie sich zwei Beispiele aus azure-iot-sdk-java in GitHub an.

Hinweis

IoT Hub bietet über Azure IoT-Geräte-SDKs Unterstützung für zahlreiche Geräteplattformen und Sprachen (u. a. C, .NET und JavaScript). Im Azure IoT Developer Center finden Sie Informationen zum Herstellen einer Verbindung Ihres Geräts mit Azure IoT Hub.

Wichtig

Die Funktion zum Hochladen von Dateien auf Geräten, die die Authentifizierung der X.509-Zertifizierungsstelle verwenden, befindet sich in der öffentlichen Vorschau, und der Vorschaumodus muss aktiviert werden. Sie ist allgemein verfügbar auf Geräten, die die Authentifizierung per X.509-Fingerabdruck oder den X.509-Zertifikatnachweis mit dem Azure Device Provisioning Service verwenden. Weitere Informationen zur X.509-Authentifizierung mit IoT Hub finden Sie unter Unterstützte X.509-Zertifikate.

Voraussetzungen

  • Einen IoT Hub. Erstellen Sie einen mit der CLI oder dem Azure-Portal.

  • Ein registriertes Gerät. Registrieren Sie eins im Azure-Portal.

  • Java SE Development Kit 8 Wählen Sie unter Langfristiger Support unbedingt Java 8 aus, um zu den Downloads für JDK 8 zu gelangen.

  • Maven 3

  • Der Port 8883 muss in Ihrer Firewall geöffnet sein. Das Beispielgerät in diesem Artikel verwendet das MQTT-Protokoll, das über Port 8883 kommuniziert. In einigen Netzwerkumgebungen von Unternehmen oder Bildungseinrichtungen ist dieser Port unter Umständen blockiert. Weitere Informationen und Problemumgehungen finden Sie unter Herstellen einer Verbindung mit IoT Hub (MQTT).

Zuweisen eines Azure Storage-Kontos zu IoT Hub

Wenn Sie Dateien von einem Gerät hochladen möchten, müssen Sie ein Azure Storage-Konto und einen Azure Blob Storage-Container haben, die Ihrem IoT-Hub zugeordnet wurden. Sobald Sie das Speicherkonto und den Container Ihrem IoT-Hub zugeordnet haben, kann der IoT-Hub die Elemente eines SAS-URI bereitstellen, wenn sie von einem Gerät angefordert werden. Das Gerät kann dann mithilfe dieser Elemente den SAS-URI erstellen, den es zum Authentifizieren bei Azure Storage und zum Hochladen von Dateien in den Blobcontainer verwendet.

So ordnen Sie Ihrem IoT-Hub ein Azure Storage-Konto zu:

  1. Wählen Sie im linken Bereich des IoT-Hubs unter Hubeinstellungen die Option Dateiupload aus.

    Screenshot: Auswahl von Einstellungen für den Dateiupload im Portal

  2. Wählen Sie im Bereich Dateiupload die Option Azure Storage-Container aus. Für diesen Artikel wird empfohlen, dass sich Ihr Speicherkonto und IoT Hub in derselben Region befinden.

    • Wenn Sie bereits ein Speicherkonto haben, das Sie nutzen möchten, wählen Sie es in der Liste aus.

    • Wählen Sie zum Erstellen eines neuen Speicherkontos + Speicherkonto aus. Geben Sie einen Namen für das Speicherkonto an, und stellen Sie sicher, dass Speicherort auf dieselbe Region wie Ihr IoT-Hub festgelegt wird. Wählen Sie dann OK aus. Das neue Konto wird in derselben Ressourcengruppe wie Ihr IoT-Hub erstellt. Wählen Sie nach Abschluss der Bereitstellung das Speicherkonto in der Liste aus.

    Nachdem Sie das Speicherkonto ausgewählt haben, wird der Bereich Container geöffnet.

  3. Wählen Sie im Bereich Container den Blobcontainer aus.

    • Wenn Sie bereits einen Blobcontainer haben, den Sie nutzen möchten, wählen Sie ihn in der Liste aus, und klicken Sie auf Auswählen.

    • Wählen Sie dann + Container aus, um einen neuen Blobcontainer zu erstellen. Geben Sie einen Namen für den neuen Container an. Für die Zwecke dieses Artikels können Sie bei allen anderen Feldern die Standardwerte beibehalten. Klicken Sie auf Erstellen. Wählen Sie nach Abschluss der Bereitstellung den Container in der Liste aus, und klicken Sie auf Auswählen.

  4. Vergewissern Sie sich im Bereich Dateiupload, dass für Dateibenachrichtigungen On (Aktiviert) festgelegt wurde. Bei allen anderen Einstellungen können Sie die Standardwerte beibehalten. Wählen Sie Speichern aus, und warten Sie, bis die Einstellungen abgeschlossen sind, bevor Sie mit dem nächsten Abschnitt weitermachen.

    Screenshot: Einstellungen zum Bestätigen des Dateiuploads im Portal

Ausführlichere Anleitungen zum Erstellen eines Azure Storage-Kontos finden Sie unter Erstellen eines Speicherkontos. Ausführlichere Anleitungen zum Zuordnen eines Speicherkontos und Blobcontainers zu einem IoT-Hub finden Sie unter Konfigurieren des Dateiuploads im Azure-Portal.

Erstellen eines Projekts mithilfe von Maven

Erstellen Sie ein Verzeichnis für Ihr Projekt, und starten Sie eine Shell in diesem Verzeichnis. Führen Sie in der Befehlszeile Folgendes aus:

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

Dadurch wird ein Verzeichnis mit einer Standardprojektstruktur und der Artefakt-ID (artifactId) als Name generiert:

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

Ersetzen Sie mithilfe eines Text-Editors die Datei „pom.xml“ durch Folgendes:


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

Hochladen einer Datei von einer Geräte-App

Kopieren Sie die Datei, die Sie hochladen möchten, in den Ordner my-app in Ihrer Projektstruktur. Ersetzen Sie mithilfe eines Text-Editors „App.java“ durch den folgenden Code. Geben Sie an den entsprechend gekennzeichneten Stellen die Verbindungszeichenfolge für Ihr Gerät und den Dateinamen an. Sie haben die Geräteverbindungszeichenfolge beim Registrieren des Geräts kopiert.

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

Erstellen und Ausführen der Anwendung

Führen Sie an der Eingabeaufforderung im my-app-Ordner folgenden Befehl aus:

mvn clean package -DskipTests

Verwenden Sie nach Abschluss des Buildvorgangs den folgenden Befehl, um die Anwendung auszuführen:

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

Sie können das Verwaltungsportal verwenden, um die hochgeladene Datei im Speichercontainer anzuzeigen, den Sie konfiguriert haben:

Screenshot zeigt eine Datei, die in Ihren Speichercontainer hochgeladen wurde.

Erhalten einer Benachrichtigung zum Dateiupload

In diesem Abschnitt erstellen Sie eine Java-Konsolen-App, die Uploadbenachrichtigungen von IoT Hub empfängt.

  1. Erstellen Sie ein Verzeichnis für Ihr Projekt, und starten Sie eine Shell in diesem Verzeichnis. Führen Sie in der Befehlszeile Folgendes aus:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Navigieren Sie an der Eingabeaufforderung zum neuen my-app-Ordner.

  3. Ersetzen Sie mithilfe eines Text-Editors die Datei pom.xml im Ordner my-app durch Folgendes. Durch Hinzufügen der Dienstclientabhängigkeit können Sie in Ihrer Anwendung das Paket iothub-java-service-client verwenden, um mit Ihrem IoT Hub-Dienst zu kommunizieren:

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

    Hinweis

    Sie finden die aktuelle Version von iot-service-client mithilfe der Maven-Suche.

  4. Speichern und schließen Sie die pom.xml-Datei.

  5. Rufen Sie die IoT Hub-Dienstverbindungszeichenfolge ab.

    Führen Sie zum Abrufen der IoT-Hub-Verbindungszeichenfolge für die Richtlinie service die folgenden Schritte aus:

    1. Wählen Sie im Azure-Portal die Option Ressourcengruppen aus. Wählen Sie die Ressourcengruppe aus, in der sich der Hub befindet, und wählen Sie dann in der Liste der Ressourcen Ihren Hub aus.

    2. Wählen Sie im linken Bereich Ihres IoT-Hubs Freigegebene Zugriffsrichtlinien aus.

    3. Wählen Sie in der Liste der Richtlinien die Richtlinie service aus.

    4. Kopieren Sie die primäre Verbindungszeichenfolge und speichern Sie den Wert.

    Screenshot, der das Abrufen der Verbindungszeichenfolge von Ihrem IoT Hub im Azure-Portal zeigt.

    Weitere Informationen zu SAS-Richtlinien und Berechtigungen für IoT-Hubs finden Sie unter Access Control und Berechtigungen.

  6. Öffnen Sie die Datei my-app\src\main\java\com\mycompany\app\App.java mithilfe eines Text-Editors, und ersetzen Sie den Code durch Folgendes:

    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. Speichere und schließe die Datei my-app\src\main\java\com\mycompany\app\App.java.

  8. Verwenden Sie den folgenden Befehl zum Erstellen der App, und prüfen Sie, ob Fehler vorliegen:

    mvn clean package -DskipTests
    

Ausführen der Anwendung

Jetzt können Sie die Anwendung ausführen.

Führen Sie an der Eingabeaufforderung im my-app-Ordner folgenden Befehl aus:

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

Der folgende Screenshot zeigt die Ausgabe der read-file-upload-notification-App:

Ausgabe der read-file-upload-notification-App

Nächste Schritte

In diesem Artikel haben Sie gelernt, wie Sie das IoT Hub-Feature zum Hochladen von Dateien nutzen, um Dateiuploads von Geräten zu vereinfachen. In den folgenden Artikeln können Sie mehr zu diesem Feature erfahren:

Weitere Informationen zu den Funktionen von IoT Hub finden Sie unter: