Dela via


Ladda upp filer från enheten till molnet med Azure IoT Hub (Java)

Den här artikeln visar hur du laddar upp filer i IoT Hub och laddar upp en fil till Azure Blob Storage med hjälp av Java.

I artiklarna Skicka telemetri från en enhet till en IoT Hub-snabbstart och Skicka meddelanden från moln till enhet med IoT Hub visas de grundläggande funktionerna för meddelanden från enhet till moln och från moln till enhet i IoT Hub. Självstudien Konfigurera meddelanderoutning med IoT Hub visar ett sätt att på ett tillförlitligt sätt lagra meddelanden från enhet till moln i Azure Blob Storage. I vissa scenarier kan du dock inte enkelt mappa de data som dina enheter skickar till de relativt små enhets-till-moln-meddelanden som IoT Hub accepterar. Till exempel:

  • Videoklipp
  • Stora filer som innehåller bilder
  • Vibrationsdata samplas med hög frekvens
  • Någon form av förbearbetade data.

Dessa filer bearbetas vanligtvis i molnet med hjälp av verktyg som Azure Data Factory eller Hadoop-stacken. När du behöver ladda upp filer från en enhet kan du fortfarande använda IoT Hubs säkerhet och tillförlitlighet. Den här artikeln visar hur. Visa två exempel från azure-iot-sdk-java i GitHub.

Kommentar

IoT Hub stöder många enhetsplattformar och språk (inklusive C, .NET och JavaScript) via Azure IoT-enhets-SDK:er. Mer information om hur du ansluter din enhet till Azure IoT Hub finns i Azure IoT Developer Center .

Viktigt!

Filuppladdningsfunktioner på enheter som använder X.509-certifikatutfärdarautentisering (CA) är i offentlig förhandsversion och förhandsgranskningsläget måste vara aktiverat. Det är allmänt tillgängligt på enheter som använder X.509 tumavtrycksautentisering eller X.509-certifikatattestering med Azure Device Provisioning Service. Mer information om X.509-autentisering med IoT Hub finns i X.509-certifikat som stöds.

Förutsättningar

  • En IoT-hubb. Skapa en med CLI eller Azure-portalen.

  • En enhet som är registrerad i din IoT-hubb. Om du inte har en enhet i din IoT-hubb följer du stegen i Registrera en enhet.

  • Java SE Development Kit 8. Se till att du väljer Java 8 under Långsiktigt stöd för att komma till nedladdningar för JDK 8.

  • Maven 3

  • Port 8883 bör vara öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar via port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).

Associera ett Azure Storage-konto med IoT Hub

Om du vill ladda upp filer från en enhet måste du ha ett Azure Storage-konto och en Azure Blob Storage-container som är associerad med din IoT-hubb. När du har associerat lagringskontot och containern med din IoT-hubb kan din IoT-hubb tillhandahålla elementen i en SAS-URI när en enhet begär det. Enheten kan sedan använda dessa element för att konstruera den SAS-URI som den använder för att autentisera med Azure Storage och ladda upp filer till blobcontainern.

Så här associerar du ett Azure Storage-konto med din IoT-hubb:

  1. Under Hubbinställningar väljer du Filuppladdning i den vänstra rutan i din IoT-hubb.

    Skärmbild som visar välj inställningar för filuppladdning från portalen.

  2. I fönstret Filuppladdning väljer du Azure Storage Container. I den här artikeln rekommenderar vi att ditt lagringskonto och IoT Hub finns i samma region.

    • Om du redan har ett lagringskonto som du vill använda väljer du det i listan.

    • Om du vill skapa ett nytt lagringskonto väljer du +Lagringskonto. Ange ett namn för lagringskontot och kontrollera att platsen är inställd på samma region som din IoT-hubb och välj sedan OK. Det nya kontot skapas i samma resursgrupp som din IoT-hubb. När distributionen är klar väljer du lagringskontot i listan.

    När du har valt lagringskontot öppnas fönstret Containrar .

  3. I fönstret Containrar väljer du blobcontainern.

    • Om du redan har en blobcontainer som du vill använda väljer du den i listan och klickar på Välj.

    • Om du vill skapa en ny blobcontainer väljer du + Container. Ange ett namn för den nya containern. I den här artikeln kan du lämna alla andra fält som standard. Välj Skapa. När distributionen är klar väljer du containern i listan och klickar på Välj.

  4. Gå tillbaka till fönstret Filuppladdning och se till att filmeddelanden är inställda på På. Du kan lämna alla andra inställningar som standard. Välj Spara och vänta tills inställningarna har slutförts innan du går vidare till nästa avsnitt.

    Skärmbild som visar inställningarna för bekräftad filuppladdning i portalen.

Mer detaljerade anvisningar om hur du skapar ett Azure Storage-konto finns i Skapa ett lagringskonto. Mer detaljerade anvisningar om hur du associerar ett lagringskonto och en blobcontainer med en IoT-hubb finns i Konfigurera filuppladdningar med Hjälp av Azure-portalen.

Skapa ett projekt med Maven

Skapa en katalog för projektet och starta ett gränssnitt i katalogen. Kör följande på kommandoraden

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

Detta genererar en katalog med samma namn som artifactId och en standardprojektstruktur:

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

Ersätt pom.xml-filen med följande med hjälp av en textredigerare:


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

Ladda upp en fil från en enhetsapp

Kopiera filen som du vill ladda upp till my-app mappen i projektträdet. Ersätt App.java med följande kod med hjälp av en textredigerare. Ange enhetens niska veze och filnamn där det anges. Du kopierade enheten niska veze när du registrerade enheten.

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

Skapa och kör appen

Kör följande kommando i en kommandotolk i my-app mappen:

mvn clean package -DskipTests

När bygget är klart kör du följande kommando för att köra programmet:

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

Du kan använda portalen för att visa den uppladdade filen i lagringscontainern som du konfigurerade:

Skärmbild som visar en fil som har laddats upp till lagringscontainern.

Ta emot ett meddelande om filuppladdning

I det här avsnittet skapar du en Java-konsolapp som tar emot meddelanden om filuppladdning från IoT Hub.

  1. Skapa en katalog för projektet och starta ett gränssnitt i katalogen. Kör följande på kommandoraden

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Gå till den nya my-app mappen i kommandotolken.

  3. Ersätt filen i my-app mappen med följande med hjälp av en textredigerarepom.xml. Genom att lägga till tjänstklientberoendet kan du använda iothub-java-service-client-paketet i ditt program för att kommunicera med din IoT Hub-tjänst:

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

    Kommentar

    Du kan söka efter den senaste versionen av iot-service-client med Maven-sökning.

  4. Spara och stäng pom.xml filen.

  5. Hämta IoT Hub-tjänsten niska veze.

    Följ dessa steg för att hämta IoT Hub-niska veze för tjänstprincipen:

    1. I Azure-portalen väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

    2. Välj Principer för delad åtkomst i den vänstra rutan i din IoT-hubb.

    3. I listan över principer väljer du tjänstprincipen.

    4. Kopiera den primära niska veze och spara värdet.

    Skärmbild som visar hur du hämtar niska veze från din IoT Hub i Azure-portalen.

    Mer information om principer och behörigheter för delad åtkomst i IoT Hub finns i Åtkomstkontroll och behörigheter.

  6. Öppna filen med hjälp av en textredigerare my-app\src\main\java\com\mycompany\app\App.java och ersätt koden med följande.

    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. Spara och stäng my-app\src\main\java\com\mycompany\app\App.java filen.

  8. Använd följande kommando för att skapa appen och söka efter fel:

    mvn clean package -DskipTests
    

Kör appen

Nu är du redo att köra programmet.

Kör följande kommando i en kommandotolk i my-app mappen:

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

Följande skärmbild visar utdata från appen read-file-upload-notification :

Utdata från appen read-file-upload-notification

Nästa steg

I den här artikeln har du lärt dig hur du använder filuppladdningsfunktionen i IoT Hub för att förenkla filuppladdningar från enheter. Du kan fortsätta att utforska den här funktionen med följande artiklar:

Mer information om funktionerna i IoT Hub finns i: