Sdílet prostřednictvím


Nahrání souborů ze zařízení do cloudu pomocí Azure IoT Hubu (Java)

Tento článek ukazuje, jak pomocí Javy nahrát možnosti nahrávání souborů služby IoT Hub do úložiště objektů blob v Azure.

Rychlé zprovoznění odesílání telemetrických dat ze zařízení do centra IoT a odesílání zpráv typu cloud-zařízení pomocí služby IoT Hub ukazují základní funkce zasílání zpráv typu zařízení-cloud a cloud-zařízení ve službě IoT Hub. Kurz Konfigurace směrování zpráv se službou IoT Hub ukazuje způsob spolehlivého ukládání zpráv typu zařízení-cloud ve službě Azure Blob Storage. V některých scénářích ale nemůžete snadno namapovat data, která zařízení odesílají, do relativně malých zpráv typu zařízení-cloud, které IoT Hub přijímá. Příklad:

  • Videa
  • Velké soubory obsahující obrázky
  • Data kmitání vzorkovaná ve vysoké frekvenci
  • Nějaká forma předzpracovaných dat

Tyto soubory se obvykle dávkově zpracovávají v cloudu pomocí nástrojů, jako je Azure Data Factory nebo stack Hadoop . Pokud potřebujete nahrát soubory ze zařízení, můžete dál používat zabezpečení a spolehlivost ioT Hubu. V tomto článku se dozvíte, jak na to. Prohlédněte si dvě ukázky z azure-iot-sdk-java na GitHubu.

Poznámka:

IoT Hub podporuje mnoho platforem a jazyků zařízení (včetně C, .NET a JavaScriptu) prostřednictvím sad SDK pro zařízení Azure IoT. Informace o připojení zařízení k Azure IoT Hubu najdete v Centru pro vývojáře Azure IoT.

Důležité

Funkce nahrávání souborů na zařízeních, která používají ověřování certifikační autority (CA) X.509, je ve verzi Public Preview a musí být povolený režim náhledu. Je obecně dostupná na zařízeních, která používají ověřování kryptografického otisku X.509 nebo ověření identity certifikátu X.509 se službou Azure Device Provisioning. Další informace o ověřování X.509 ve službě IoT Hub najdete v tématu Podporované certifikáty X.509.

Požadavky

  • IoT Hub. Vytvořte ho pomocí rozhraní příkazového řádku nebo webu Azure Portal.

  • Zařízení zaregistrované ve službě IoT Hub. Pokud ve službě IoT Hub nemáte zařízení, postupujte podle pokynů v části Registrace zařízení.

  • Java SE Development Kit 8. Ujistěte se, že v části Dlouhodobá podpora vyberete Javu 8, abyste se dostali ke stažení sady JDK 8.

  • Maven 3

  • Port 8883 by měl být otevřený v bráně firewall. Ukázka zařízení v tomto článku používá protokol MQTT, který komunikuje přes port 8883. Tento port může být blokovaný v některých podnikových a vzdělávacích síťových prostředích. Další informace a způsoby řešení tohoto problému najdete v tématu Připojení ke službě IoT Hub (MQTT).

Přidružení účtu Azure Storage ke službě IoT Hub

Pokud chcete nahrát soubory ze zařízení, musíte mít účet Azure Storage a kontejner Azure Blob Storage přidružený k vašemu centru IoT. Jakmile přidružíte účet úložiště a kontejner k centru IoT, může centrum IoT poskytnout prvky identifikátoru URI SAS při vyžádání zařízením. Zařízení pak může tyto prvky použít k vytvoření identifikátoru URI SAS, který používá k ověření ve službě Azure Storage a nahrání souborů do kontejneru objektů blob.

Přidružení účtu Azure Storage k centru IoT:

  1. V části Nastavení centra vyberte Nahrání souboru v levém podokně centra IoT.

    Snímek obrazovky zobrazující nastavení pro výběr nahrání souboru z portálu

  2. V podokně Nahrání souboru vyberte Kontejner služby Azure Storage. Pro účely tohoto článku se doporučuje, aby se váš účet úložiště a IoT Hub nacházely ve stejné oblasti.

    • Pokud už máte účet úložiště, který chcete použít, vyberte ho ze seznamu.

    • Pokud chcete vytvořit nový účet úložiště, vyberte +Storage. Zadejte název účtu úložiště a ujistěte se, že je umístění nastavené na stejnou oblast jako vaše centrum IoT, a pak vyberte OK. Nový účet se vytvoří ve stejné skupině prostředků jako vaše centrum IoT. Po dokončení nasazení vyberte ze seznamu účet úložiště.

    Po výběru účtu úložiště se otevře podokno Kontejnery .

  3. V podokně Kontejnery vyberte kontejner objektů blob.

    • Pokud už máte kontejner objektů blob, který chcete použít, vyberte ho ze seznamu a klikněte na Vybrat.

    • Pokud chcete vytvořit nový kontejner objektů blob, vyberte + Kontejner. Zadejte název nového kontejneru. Pro účely tohoto článku můžete ponechat všechna ostatní pole ve výchozím nastavení. Vyberte Vytvořit. Po dokončení nasazení vyberte v seznamu kontejner a klikněte na Vybrat.

  4. Zpět v podokně Nahrání souboru se ujistěte, že jsou oznámení souborů nastavená na Zapnuto. Všechna ostatní nastavení můžete ponechat ve výchozím nastavení. Než přejdete k další části, vyberte Uložit a počkejte na dokončení nastavení.

    Snímek obrazovky s potvrzením nastavení nahrávání souborů na portálu

Podrobnější pokyny k vytvoření účtu Azure Storage najdete v tématu Vytvoření účtu úložiště. Podrobnější pokyny k přidružení účtu úložiště a kontejneru objektů blob ke službě IoT Hub najdete v tématu Konfigurace nahrávání souborů pomocí webu Azure Portal.

Vytvoření projektu pomocí Mavenu

Vytvořte adresář pro projekt a spusťte v daném adresáři prostředí. Na příkazovém řádku spusťte následující příkaz:

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

Tím se vygeneruje adresář se stejným názvem jako artifactId a standardní struktura projektu:

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

V textovém editoru nahraďte soubor pom.xml následujícím kódem:


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

Nahrání souboru z aplikace zařízení

Zkopírujte soubor, který chcete nahrát do my-app složky ve stromu projektu. V textovém editoru nahraďte App.java následujícím kódem. Zadejte připojovací řetězec zařízení a název souboru, kde je uvedeno. Zařízení jste zkopírovali připojovací řetězec při registraci zařízení.

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

Sestavení a spuštění aplikace

Na příkazovém řádku ve my-app složce spusťte následující příkaz:

mvn clean package -DskipTests

Po dokončení sestavení spusťte aplikaci spuštěním následujícího příkazu:

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

Na portálu můžete zobrazit nahraný soubor v kontejneru úložiště, který jste nakonfigurovali:

Snímek obrazovky zobrazující soubor nahraný do kontejneru úložiště

Přijetí oznámení o nahrání souboru

V této části vytvoříte konzolovou aplikaci Java, která přijímá zprávy s oznámením o nahrání souboru ze služby IoT Hub.

  1. Vytvořte adresář pro projekt a spusťte v daném adresáři prostředí. Na příkazovém řádku spusťte následující příkaz:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Na příkazovém řádku přejděte do nové my-app složky.

  3. V textovém editoru nahraďte pom.xml soubor ve my-app složce následujícím kódem. Přidání závislosti klienta služby umožňuje používat balíček klienta iothub-java-service-client ve vaší aplikaci ke komunikaci se službou 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>
    

    Poznámka:

    Můžete vyhledat nejnovější verzi iot-service-client pomocí vyhledávání Maven.

  4. Uložte a zavřete pom.xml soubor.

  5. Získejte službu IoT Hub připojovací řetězec.

    Pokud chcete získat připojovací řetězec ioT Hubu pro zásady služby, postupujte takto:

    1. Na webu Azure Portal vyberte skupiny prostředků. Vyberte skupinu prostředků, ve které se nachází vaše centrum, a pak vyberte centrum ze seznamu prostředků.

    2. V levém podokně centra IoT vyberte zásady sdíleného přístupu.

    3. V seznamu zásad vyberte zásadu služby .

    4. Zkopírujte primární připojovací řetězec a uložte hodnotu.

    Snímek obrazovky znázorňující, jak načíst připojovací řetězec ze služby IoT Hub na webu Azure Portal

    Další informace ozásadách

  6. V textovém editoru my-app\src\main\java\com\mycompany\app\App.java otevřete soubor a nahraďte kód následujícím kódem.

    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. Uložte a zavřete my-app\src\main\java\com\mycompany\app\App.java soubor.

  8. Pomocí následujícího příkazu sestavte aplikaci a zkontrolujte chyby:

    mvn clean package -DskipTests
    

Spuštění aplikace

Teď jste připraveni spustit aplikaci.

Na příkazovém řádku ve my-app složce spusťte následující příkaz:

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

Následující snímek obrazovky ukazuje výstup z aplikace read-file-upload-notification :

Výstup z aplikace read-file-upload-notification

Další kroky

V tomto článku jste se dozvěděli, jak pomocí funkce pro nahrání souborů ve službě IoT Hub zjednodušit nahrávání souborů ze zařízení. Tuto funkci můžete dál zkoumat pomocí následujících článků:

Další informace o možnostech služby IoT Hub najdete v těchto tématech: