Azure IoT Hub (Java) ile cihazınızdan buluta dosya yükleme

Bu makalede, Java kullanarak IoT Hub'ın azure blob depolamaya dosya yükleme özelliklerinin nasıl yüklendiği gösterilmektedir.

Cihazdan IoT hub'ına telemetri gönderme hızlı başlangıcı ve IoT Hub ile buluttan cihaza iletiler gönderme makalesinde IoT Hub'ın cihazdan buluta ve buluttan cihaza mesajlaşma işlevleri gösterilir. IoT Hub ile ileti yönlendirmeyi yapılandırma öğreticisi, cihazdan buluta iletileri Azure blob depolamada güvenilir bir şekilde depolamanın bir yolunu gösterir. Ancak bazı senaryolarda, cihazlarınızın gönderdiği verileri IoT Hub'ın kabul ettikleri görece küçük cihazdan buluta iletilere kolayca eşleyemezsiniz. Örneğin:

  • Videolar
  • Görüntü içeren büyük dosyalar
  • Yüksek frekansta örneklenen titreşim verileri
  • Önceden işlenmiş verilerin bir biçimi.

Bu dosyalar genellikle Azure Data Factory veya Hadoop yığını gibi araçlar kullanılarak bulutta toplu olarak işlenir. Bir cihazdan dosya yüklemeniz gerektiğinde IoT Hub'ın güvenliğini ve güvenilirliğini kullanmaya devam edebilirsiniz. Bu makalede nasıl yapıldığını görebilirsiniz. GitHub'da azure-iot-sdk-java'dan iki örneği görüntüleyin.

Not

IoT Hub, Azure IoT cihaz SDK'ları aracılığıyla birçok cihaz platform ve dilini (C, .NET ve JavaScript dahil) destekler. Cihazınızı Azure IoT Hub'a bağlamayı öğrenmek için Azure IoT Geliştirici Merkezi'ne bakın.

Önemli

X.509 sertifika yetkilisi (CA) kimlik doğrulaması kullanan cihazlarda dosya yükleme işlevi genel önizleme aşamasındadır ve önizleme modunun etkinleştirilmesi gerekir. Azure Cihaz Sağlama Hizmeti ile X.509 parmak izi kimlik doğrulaması veya X.509 sertifika kanıtlama kullanan cihazlarda genel olarak kullanılabilir. IoT Hub ile X.509 kimlik doğrulaması hakkında daha fazla bilgi edinmek için bkz . Desteklenen X.509 sertifikaları.

Önkoşullar

  • Bir IoT hub'ı. CLI veya Azure portalı ile bir tane oluşturun.

  • Kayıtlı bir cihaz. Azure portalında bir tane kaydedin.

  • Java SE Geliştirme Seti 8. JDK 8 indirmelerine ulaşmak için Uzun süreli destek bölümünde Java 8'i seçtiğinizden emin olun.

  • Maven 3

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktası açık olmalıdır. Bu makaledeki cihaz örneği, 8883 numaralı bağlantı noktası üzerinden iletişim kuran MQTT protokollerini kullanır. Bu bağlantı noktası bazı kurumsal ve eğitim ağı ortamlarında engellenebilir. Bu sorunu çözmenin daha fazla bilgi ve yolları için bkz. IoT Hub'a (MQTT) Bağlan.

Azure Depolama hesabını IoT Hub ile ilişkilendirme

Bir cihazdan dosya yüklemek için IoT hub'ınız ile ilişkilendirilmiş bir Azure Depolama hesabınız ve Azure Blob Depolama kapsayıcınız olmalıdır. Depolama hesabını ve kapsayıcıyı IoT hub'ınızla ilişkilendirdikten sonra, IoT hub'ınız bir cihaz tarafından istendiğinde SAS URI'sinin öğelerini sağlayabilir. Cihaz daha sonra azure Depolama kimlik doğrulaması yapmak ve blob kapsayıcısına dosya yüklemek için kullandığı SAS URI'sini oluşturmak için bu öğeleri kullanabilir.

Azure Depolama hesabını IoT hub'ınızla ilişkilendirmek için:

  1. Hub ayarları'nın altında IoT hub'ınızın sol bölmesinden Dosya yükleme'yi seçin.

    Portaldan dosya yükleme ayarlarını seçmeyi gösteren ekran görüntüsü.

  2. Dosya karşıya yükleme bölmesinde Azure Depolama Kapsayıcısı'nı seçin. Bu makale için depolama hesabınızın ve IoT Hub'ınızın aynı bölgede bulunması önerilir.

    • Kullanmak istediğiniz bir depolama hesabınız varsa listeden seçin.

    • Yeni bir depolama hesabı oluşturmak için +Depolama hesabı seçin. Depolama hesabı için bir ad girin ve Konum'un IoT hub'ınız ile aynı bölgeye ayarlandığından emin olun, ardından Tamam'ı seçin. Yeni hesap, IoT hub'ınız ile aynı kaynak grubunda oluşturulur. Dağıtım tamamlandığında, listeden depolama hesabını seçin.

    Depolama hesabını seçtikten sonra Kapsayıcılar bölmesi açılır.

  3. Kapsayıcılar bölmesinde blob kapsayıcısını seçin.

    • Kullanmak istediğiniz bir blob kapsayıcınız zaten varsa, listeden kapsayıcıyı seçin ve Seç'e tıklayın.

    • Yeni bir blob kapsayıcısı oluşturmak için + Kapsayıcı'yı seçin. Yeni kapsayıcı için bir ad belirtin. Bu makalenin amaçları doğrultusunda, diğer tüm alanları varsayılan değerlerinde bırakabilirsiniz. Oluştur'u belirleyin. Dağıtım tamamlandığında, listeden kapsayıcıyı seçin ve Seç'e tıklayın.

  4. Dosya karşıya yükleme bölmesine döndüğünüzde dosya bildirimlerinin Açık olarak ayarlandığından emin olun. Diğer tüm ayarları varsayılan değerlerinde bırakabilirsiniz. Kaydet'i seçin ve sonraki bölüme geçmeden önce ayarların tamamlanmasını bekleyin.

    Portalda dosya yükleme ayarlarını onaylamayı gösteren ekran görüntüsü.

Azure Depolama hesabı oluşturma hakkında daha ayrıntılı yönergeler için bkz. Depolama hesabı oluşturma. Depolama hesabını ve blob kapsayıcısını IoT hub'ı ile ilişkilendirme hakkında daha ayrıntılı yönergeler için bkz . Azure portalını kullanarak dosya yüklemelerini yapılandırma.

Maven kullanarak proje oluşturma

Projeniz için bir dizin oluşturun ve bu dizinde bir kabuk başlatın. Komut satırında aşağıdakileri yürütür

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

Bu, artifactId ile aynı ada ve standart proje yapısına sahip bir dizin oluşturur:

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

Metin düzenleyicisi kullanarak pom.xml dosyasını aşağıdakilerle değiştirin:


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

Cihaz uygulamasından dosya yükleme

Karşıya yüklemek my-app istediğiniz dosyayı proje ağacınızdaki klasöre kopyalayın. Metin düzenleyicisi kullanarak App.java aşağıdaki kodla değiştirin. Cihazınızın bağlantı dizesi ve belirtilen dosya adını sağlayın. Cihazı kaydettiğinizde cihazı bağlantı dizesi kopyalamıştınız.

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

Uygulamayı derleme ve çalıştırma

klasöründeki my-app bir komut isteminde aşağıdaki komutu çalıştırın:

mvn clean package -DskipTests

Derleme tamamlandığında, uygulamayı çalıştırmak için aşağıdaki komutu çalıştırın:

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

Karşıya yüklenen dosyayı yapılandırdığınız depolama kapsayıcısında görüntülemek için portalı kullanabilirsiniz:

Depolama kapsayıcınıza yüklenmiş bir dosyayı gösteren ekran görüntüsü.

Karşıya dosya yükleme bildirimi alma

Bu bölümde, IoT Hub'dan dosya karşıya yükleme bildirim iletileri alan bir Java konsol uygulaması oluşturacaksınız.

  1. Projeniz için bir dizin oluşturun ve bu dizinde bir kabuk başlatın. Komut satırında aşağıdakileri yürütür

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. Komut isteminizde yeni my-app klasöre gidin.

  3. Bir metin düzenleyicisi kullanarak klasördeki pom.xmlmy-app dosyayı aşağıdakilerle değiştirin. Hizmet istemcisi bağımlılığını eklemek, IoT hub hizmetinizle iletişim kurmak için uygulamanızda iothub-java-service-client paketini kullanmanıza olanak tanır:

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

    Not

    Maven arama kullanarak en yeni iot-service-client sürümünü kontrol edebilirsiniz.

  4. Dosyayı kaydedin ve kapatın pom.xml .

  5. IoT Hub hizmeti bağlantı dizesi alın.

    Hizmet ilkesi için IoT Hub bağlantı dizesi almak için şu adımları izleyin:

    1. Azure portalında Kaynak grupları'nı seçin. Hub'ınızın bulunduğu kaynak grubunu seçin ve ardından kaynak listesinden hub'ınızı seçin.

    2. IoT hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

    3. İlke listesinden hizmet ilkesini seçin.

    4. Birincil bağlantı dizesi kopyalayın ve değeri kaydedin.

    Azure portalında IoT Hub'ınızdan bağlantı dizesi almayı gösteren ekran görüntüsü.

    IoT Hub paylaşılan erişim ilkeleri ve izinleri hakkında daha fazla bilgi için bkz . Erişim denetimi ve izinleri.

  6. Bir metin düzenleyicisi kullanarak dosyayı açın my-app\src\main\java\com\mycompany\app\App.java ve kodu aşağıdakilerle değiştirin.

    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. Dosyayı kaydedin ve kapatın my-app\src\main\java\com\mycompany\app\App.java .

  8. Uygulamayı derlemek ve hataları denetlemek için aşağıdaki komutu kullanın:

    mvn clean package -DskipTests
    

Uygulamayı çalıştırma

Artık uygulamayı çalıştırmaya hazırsınız.

klasöründeki my-app bir komut isteminde aşağıdaki komutu çalıştırın:

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

Aşağıdaki ekran görüntüsünde read-file-upload-notification uygulamasının çıkışı gösterilmektedir:

Read-file-upload-notification uygulamasından çıktı

Sonraki adımlar

Bu makalede, cihazlardan dosya yükleme işlemini basitleştirmek için IoT Hub'ın dosya yükleme özelliğini kullanmayı öğrendiniz. Aşağıdaki makalelerle bu özelliği keşfetmeye devam edebilirsiniz:

IoT Hub'ın özelliklerini daha fazla keşfetmek için bkz: