Share via


Bestanden uploaden van uw apparaat naar de cloud met Azure IoT Hub (Java)

In dit artikel wordt gedemonstreert hoe u mogelijkheden voor het uploaden van bestanden van IoT Hub een bestand uploadt naar Azure Blob Storage met behulp van Java.

De quickstart voor het verzenden van telemetrie van een apparaat naar een IoT Hub en cloud-naar-apparaat-berichten verzenden met IoT Hub-artikelen tonen de basisfunctionaliteit voor apparaat-naar-cloud- en cloud-naar-apparaatberichten van IoT Hub. In de zelfstudie Berichtroutering configureren met IoT Hub ziet u een manier om apparaat-naar-cloud-berichten betrouwbaar op te slaan in Azure Blob Storage. In sommige scenario's kunt u echter niet eenvoudig de gegevens toewijzen die uw apparaten verzenden naar de relatief kleine apparaat-naar-cloud-berichten die IoT Hub accepteert. Voorbeeld:

  • Video's
  • Grote bestanden die afbeeldingen bevatten
  • Voorbeeld van trillingsgegevens met hoge frequentie
  • Een vorm van vooraf verwerkte gegevens.

Deze bestanden worden doorgaans in batches verwerkt in de cloud, met behulp van hulpprogramma's zoals Azure Data Factory of de Hadoop-stack . Wanneer u bestanden van een apparaat wilt uploaden, kunt u nog steeds de beveiliging en betrouwbaarheid van IoT Hub gebruiken. In dit artikel wordt uitgelegd hoe u dit doet. Bekijk twee voorbeelden van azure-iot-sdk-java in GitHub.

Notitie

IoT Hub ondersteunt veel apparaatplatformen en -talen (waaronder C, .NET en JavaScript) via Azure IoT-apparaat-SDK's. Raadpleeg het Azure IoT Developer Center voor meer informatie over het verbinden van uw apparaat met Azure IoT Hub.

Belangrijk

De functionaliteit voor het uploaden van bestanden op apparaten die X.509-verificatie (CA) gebruiken, is in openbare preview en de preview-modus moet zijn ingeschakeld. Het is algemeen beschikbaar op apparaten die gebruikmaken van X.509-vingerafdrukverificatie of X.509-certificaatattestation met Azure Device Provisioning Service. Zie Ondersteunde X.509-certificaten voor meer informatie over X.509-verificatie met IoT Hub.

Vereisten

  • Een IoT-hub. Maak er een met de CLI of Azure Portal.

  • Een geregistreerd apparaat. Registreer er een in Azure Portal.

  • Java SE Development Kit 8. Zorg ervoor dat u Java 8 selecteert onder Langetermijnondersteuning om naar downloads voor JDK 8 te gaan.

  • Maven 3

  • Poort 8883 moet zijn geopend in uw firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat via poort 8883 communiceert. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.

Een Azure Storage-account koppelen aan IoT Hub

Als u bestanden vanaf een apparaat wilt uploaden, moet u een Azure Storage-account en een Azure Blob Storage-container hebben die is gekoppeld aan uw IoT-hub. Zodra u het opslagaccount en de container aan uw IoT-hub hebt gekoppeld, kan uw IoT-hub de elementen van een SAS-URI opgeven wanneer dit door een apparaat wordt aangevraagd. Het apparaat kan deze elementen vervolgens gebruiken om de SAS-URI te maken die wordt gebruikt om te verifiëren met Azure Storage en bestanden te uploaden naar de blobcontainer.

Een Azure Storage-account koppelen aan uw IoT-hub:

  1. Selecteer onder Hub-instellingen het uploaden van bestanden in het linkerdeelvenster van uw IoT-hub.

    Schermopname met de instellingen voor het uploaden van bestanden in de portal.

  2. Selecteer Azure Storage-container in het deelvenster Bestand uploaden. Voor dit artikel wordt aanbevolen dat uw opslagaccount en IoT Hub zich in dezelfde regio bevinden.

    • Als u al een opslagaccount hebt dat u wilt gebruiken, selecteert u dit in de lijst.

    • Als u een nieuw opslagaccount wilt maken, selecteert u +Storage-account. Geef een naam op voor het opslagaccount en zorg ervoor dat de locatie is ingesteld op dezelfde regio als uw IoT-hub en selecteer VERVOLGENS OK. Het nieuwe account wordt gemaakt in dezelfde resourcegroep als uw IoT-hub. Wanneer de implementatie is voltooid, selecteert u het opslagaccount in de lijst.

    Nadat u het opslagaccount hebt geselecteerd, wordt het deelvenster Containers geopend.

  3. Selecteer in het deelvenster Containers de blobcontainer.

    • Als u al een blobcontainer hebt die u wilt gebruiken, selecteert u deze in de lijst en klikt u op Selecteren.

    • Als u een nieuwe blobcontainer wilt maken, selecteert u + Container. Geef een naam op voor de nieuwe container. Voor de doeleinden van dit artikel kunt u alle andere velden op hun standaardwaarde laten staan. Selecteer Maken. Wanneer de implementatie is voltooid, selecteert u de container in de lijst en klikt u op Selecteren.

  4. Controleer of bestandsmeldingen zijn ingesteld op Aan in het deelvenster Bestand uploaden. U kunt alle andere instellingen op de standaardinstellingen laten staan. Selecteer Opslaan en wacht totdat de instellingen zijn voltooid voordat u verdergaat met de volgende sectie.

    Schermopname met instellingen voor het uploaden van bestanden bevestigen in de portal.

Zie Een opslagaccount maken voor gedetailleerdere instructies voor het maken van een Azure Storage-account. Zie Bestandsuploads configureren met behulp van Azure Portal voor gedetailleerde instructies over het koppelen van een opslagaccount en blobcontainer aan een IoT-hub.

Een project maken met Maven

Maak een map voor uw project en start een shell in die map. Voer op de opdrachtregel het volgende uit

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

Hiermee wordt een map gegenereerd met dezelfde naam als de artifactId en een standaardprojectstructuur:

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

Vervang met behulp van een teksteditor het pom.xml bestand door het volgende:


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

Een bestand uploaden vanuit een apparaat-app

Kopieer het bestand dat u wilt uploaden naar de map in de my-app projectstructuur. Vervang App.java door de volgende code met behulp van een teksteditor. Geef waar vermeld uw apparaat verbindingsreeks en bestandsnaam op. U hebt het apparaat gekopieerd verbindingsreeks toen u het apparaat registreerde.

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

De toepassing bouwen en uitvoeren.

Voer bij een opdrachtprompt in de my-app map de volgende opdracht uit:

mvn clean package -DskipTests

Wanneer de build is voltooid, voert u de volgende opdracht uit om de toepassing uit te voeren:

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

U kunt de portal gebruiken om het geüploade bestand weer te geven in de opslagcontainer die u hebt geconfigureerd:

Schermopname van een bestand dat is geüpload naar uw opslagcontainer.

Een melding voor het uploaden van bestanden ontvangen

In deze sectie maakt u een Java-console-app die meldingsberichten over het uploaden van bestanden van IoT Hub ontvangt.

  1. Maak een map voor uw project en start een shell in die map. Voer op de opdrachtregel het volgende uit

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Navigeer in de opdrachtprompt naar de nieuwe my-app map.

  3. Vervang met behulp van een teksteditor het pom.xml bestand in de my-app map door het volgende. Door de afhankelijkheid van de serviceclient toe te voegen, kunt u het iothub-java-service-clientpakket in uw toepassing gebruiken om te communiceren met uw IoT Hub-service:

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

    Notitie

    U vindt de meest recente versie van iot-service-client met Maven zoeken.

  4. Sla het bestand pom.xml op en sluit het vervolgens.

  5. Haal de IoT Hub-service op verbindingsreeks.

    Voer de volgende stappen uit om de IoT Hub-verbindingsreeks voor het servicebeleid op te halen:

    1. Selecteer resourcegroepen in de Azure-portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

    2. Selecteer in het linkerdeelvenster van uw IoT-hub beleid voor gedeelde toegang.

    3. Selecteer het servicebeleid in de lijst met beleidsregels.

    4. Kopieer de primaire verbindingsreeks en sla de waarde op.

    Schermopname die laat zien hoe u de verbindingsreeks ophaalt uit uw IoT Hub in Azure Portal.

    Zie Toegangsbeheer en machtigingen voor meer informatie over beleid en machtigingen voor gedeelde toegang van IoT Hub.

  6. Open het my-app\src\main\java\com\mycompany\app\App.java bestand met een teksteditor en vervang de code door het volgende.

    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. Sla het bestand my-app\src\main\java\com\mycompany\app\App.java op en sluit het vervolgens.

  8. Gebruik de volgende opdracht om de app te bouwen en te controleren op fouten:

    mvn clean package -DskipTests
    

De toepassing uitvoeren

Nu bent u klaar om de toepassing uit te voeren.

Voer bij een opdrachtprompt in de my-app map de volgende opdracht uit:

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

In de volgende schermopname ziet u de uitvoer van de app read-file-upload-notification :

Uitvoer van de app read-file-upload-notification

Volgende stappen

In dit artikel hebt u geleerd hoe u de functie voor het uploaden van bestanden van IoT Hub gebruikt om het uploaden van bestanden vanaf apparaten te vereenvoudigen. U kunt deze functie blijven verkennen met de volgende artikelen:

Zie voor meer informatie over de mogelijkheden van IoT Hub: