تحميل الملفات من جهازك إلى السحابة باستخدام Azure IoT Hub (Java)

توضح هذه المقالة كيفية تحميل الملفات قدرات IoT Hub لتحميل ملف إلى تخزين Azure blob، باستخدام Java.

تعرض المقالات التشغيل السريع إرسال بيانات تتبع الاستخدام من جهاز إلى مركز إنترنت الأشياء و إرسال رسائل من السحابة إلى الجهاز باستخدام مركز IoT وظيفة المراسلة الأساسية من جهاز إلى سحابة ومن سحابة إلى جهاز في مركز إنترنت الأشياء. يوضح البرنامج التعليمي تكوين توجيه الرسائل باستخدام مركز IoT طريقة لتخزين الرسائل من جهاز إلى سحابة بشكل موثوق في تخزين كائنات Azure كبيرة الحجم. ومع ذلك، في بعض السيناريوهات، لا يمكنك بسهولة تعيين البيانات التي ترسلها أجهزتك إلى الرسائل الصغيرة نسبياً من الجهاز إلى السحابة التي يقبلها IoT Hub. على سبيل المثال:

  • ملفات الفيديو
  • ملفات كبيرة تحتوي على صور
  • بيانات الاهتزاز التي تم أخذ عينات لها بتردد عال
  • شكل من أشكال البيانات المعالجة مسبقًا.

تتم عادةً معالجة هذه الملفات دفعة واحدة في السحابة باستخدام أدوات مثل Azure Data Factory أو مكدس Hadoop. عندما تحتاج إلى تحميل ملفات من جهاز، لا يزال بإمكانك استخدام أمان وموثوقية IoT Hub. يوضح لك هذا المقال كيف. عرض عينتين من azure-iot-sdk-java في GitHub.

إشعار

يدعم IoT Hub العديد من الأنظمة الأساسية للأجهزة واللغات (بما في ذلك C و.NET وJavaScript) من خلال حزم SDK لجهاز Azure IoT. ارجع إلى مركز مطور Azure IoT للحصول على إرشادات خطوة بخطوة بشأن كيفية توصيل جهازك بـ Azure IoT Hub.

هام

وظيفة تحميل الملفات على الأجهزة التي تستخدم مصادقة المرجع المصدق (CA) X.509 في الإصدار الأولي العام، ويجب تمكين وضع المعاينة. متاحة بشكل عام على الأجهزة التي تستخدم مصادقة بصمة الإبهام X.509 أو شهادة X.509 مع خدمة تزويد أجهزة Azure. لمعرفة المزيد حول مصادقة X.509 مع IoT Hub، راجع شهادات X.509 المدعومة.

المتطلبات الأساسية

  • IoT Hub. أنشئ واحدا باستخدام CLI أو مدخل Microsoft Azure.

  • جهاز مسجل. سجَل واحدًا في مدخل Azure.

  • حزمة تطور Java SE 8. تأكد من تحديد Java 8 ضمن الدعم طويل الأجل للوصول إلى التنزيلات لـ JDK 8.

  • Maven 3

  • يجب فتح المنفذ 8883 في جدار الحماية الخاص بك. يستخدم نموذج الجهاز في هذه المقالة بروتوكول MQTT، الذي يتصل عبر المنفذ 8883. قد يُحظر هذا المنفذ في بعض بيئات الشبكات التعليمية، وشبكات الشركات. لمزيد من المعلومات وطرق التغلب على هذه المشكلة، راجع الاتصال بمركز IoT (MQTT).

إقران حساب Azure Storage بـ IoT Hub

لتحميل الملفات من جهاز، يجب أن يكون لديك حساب Azure Storage وحاوية Azure Storage Blob مقترنة بمركز IoT الخاص بك. بمجرد إقران حساب التخزين والحاوية بمركز IoT الخاص بك، يمكن لمركز IoT الخاص بك توفير عناصر SAS URI عند طلب الجهاز. يمكن للجهاز بعد ذلك استخدام هذه العناصر لإنشاء SAS URI الذي يستخدمه للمصادقة مع Azure Storage وتحميل الملفات إلى حاوية البيانات الثنائية الكبيرة.

لإقران حساب Azure Storage بمركز IoT الخاص بك:

  1. ضمن Hub settings، حدد File upload في الجزء الأيسر من IoT Hub الخاص بك.

    لقطة شاشة تعرض إعدادات تحميل الملفات من المدخل.

  2. في جزء File upload، حدد Azure Storage Container. بالنسبة لهذه المقالة، يوصى بأن يكون حساب التخزين الخاص بك ومركز IoT Hub موجودين في نفس المنطقة.

    • إذا كان لديك بالفعل حساب تخزين تريد استخدامه، فحدده من القائمة.

    • لإنشاء حساب تخزين جديد، حدد +Storage account. أدخل اسماً لحساب التخزين وتأكد من تعيين Location على نفس المنطقة مثل IoT Hub، ثم حدد OK. تم إنشاء الحساب الجديد في نفس مجموعة الموارد مثل IoT Hub الخاص بك. عند اكتمال التوزيع، حدد حساب التخزين من القائمة.

    بعد تحديد حساب التخزين، يتم فتح جزء Containers.

  3. في جزء Containers، حدد حاوية البيانات الثنائية الكبيرة.

    • إذا كان لديك بالفعل حاوية blob تريد استخدامها، فحددها من القائمة وانقر على Select.

    • لإنشاء حاوية blob جديدة، حدد + Container. أدخل اسماً للحاوية الجديدة. لأغراض هذه المقالة، يمكنك ترك جميع الحقول الأخرى على وضعها الافتراضي. حدد إنشاء. عند اكتمال التوزيع، حدد الحاوية من القائمة وانقر على Select.

  4. مرة أخرى في جزء File upload، تأكد من تعيين إعلامات الملف على On. يمكنك ترك جميع الإعدادات الأخرى على الإعدادات الافتراضية الخاصة بهم. حدد Save وانتظر حتى تكتمل الإعدادات قبل الانتقال إلى القسم التالي.

    لقطة شاشة تعرض تأكيد إعدادات تحميل الملفات في المدخل.

للحصول على إرشادات أكثر تفصيلاً بشأن كيفية إنشاء حساب Azure Storage، راجع إنشاء حساب تخزين. للحصول على إرشادات أكثر تفصيلاً بشأن كيفية إقران حساب تخزين وحاوية تخزين البيانات الثنائية الكبيرة بمركز IoT، راجع تكوين تحميلات الملفات باستخدام مدخل Microsoft Azure.

إنشاء مشروع باستخدام Maven

قم بإنشاء دليل لمشروعك، وابدأ shell في هذا الدليل. على سطر الأوامر تنفيذ ما يلي

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

يؤدي هذا إلى إنشاء دليل بنفس اسم artifactId وبنية مشروع قياسية:

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

باستخدام محرر نص، استبدل ملف pom.xml بما يلي:


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

تحميل ملف من تطبيق جهاز

انسخ الملف الذي تريد تحميله إلى المجلد my-app في شجرة المشروع. باستخدام محرر نص، استبدل App.java بالتعليمات البرمجية التالية. قم بتوفير سلسلة اتصال جهازك واسم الملف حيث تمت الإشارة إليه. نسخت سلسلة اتصال الجهاز عند تسجيل الجهاز.

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

بناء وتشغيل التطبيق

في موجه الأوامر في المجلد my-app، قم بتشغيل الأمر التالي:

mvn clean package -DskipTests

عند اكتمال البنية، قم بتشغيل الأمر التالي لتشغيل التطبيق:

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

يمكنك استخدام المدخل لعرض الملف الذي تم تحميله في حاوية التخزين التي قمت بتكوينها:

لقطة شاشة تعرض ملفا تم تحميله إلى حاوية التخزين الخاصة بك.

تلقي إشعار تحميل الملف

في هذا القسم، يمكنك إنشاء تطبيق وحدة تحكم Java يتلقى رسائل إعلام تحميل الملفات من IoT Hub.

  1. قم بإنشاء دليل لمشروعك، وابدأ shell في هذا الدليل. على سطر الأوامر تنفيذ ما يلي

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  2. في موجه الأوامر، انتقل إلى المجلد my-app الجديد.

  3. باستخدام محرر نص، استبدل الملف pom.xml في المجلد my-app بما يلي. تمكنك إضافة تبعية عميل الخدمة من استخدام حزمة iothub-java-service-client في تطبيقك للاتصال بخدمة مركز IoT:

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

    إشعار

    يمكنك التحقق من أحدث إصدار من iot-service-client باستخدام Maven search.

  4. احفظ الملف pom.xml وأغلقه.

  5. احصل على سلسلة اتصال خدمة IoT Hub.

    للحصول على سلسلة اتصال IoT Hub لنهج الخدمة، اتبع الخطوات التالية:

    1. في مدخل Microsoft Azure، حدد Resource groups. حدد مجموعة الموارد حيث يوجد المركز الخاص بك، ثم حدد المركز الخاص بك من قائمة الموارد.

    2. في الجزء الأيسر من IoT Hub، حدد Shared access policies.

    3. من قائمة النُهج، حدد نهج service.

    4. انسخ سلسلة الاتصال الأساسية واحفظ القيمة.

    لقطة شاشة تعرض كيفية استرداد سلسلة الاتصال من IoT Hub في مدخل Microsoft Azure.

    للمزيد من المعلومات حول نهج الوصول المشترك لـIoT Hub والأذونات، راجع التحكم في الوصول والأذونات.

  6. باستخدام محرر نص، افتح الملف my-app\src\main\java\com\mycompany\app\App.java واستبدل التعليمات البرمجية بما يلي.

    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. احفظ الملف my-app\src\main\java\com\mycompany\app\App.java وأغلقه.

  8. استخدم الأمر التالي لإنشاء التطبيق والتحقق من وجود أخطاء:

    mvn clean package -DskipTests
    

شغّل التطبيق

أنت الآن جاهز لتشغيل التطبيق.

في موجه الأوامر في المجلد my-app، قم بتشغيل الأمر التالي:

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

تظهر لقطة الشاشة التالية الإخراج من تطبيق read-file-upload-notification:

مخرج من تطبيق read-file-upload-notification

الخطوات التالية

في هذه المقالة، تعلمت كيفية استخدام ميزة تحميل الملفات في IoT Hub لتبسيط عمليات تحميل الملفات من الأجهزة. يمكنك الاستمرار في استكشاف هذه الميزة بالمقالات التالية:

لمزيد من استكشاف قدرات IoT Hub، راجع: