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

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

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

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

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

في نهاية هذه المقالة، يمكنك تشغيل تطبيق وحدة تحكم Python FileUpload.py، والذي يقوم بتحميل ملف إلى التخزين باستخدام Python Device SDK.

إشعار

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

هام

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

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

  • حساب Azureنشط. (إذا لم يكن لديك حساب، يمكنك إنشاء حساب مجاني خلال دقيقتين فقط.)

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

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

  • يوصى بإصدار 3.7 من Python أو أحدث. تأكد من استخدام التثبيت 32 بت أو 64 بت كما هو مطلوب من قبل الإعداد الخاص بك. عند المطالبة في أثناء التثبيت، تأكد من إضافة Python إلى متغيرات البيئة الخاصة بالنظام الأساسي.

  • يجب فتح المنفذ 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.

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

في هذا القسم، تقوم بإنشاء تطبيق الجهاز لتحميل ملف إلى IoT Hub.

  1. في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iot-device. يمكنك استخدام هذه الحزمة لتنسيق تحميل الملف مع IoT Hub الخاص بك.

    pip install azure-iot-device
    
  2. في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure.storage.blob. يمكنك استخدام هذه الحزمة لأداء تحميل الملف.

    pip install azure.storage.blob
    
  3. قم بإنشاء ملف اختبار ستقوم بتحميله إلى تخزين blob.

  4. باستخدام محرر نصوص، قم بإنشاء ملف FileUpload.py في مجلد العمل الخاص بك.

  5. أضف عبارات ومتغيرات import التالية في بداية ملف FileUpload.py.

    import os
    from azure.iot.device import IoTHubDeviceClient
    from azure.core.exceptions import AzureError
    from azure.storage.blob import BlobClient
    
    CONNECTION_STRING = "[Device Connection String]"
    PATH_TO_FILE = r"[Full path to local file]"
    
  6. في ملفك، استبدل [Device Connection String] بسلسلة الاتصال الخاصة بجهاز مركز IoT. استبدل [Full path to local file] بالمسار إلى ملف الاختبار الذي أنشأته أو أي ملف تريد تحميله على جهازك.

  7. قم بإنشاء وظيفة لتحميل الملف إلى تخزين blob:

    def store_blob(blob_info, file_name):
        try:
            sas_url = "https://{}/{}/{}{}".format(
                blob_info["hostName"],
                blob_info["containerName"],
                blob_info["blobName"],
                blob_info["sasToken"]
            )
    
            print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))
    
            # Upload the specified file
            with BlobClient.from_blob_url(sas_url) as blob_client:
                with open(file_name, "rb") as f:
                    result = blob_client.upload_blob(f, overwrite=True)
                    return (True, result)
    
        except FileNotFoundError as ex:
            # catch file not found and add an HTTP status code to return in notification to IoT Hub
            ex.status_code = 404
            return (False, ex)
    
        except AzureError as ex:
            # catch Azure errors that might result from the upload operation
            return (False, ex)
    

    تحلل هذه الوظيفة بنية blob_info التي تم تمريرها إليها لإنشاء عنوان URL تستخدمه لتهيئة azure.storage.blob.BlobClient. ثم يقوم بتحميل ملفك إلى موقع تخزين Azure Blob باستخدام هذا العميل.

  8. أضف التعليمة البرمجية التالية لربط العميل وتحميل الملف:

    def run_sample(device_client):
        # Connect the client
        device_client.connect()
    
        # Get the storage info for the blob
        blob_name = os.path.basename(PATH_TO_FILE)
        storage_info = device_client.get_storage_info_for_blob(blob_name)
    
        # Upload to blob
        success, result = store_blob(storage_info, PATH_TO_FILE)
    
        if success == True:
            print("Upload succeeded. Result is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)
            )
    
        else :
            # If the upload was not successful, the result is the exception object
            print("Upload failed. Exception is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], False, result.status_code, str(result)
            )
    
    def main():
        device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        try:
            print ("IoT Hub file upload sample, press Ctrl-C to exit")
            run_sample(device_client)
        except KeyboardInterrupt:
            print ("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            device_client.shutdown()
    
    
    if __name__ == "__main__":
        main()
    

    ينشئ هذا التعليمة البرمجية IoTHubDeviceClient ويستخدم واجهات برمجة التطبيقات التالية لإدارة تحميل الملف باستخدام مركز IoT الخاص بك:

    • تحصل get_storage_info_for_blob على معلومات من IoT Hub الخاص بك بشأن حساب التخزين المرتبط الذي قمت بإنشائه مسبقاً. تتضمن هذه المعلومات اسم المضيف واسم الحاوية واسم blob ورمز SAS المميز. يتم تمرير معلومات التخزين إلى وظيفة store_blob (التي تم إنشاؤها في الخطوة السابقة)، لذلك يمكن لـ BlobClient في هذه الوظيفة المصادقة مع تخزين Azure. تعرض طريقة get_storage_info_for_blob أيضاً correlation_id، والذي يتم استخدامه في طريقة notify_blob_upload_status. تعد correlation_id طريقة IoT Hub لتحديد النقطة التي تعمل عليها.

    • يقوم notify_blob_upload_status بإعلام IoT Hub بحالة عملية تخزين البيانات الثنائية الكبيرة. قمت بتمرير correlation_id الذي تم الحصول عليه بواسطة طريقة get_storage_info_for_blob. يتم استخدامه بواسطة IoT Hub لإعلام أي خدمة قد تستمع لإشعار بشأن حالة مهمة تحميل الملف.

  9. احفظ وأغلق ملف FileUpload.py.

شغّل التطبيق

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

  1. في موجه الأوامر في مجلد العمل الخاص بك، قم بتشغيل الأمر التالي:

    python FileUpload.py
    
  2. تُظهر لقطة الشاشة التالية الإخراج من تطبيق FileUpload :

    لقطة شاشة تعرض إخراج تشغيل تطبيق FileUpload.

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

    لقطة شاشة للحاوية في مدخل Azure تعرض الملف الذي تم تحميله.

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

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

تعرف على المزيد بشأن موقع تخزين Azure Blob بالارتباطات التالية: