Bagikan melalui


Mengunggah file dari perangkat Anda ke cloud dengan Azure IoT Hub (Java)

Artikel ini menunjukkan cara menggunakan kemampuan pengunggahan file IoT Hub untuk mengunggah file ke penyimpanan blob Azure, menggunakan Java.

Mulai cepat Mengirim telemetri dari perangkat ke hub IoT dan artikel Mengirim pesan cloud-ke-perangkat dengan IoT Hub menunjukkan fungsionalitas dasar olahpesan perangkat-ke-cloud dan cloud-ke-perangkat IoT Hub. Tutorial Mengonfigurasi perutean pesan dengan IoT Hub menunjukkan cara untuk menyimpan pesan perangkat ke cloud secara andal di penyimpanan blob Azure. Namun, dalam beberapa skenario Anda tidak dapat dengan mudah memetakan data yang dikirim perangkat Anda ke pesan perangkat ke cloud yang relatif kecil yang diterima IoT Hub. Contohnya:

  • Video
  • File besar yang berisi gambar
  • Data getaran yang diambil sampelnya pada frekuensi tinggi
  • Beberapa bentuk data yang diproses sebelumnya.

File tersebut biasanya diproses secara batch di cloud menggunakan alat seperti Azure Data Factory atau tumpukan Hadoop. Saat Anda perlu mengunggah file dari perangkat, Anda masih dapat menggunakan keamanan dan keandalan IoT Hub. Artikel ini menunjukkan cara. Lihat dua sampel dari azure-iot-sdk-java di GitHub.

Catatan

IoT Hub mendukung banyak platform dan bahasa perangkat (termasuk C, .NET, dan JavaScript) melalui SDK perangkat Azure IoT. Lihat Azure IoT Developer Center untuk mempelajari cara menghubungkan perangkat Anda ke Azure IoT Hub.

Penting

Fungsionalitas pengunggahan file pada perangkat yang menggunakan autentikasi otoritas sertifikat (OS) X.509 berada dalam pratinjau publik, dan mode pratinjau harus diaktifkan. Ini umumnya tersedia di perangkat yang menggunakan autentikasi thumbprint X.509 atau pengesahan sertifikat X.509 dengan Layanan Provisi Perangkat Azure. Untuk mempelajari selengkapnya tentang autentikasi X.509 dengan IoT Hub, lihat Sertifikat X.509 yang didukung.

Prasyarat

  • Hub IoT. Membuat satu dengan CLI atau portal Azure.

  • Perangkat yang terdaftar. Daftarkan perangkat di portal Azure.

  • Java SE Development Kit 8. Pastikan Anda memilih Java 8 pada Dukungan jangka panjang untuk mengunduh JDK 8.

  • Maven 3

  • Port 8883 harus terbuka di firewall Anda. Sampel perangkat dalam artikel ini menggunakan protokol MQTT, yang berkomunikasi melalui port 8883. Port ini dapat diblokir di beberapa lingkungan jaringan perusahaan dan pendidikan. Untuk informasi selengkapnya dan cara mengatasi masalah ini, lihat Menyambungkan ke Azure IoT Hub (MQTT).

Mengaitkan akun Microsoft Azure Storage dengan IoT Hub

Untuk mengunggah file dari perangkat, Anda harus memiliki akun Azure Storage dan kontainer Azure Blob Storage yang terkait dengan hub IoT Anda. Setelah Anda mengaitkan akun penyimpanan dan kontainer dengan hub IoT, hub IoT Anda dapat menyediakan elemen URI SAS saat diminta oleh perangkat. Perangkat kemudian dapat menggunakan elemen ini untuk membangun URI SAS yang digunakan untuk melakukan autentikasi dengan Azure Storage dan mengunggah file ke kontainer blob.

Untuk mengaitkan akun Azure Storage dengan hub IoT Anda:

  1. Di bagian Pengaturan Hub, pilih Unggah file di panel kiri IoT hub Anda.

    Cuplikan layar yang menunjukkan pilih pengaturan pengunggahan file tertentu dari portal.

  2. Di panel Unggahan file, pilih Kontainer Azure Storage. Untuk artikel ini, sebaiknya akun penyimpanan dan IoT Hub Anda berada di wilayah yang sama.

    • Jika Anda sudah memiliki akun penyimpanan yang ingin digunakan, pilih dari daftar.

    • Pilih +Akun Storage untuk membuat akun penyimpanan. Masukkan nama akun penyimpanan dan pastikan Lokasi diatur ke wilayah yang sama dengan hub IoT Anda, lalu pilih OK. Akun baru dibuat dalam grup sumber daya yang sama dengan hub IoT Anda. Saat penyebaran selesai, pilih akun penyimpanan dari daftar.

    Setelah akun penyimpanan dipilih, panel Kontainer akan terbuka.

  3. Di halaman Kontainer, pilih kontainer blob.

    • Jika Anda sudah memiliki kontainer blob yang ingin digunakan, pilih dari daftar dan klik Pilih.

    • Pilih + Kontainer untuk membuat kontainer blob baru. Masukkan nama kontainer baru. Untuk tujuan artikel ini, Anda dapat membiarkan semua bidang lainnya dengan opsi default-nya. Pilih Buat. Setelah penyebaran selesai, pilih kontainer dari daftar dan klik Pilih.

  4. Kembali ke panel Unggahan file, pastikan bahwa pemberitahuan file diatur ke Aktif. Anda dapat membiarkan pengaturan lainnya dengan opsi default-nya. Pilih Simpan dan tunggu hingga pengaturan selesai sebelum berpindah ke bagian selanjutnya.

    Cuplikan layar yang menunjukkan konfirmasi pengaturan pengunggahan file di portal.

