البرنامج التعليمي: تطوير ونشر وحدة Python IoT Edge النمطية باستخدام حاويات Linux

ينطبق على:yes icon IoT Edge 1.1 IoT Edge 1.2 yes icon

استخدم Visual Studio Code لتطوير التعليمات البرمجية Python ونشرها على جهاز يقوم بتشغيل Azure IoT Edge.

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

  • استخدام Visual Studio Code لإنشاء الوحدة النمطية IoT Edge Python.
  • استخدام Visual Studio Code وDocker لإنشاء صورة docker ونشرها إلى السجل الخاص بك.
  • نشر الوحدة النمطية إلى جهاز IoT Edge.
  • عرض البيانات التي تم إنشاؤها.

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

إذا لم يكن لديك اشتراك Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

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

يوضح هذا البرنامج التعليمي كيفية تطوير وحدة نمطية في Python باستخدام Visual Studio Code، وكيفية نشرها على جهاز IoT Edge.

لا يدعم IoT Edge الوحدات النمطية Python باستخدام حاويات Windows.

استخدم الجدول التالي لفهم خيارات تطوير ونشر وحدات Python النمطية المتاحة لك باستخدام حاويات Linux:

Python تعليمة Visual Studio برمجية Visual Studio 2017/2019
Linux AMD64 Use VS Code for Python modules on Linux AMD64
Linux ARM32 Use VS Code for Python modules on Linux ARM32

قبل بدء هذا البرنامج التعليمي، يجب الانتهاء من البرنامج التعليمي السابق لإعداد بيئة التطوير الخاصة بك لتطوير حاوية Linux: تطوير وحدات IoT Edge باستخدام حاويات Linux . من خلال استكمال هذا البرنامج التعليمي، يجب أن تكون لديك المتطلبات الأساسية التالية في المكان:

لتطوير وحدة IoT Edge النمطية في Python، يتم تثبيت المتطلبات الأساسية الإضافية التالية على جهاز التطوير الخاص بك:

ملاحظة

تأكد من أن مجلد bin الخاص بك في مسار للنظام الأساسي الخاص بك. عادةً ما يكون ~/.local/ لـ UNIX وmacOS، أو %APPDATA%\Python على Windows.

إنشاء مشروع وحدة نمطية

تنشئ الخطوات التالية مشروع وحدة IoT Edge Python النمطية باستخدام Visual Studio Code وأدوات IoT Azure.

إنشاء مشروع جديد

إنشاء قالب حل Python يمكنك تخصيصه باستخدام التعليمات البرمجية الخاصة بك.

  1. في Visual Studio Code، حدد View>Command Palette لفتح لوحة الأوامر VS Code.

  2. في لوحة الأوامر، أدخل الأمر ⁧⁩Azure: Sign in⁧⁩ وشغّله واتبع الإرشادات لتسجيل الدخول إلى حسابك على Azure. إذا كنت قد سجّلت الدخول من قبل، يمكنك تخطي هذه الخطوة.

  3. في لوحة الأوامر، أدخل الأمر Azure IoT Edge: New IoT Edge solution وشغله. اتبع المطالبات وقدم المعلومات التالية لإنشاء الحل الخاص بك:

    الحقل القيمة
    حدد مجلدًا اختر الموقع على جهاز التطوير الخاص بك لأجل VS Code لإنشاء ملفات الحل.
    توفير اسم حل أدخل اسمًا وصفيًّا للحل الذي تستخدمه أو اقبل EdgeSolution الافتراضي.
    تحديد قالب الوحدة النمطية اختر Python Module.
    توفير اسم وحدة نمطية قم بتسمية الوحدة النمطية PythonModule.
    تقديم مستودع صور Docker للوحدة النمطية يتضمن مستودع الصور اسم سجل الحاوية واسم صورة الحاوية. صورة الحاوية الخاصة بك مملوءة مسبقًا بالاسم الذي قدمته في الخطوة الأخيرة. استبدل localhost:5000 بقيمة خادم تسجيل الدخول من سجل حاوية Azure. يمكنك استرداد ملقم تسجيل الدخول من صفحة نظرة عامة من تسجيل الحاوية في مدخل Azure.

    يبدو مستودع الصور النهائي مثل <اسم> التسجيل .azurecr.io/pythonmodule.

    Provide Docker image repository

إضافة بيانات اعتماد التسجيل الخاصة بك

يخزن ملف البيئة بيانات الاعتماد الخاصة بمستودع الحاوية ويشاركها مع وقت تشغيل IoT Edge. يحتاج وقت التشغيل إلى بيانات الاعتماد هذه لسحب الصور الخاصة بك إلى جهازIoT Edge.

يحاول ملحق IoT Edge سحب بيانات اعتماد تسجيل الحاوية من Azure وملأها في ملف البيئة. تحقق لمعرفة ما إذا كانت بيانات الاعتماد الخاصة بك مضمنة بالفعل. إذا لم يكن كذلك، فأضفها الآن:

  1. في مستكشف VS Code explorer، افتح الملف .env.
  2. حدث الحقول باستخدام قيم اسم المستخدم وكلمة المرور التي نسختها من سجل حاوية Azure.
  3. احفظ الملف .env.

ملاحظة

يستخدم هذا البرنامج التعليمي بيانات اعتماد تسجيل دخول المسؤول لسجل Azure Container، والتي تعتبر ملائمة لسيناريوهات التطوير والاختبار. عندما تكون جاهزًا لسيناريوهات الإنتاج، نوصي بخيار مصادقة أقل امتيازًا مثل كيانات الخدمة. لمزيد من المعلومات، راجع إدارة الوصول إلى سجل الحاوية.

تحديد بنية الهدف

حالياً، يمكن لـ Visual Studio Code تطوير وحدات Python النمطية لأجهزة Linux AMD64 وLinux ARM32v7. تحتاج إلى تحديد البنية التي تستهدفها مع كل حل، لأن الحاوية مبنية ويتم تشغيلها بشكل مختلف لكل نوع من أنواع البني. الافتراضي هو Linux AMD64.

  1. افتح لوحة الأوامر وابحث عن Azure IoT Edge: تعيين المنصة الهدف الافتراضي؟ لحل Edge، أو حدد رمز الاختصار في الشريط الجانبي أسفل النافذة.

  2. في لوحة الأوامر، حدد بنية الهدف من قائمة الخيارات. في هذا البرنامج التعليمي، نستخدم جهاز Ubuntu الظاهري كجهاز IoT Edge، لذلك سنتخذ amd64 الافتراضي.

تحديث الوحدة النمطية باستخدام التعليمات البرمجية المخصصة

يأتي كل قالب مع نموذج تعليمات برمجية مضمن، والذي يأخذ بيانات مستشعر المحاكاة من الوحدة النمطية SimulatedTemperatureSensor ويوجهها إلى مركز IoT. في هذا القسم، أضف التعليمات البرمجية التي توسع PythonModule لتحليل الرسائل قبل إرسالها.

  1. في مستكشف VS Code، افتح الوحدات النمطية>PythonModule>main.py.

  2. في الجزء العلوي من الملف main.py، استورد المكتبة json:

    import json
    
  3. أضف تعريفات عمومية للمتغيرات TEMPERATURE_THRESHOLDRECEIVED_MESSAGES TWIN_CALLBACKS. يحدد حد درجة الحرارة القيمة التي يجب أن تتجاوزها درجة الحرارة المقيسة للبيانات التي سيتم إرسالها إلى مركز IoT.

    # global counters
    TEMPERATURE_THRESHOLD = 25
    TWIN_CALLBACKS = 0
    RECEIVED_MESSAGES = 0
    
  4. استبدال الدالة create_client بالتعليمة البرمجية التالية:

    def create_client():
        client = IoTHubModuleClient.create_from_edge_environment()
    
        # Define function for handling received messages
        async def receive_message_handler(message):
            global RECEIVED_MESSAGES
            print("Message received")
            size = len(message.data)
            message_text = message.data.decode('utf-8')
            print("    Data: <<<{data}>>> & Size={size}".format(data=message.data, size=size))
            print("    Properties: {}".format(message.custom_properties))
            RECEIVED_MESSAGES += 1
            print("Total messages received: {}".format(RECEIVED_MESSAGES))
    
            if message.input_name == "input1":
                message_json = json.loads(message_text)
                if "machine" in message_json and "temperature" in message_json["machine"] and message_json["machine"]["temperature"] > TEMPERATURE_THRESHOLD:
                    message.custom_properties["MessageType"] = "Alert"
                    print("ALERT: Machine temperature {temp} exceeds threshold {threshold}".format(
                        temp=message_json["machine"]["temperature"], threshold=TEMPERATURE_THRESHOLD
                    ))
                    await client.send_message_to_output(message, "output1")
    
        # Define function for handling received twin patches
        async def receive_twin_patch_handler(twin_patch):
            global TEMPERATURE_THRESHOLD
            global TWIN_CALLBACKS
            print("Twin Patch received")
            print("     {}".format(twin_patch))
            if "TemperatureThreshold" in twin_patch:
                TEMPERATURE_THRESHOLD = twin_patch["TemperatureThreshold"]
            TWIN_CALLBACKS += 1
            print("Total calls confirmed: {}".format(TWIN_CALLBACKS))
    
        try:
            # Set handler on the client
            client.on_message_received = receive_message_handler
            client.on_twin_desired_properties_patch_received = receive_twin_patch_handler
        except:
            # Cleanup if failure occurs
            client.shutdown()
            raise
    
        return client
    
  5. احفظ الملف main.py.

  6. في مستكشف VS Code، افتح ملفdeployment.template.json في مساحة عمل حل IoT Edge.

  7. أضف توأم الوحدة النمطية PythonModule إلى بيان النشر. أدرج محتوى JSON التالي في الجزء السفلي من القسم moduleContent، بعد توأم الوحدة النمطية $edgeHub:

        "PythonModule": {
            "properties.desired":{
                "TemperatureThreshold":25
            }
        }
    

    Add module twin to deployment template

  8. احفظ ملف publish.template.json.

قم ببناء الوحدة النمطية الخاصة بك وادفعها

في القسم السابق، قمت بإنشاء حل IoT Edge وإضافة تعليمات برمجية إلى PythonModule التي ستقوم بتصفية الرسائل عندما تكون درجة حرارة الجهاز التي تم الإبلاغ عنها ضمن الحدود المقبولة. أنت الآن تحتاج إلى بناء الحل كصورة حاوية ودفعه إلى سجل الحاوية الخاص بك.

  1. افتح المحطة الطرفية المدمجة لـ VS Code بتحديد View>Terminal.

  2. قم بتسجيل الدخول إلى Docker بإدخال الأمر التالي في المحطة الطرفية. قم بتسجيل الدخول باستخدام اسم المستخدم وكلمة المرور وخادم تسجيل الدخول من سجل الحاويات Azure. يمكنك استرداد هذه القيم من قسم Access keys في السجل الخاص بك في منصة Azure.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    قد تتلقى تحذيرًا أمنيًا يوصي باستخدام --password-stdin. على الرغم من أن أفضل الممارسات موصى بها لسيناريوهات الإنتاج، إلا أنها خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker.

  3. في مستكشف VS Code، انقر بزر الماوس الأيمن فوق ملف publish.template.json وحدد Build and Push IoT Edge Solution.

    يبدأ أمر الإنشاء والدفع ثلاث عمليات. أولاً، ينشئ مجلدًا جديدًا في الحل يسمى ⁧⁩config⁧⁩ والذي يحتوي على بيان النشر الكامل، والذي تم إنشاؤه بناءً على المعلومات الموجودة في قالب النشر وملفات الحل الأخرى. ثانياً، يقوم بتشغيل docker build لإنشاء صورة الحاوية بناءً على ملف dockerfile المناسب للبنية المستهدفة. بعد ذلك، يقوم بتشغيل docker push لدفع مستودع الصور إلى سجل الحاوية الخاص بك.

    قد تستغرق هذه العملية عدة دقائق في المرة الأولى ولكن أسرع في المرة التالية التي تقوم بتشغيل الأوامر.

نشر الوحدات النمطية على الجهاز

استخدم مستكشف التعليمات البرمجية Visual Studio وملحق أدوات إنترنت Azure IoT لنشر مشروع الوحدة النمطية على جهاز IoT Edge. لديك بالفعل بيان نشر مُجهز للسيناريو الخاص بك، الملف deployment.amd64.json في مجلد التكوين. كل ما عليك القيام به الآن هو تحديد جهاز لتلقي النشر.

تأكد من أن جهاز IoT Edge الخاص بك يعمل.

  1. في مستكشف Visual Studio Code ضمن قسم Azure IoT Hub، قم بتوسيع الأجهزة لمشاهدة قائمة أجهزة إنترنت الأشياء الخاصة بك.

  2. انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge الخاص بك، ثم حدد Create Deployment for Single Device.

  3. افتح الملف deployment.amd64.json في المجلد config ثم انقر فوق Select Edge Deployment Manifest. لا تستخدم الملف deployment.template.js.

  4. تحت جهازك، قم بتوسيع الوحدات النمطية لمشاهدة قائمة بالوحدات التي تم نشرها وتشغيلها. انقر فوق زر تحديث. من المفترض أن ترى PythonModule الجديدة تعمل جنباً إلى جنب مع الوحدة النمطية SimulatedTemperatureSensor و $ edgeAgent و $edgeHub.

    قد يستغرق الأمر بضع دقائق لبدء تشغيل الوحدات النمطية. يحتاج وقت تشغيل IoT Edge إلى استلام بيان النشر الجديد الخاص به، وسحب صور الوحدة النمطية من وقت تشغيل الحاوية، ثم بدء تشغيل كل وحدة نمطية جديدة.

عرض البيانات التي تم إنشاؤها

بمجرد تطبيق بيان النشر على جهاز IoT Edge، يقوم وقت تشغيل IoT Edge على الجهاز بتجميع معلومات النشر الجديدة وبدء التنفيذ عليها. يتم إيقاف أي وحدات نمطية تعمل على الجهاز غير مضمنة في بيان النشر. يتم تشغيل أي وحدات مفقودة من الجهاز.

يمكنك عرض حالة جهاز IoT Edge الخاص بك باستخدام قسم Azure IoT Hub Devices في مستكشف Visual Studio Code. وسع تفاصيل جهازك لعرض قائمة بالوحدات النمطية المنشورة والعاملة.

  1. في مستكشف Visual Studio Code، انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge وحدد بدء مراقبة نقطة نهاية الحدث المضمنة.

  2. عرض الرسائل التي تصل إلى مركز IoT. قد يستغرق وصول الرسائل بعض الوقت. يجب أن يتلقى جهاز IoT Edge النشر الجديد الخاص به وأن يبدأ تشغيل كافة الوحدات النمطية. ثم، تنتظر التغييرات التي قمنا بها على التعليمات البرمجية PythonModule حتى تصل درجة حرارة الجهاز إلى 25 درجة قبل إرسال الرسائل. كما تضيف نوع الرسالة Alert إلى أي رسائل تصل إلى حد درجة الحرارة هذا.

تحرير الوحدة النمطية التوأم

استخدمنا وحدة PythonModule التوأم في بيان النشر لتعيين حد درجة الحرارة عند 25 درجة. يمكنك استخدام الوحدة النمطية التوأم لتغيير الوظيفة دون الحاجة إلى تحديث التعليمات البرمجية الوحدة النمطية.

  1. في Visual Studio Code، وسع التفاصيل الموجودة تحت جهاز IoT Edge لرؤية الوحدات النمطية قيد التشغيل.

  2. انقر بزر الماوس الأيمن فوق PythonModule وحدد تحرير الوحدة النمطية التوأم.

  3. ابحث عن TemperatureThreshold في الخصائص المطلوبة. تغيير قيمته إلى درجة حرارة جديدة من 5 درجات إلى 10 درجات أعلى من آخر درجة حرارة مبلغ عنها.

  4. احفظ ملف الوحدة النمطية المزدوجة.

  5. انقر بزر الماوس الأيمن في أي مكان في جزء تحرير الوحدة النمطية المزدوجة وحدد تحديث الوحدة النمطية المزدوجة.

  6. وراقب الرسائل الواردة من الجهاز إلى السحابة. يجب أن تشاهد الرسائل تتوقف حتى يتم الوصول إلى حد درجة الحرارة الجديد.

تنظيف الموارد

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

غير ذلك يمكنك حذف التكوينات المحلية وموارد Azure التي استخدمتها في هذه المقالة لتجنب التكاليف.

حذف موارد Azure

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

لحذف الموارد:

  1. سجّل الدخول إلى مدخل Microsoft Azure، ثم حدد Resource groups.

  2. حدد اسم مجموعة الموارد التي تحتوي على موارد اختبار IoT Edge.

  3. راجع قائمة الموارد الموجودة في مجموعة الموارد الخاصة بك. إذا كنت تريد حذفها جميعاً، يمكنك تحديد Delete resource group. إذا كنت تريد حذف بعضها فقط، فيمكنك النقر فوق كل مورد لحذفها بشكل فردي.

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

لقد أنشأت في هذا البرنامج التعليمي وحدة IoT Edge النمطية التي تحتوي على تعليمات برمجية لتصفية البيانات الأولية التي أنشأها جهاز IoT Edge.

يمكنك متابعة الدروس التالية لمعرفة كيف يمكن أن تساعدك Azure IoT Edge في نشر خدمات سحابة Azure لمعالجة البيانات وتحليلها على الحافة.