Untuk petunjuk yang lebih mendetail tentang cara membuat akun Azure Storage, lihat Membuat akun penyimpanan. Untuk petunjuk selengkapnya tentang cara mengaitkan akun penyimpanan dan kontainer blob dengan hub IoT, lihat Mengonfigurasi unggahan file menggunakan portal Azure.

Membuat proyek menggunakan Maven

Buat direktori untuk proyek Anda, dan mulai shell di direktori tersebut. Pada baris perintah, jalankan yang berikut ini

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

Ini menghasilkan direktori dengan nama yang sama dengan artifactId dan struktur proyek standar:

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

Menggunakan editor teks, ganti file pom.xml dengan yang berikut ini:


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

Mengunggah file dari aplikasi perangkat

Salin file yang ingin Anda unggah ke my-app folder di pohon proyek Anda. Menggunakan editor teks, ganti App.java dengan kode berikut. Sediakan string koneksi dan nama file Anda di tempat yang disebutkan. Anda telah menyalin string koneksi perangkat saat mendaftarkan perangkat.

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

Membangun dan menjalankan aplikasi

Pada prompt perintah di folder my-app, jalankan perintah berikut:

mvn clean package -DskipTests

Setelah pembuatan selesai, jalankan perintah berikut untuk menjalankan aplikasi:

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

Anda dapat menggunakan portal untuk menampilkan file yang diunggah di kontainer penyimpanan yang Anda konfigurasikan:

Cuplikan layar memperlihatkan file yang diunggah ke kontainer penyimpanan Anda.

Menerima pemberitahuan unggahan file

Di bagian ini, Anda membuat aplikasi konsol Java yang menerima pesan pemberitahuan unggah file dari IoT Hub.

  1. Buat direktori untuk proyek Anda, dan mulai shell di direktori tersebut. Pada baris perintah, jalankan yang berikut ini

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Pada prompt perintah Anda, navigasi ke folder my-app baru.

  3. Menggunakan editor teks, ganti pom.xml file di folder dengan yang berikut my-app ini. Menambahkan dependensi klien layanan memungkinkan Anda menggunakan paket iothub-java-service-client di aplikasi Anda untuk berkomunikasi dengan layanan hub IoT Anda:

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

    Catatan

    Anda dapat memeriksa versi terbaru iot-service-client menggunakan pencarian Maven.

  4. Simpan dan tutup pom.xml file.

  5. Dapatkan string koneksi layanan IoT Hub.

    Untuk mendapatkan string koneksi Azure IoT Hub untuk kebijakan layanan, ikuti langkah-langkah berikut:

    1. Di portal Azure, pilih Grup sumber daya. Pilih grup sumber daya tempat hub Anda berada, lalu pilih hub Anda dari daftar sumber daya.

    2. Di panel sisi kiri hub IoT Anda, pilih Kebijakan akses bersama.

    3. Dari daftar kebijakan, pilih kebijakan layanan.

    4. Salin String koneksi utama dan simpan nilainya.

    Cuplikan layar menampilkan cara mengambil string koneksi dari IoT Hub Anda di portal Azure.

    Untuk mengetahui informasi selengkapnya tentang kebijakan dan izin akses bersama IoT Hub, lihat Kontrol akses dan izin.

  6. Menggunakan editor teks, buka my-app\src\main\java\com\mycompany\app\App.java file dan ganti kode dengan yang berikut ini.

    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. Simpan dan tutup my-app\src\main\java\com\mycompany\app\App.java file.

  8. Gunakan perintah berikut untuk membuat aplikasi dan memeriksa kesalahan:

    mvn clean package -DskipTests
    

Jalankan aplikasi

Sekarang Anda siap untuk menjalankan aplikasi.

Pada prompt perintah di folder my-app, jalankan perintah berikut:

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

Tangkapan layar berikut menunjukkan output dari aplikasi read-file-upload-notification:

Output dari aplikasi read-file-upload-notification

Langkah berikutnya

Dalam artikel ini, Anda mempelajari cara menggunakan fitur pengunggahan file IoT Hub untuk menyederhanakan pengunggahan file dari perangkat. Anda dapat terus menjelajahi fitur ini dengan artikel berikut:

Untuk mempelajari lebih lanjut kemampuan IoT Hub, lihat: