مشاركة عبر


البرنامج التعليمي: إنشاء وحدات IoT Edge المخصصة ونشرها

ينطبق على: أيقونة نعم IoT Edge 1.1

هام

كان تاريخ انتهاء دعم IoT Edge 1.1 هو 13 ديسمبر 2022. تحقق من دورة حياة المنتج من Microsoft للحصول على معلومات حول كيفية دعم هذا المنتج أو الخدمة أو التقنية أو API. لمزيد من المعلومات حول التحديث إلى أحدث إصدار من IoT Edge، راجع تحديث IoT Edge.

في هذه المقالة، نقوم بإنشاء ثلاث وحدات IoT Edge النمطية التي تتلقى رسائل من أجهزة IoT المتلقية للمعلومات، وتشغيل البيانات من خلال نموذج التعلم الآلي، ثم إعادة توجيه الرؤى إلى IoT Hub.

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

نريد أن يقوم IoT Edge بأربع مهام هي:

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

لإنجاز هذه المهام، نستخدم ثلاث وحدات مخصصة:

  • مصنف فترة الصلاحية المتبقية: إن وحدة turboFanRulClassifier التي أنشأناها في التدريب على نموذج Azure Machine Learning ونشره يمثل النموذج القياسي للتعلم الآلي، الذي يعرض مدخلات تُسمى "amlInput" ومخرجات تُسمى "amlOutput". يتوقع "amlInput" أن تبدو مدخلاته مماثلة تمامًا للمدخلات التي أرسلناه إلى خدمة الويب المستندة إلى ACI. وبالمثل، يعيد "amlOutput" نفس البيانات في صورة خدمة ويب.

  • كاتب Avro: تتلقى هذه الوحدة رسائل حول مدخلات "avroModuleInput" وتحتفظ بالرسالة بتنسيق Avro إلى القرص لتحميلها إلى مركز IoT لاحقًا.

  • وحدة جهاز التوجيه: تتلقى وحدة جهاز التوجيه رسائل من أجهزة انتقال البيانات من الخادم، ثم تقوم بتنسيق الرسائل وإرسالها إلى المصنف. بعد ذلك، تستلم الوحدة الرسائل من المصنف وتعيد توجيه الرسالة إلى الوحدة الخاصة بكاتب Avro. وأخيرًا، ترسل الوحدة توقع فترة الصلاحية المتبقية إلى مركز IoT.

    • المدخلات:

      • deviceInput: يتلقى رسائل من أجهزة انتقال البيانات من الخادم
      • rulInput: استلام الرسائل من "amlOutput"
    • المخرجات:

      • classify: إرسال الرسائل إلى "amlInput"
      • writeAvro: إرسال الرسائل إلى "avroModuleInput"
      • toIotHub: إرسال الرسائل إلى $upstream، الذي يمرر الرسائل إلى مركز IoT المتصل

يوضح المخطط التالي الوحدات والمدخلات والمخرجات ومسارات مركز IoT Edge الخاصة بالحل الكامل:

المخطط التصميمي لوحدات IoT Edge الثلاث

عادة ما ينفذ مطورو السحابة الخطوات الواردة في هذه المقالة.

في هذا البرنامج التعليمي، ستتعلّم طريقة:

  • إنشاء وحدة IoT Edge من التعليمات البرمجية المخصصة.
  • إنشاء صورة تعليمات مثبتة من الوحدة المخصصة.
  • إعادة تكوين توجيه مركز IoT لدعم الوحدات المخصصة.
  • إنشاء الوحدات المخصصة ونشرها وتوزيعها.

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

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

إنشاء حل IoT Edge جديد

في أثناء تنفيذ دفتر الملاحظات الثاني من دفتري Azure Notebooks، أنشأنا صورة حاوية تشتمل على نموذج مدة الصلاحية المتبقية ونشرناها. يدمج Azure Machine Learning في إطار عملية إنشاء الصورة، هذا النموذج بحيث يمكن نشر الصورة كوحدة Azure IoT Edge.

في هذه الخطوة، سننشئ حل Azure IoT Edge باستخدام الوحدة النمطية "Azure التعلم الآلي" ونوجه الوحدة النمطية إلى الصورة التي نشرناها باستخدام دفاتر ملاحظات Azure.

  1. افتح جلسة عمل سطح مكتب بعيدة إلى VM التطوير الخاص بك.

  2. افتح المجلد C:\source\IoTEdgeAndMlSample في Visual Studio Code.

  3. انقر بزر الماوس الأيمن على لوحة المستكشف (في المساحة الفارغة) وحدد حل IoT Edge جديد.

    إنشاء حل IoT Edge جديد

  4. اقبل اسم الحل الافتراضي EdgeSolution.

  5. اختر Azure Machine Learning ليكون قالب النموذج.

  6. قم بتسمية الوحدة باسم turbofanRulClassifier.

  7. اختر مساحة عمل التعلم الآلي. مساحة العمل هذه هي مساحة عمل turboFanDemo التي أنشأتها في البرنامج التعليمي: التدريب على نموذج Azure Machine Learning ونشره

  8. حدد الصورة التي أنشأتها في أثناء تشغيل Azure Notebook.

  9. ابحث عن الحل ولاحظ الملفات التي تم إنشاؤها:

    • deployment.template.json: يحتوي هذا الملف على تعريف كل من الوحدات المتضمنة في هذا الحل. يوجد ثلاثة أقسام يجب الانتباه إليها في هذا الملف:

      • بيانات اعتماد السجل: تعريف مجموعة من سجلات الحاويات المخصصة التي تستخدمها في هذا الحل. أما الآن فيجب أن تشتمل على السجل من مساحة عمل التعلم الآلي، حيث المكان المخزنة فيه صورة Azure Machine Learning. يمكن أن يكون لديك عددًا من السجلات للحاوية، لكن لتسهيل الأمر عليك سنستخدم سجلاً واحدًا لجميع الوحدات.

        "registryCredentials": {
          "<your registry>": {
            "username": "$CONTAINER_REGISTRY_USERNAME_<your registry>",
            "password": "$CONTAINER_REGISTRY_PASSWORD_<your registry>",
            "address": "<your registry>.azurecr.io"
          }
        }
        
      • الوحدات: يحتوي هذا القسم على مجموعة من الوحدات التي يعرفها المستخدم، والتي تتناسب مع هذا الحل. يتم توجيه تعريف وحدة turbofanRulClassifier إلى الصورة في سجل الحاوية لديك. وأي وحدات نضيفها إلى هذا الحل ستظهر في هذا القسم.

        "modules": {
           "turbofanRulClassifier": {
             "version": "1.0",
             "type": "docker",
             "status": "running",
             "restartPolicy": "always",
             "settings": {
               "image": "turbofandemo2cd74296.azurecr.io/edgemlsample:1",
               "createOptions": {}
             }
           }
        }
        
      • المسارات: سنتعامل مع المسارات كثيرًا في هذا البرنامج التعليمي. تحدد المسارات طريقة اتصال الوحدات ببعضها. المسار الموجود المعرف بواسطة القالب لا يتطابق مع المسار الذي نريده. حذف المسار .turbofanRulClassifierToIoTHub

        "$edgeHub": {
           "properties.desired": {
             "schemaVersion": "1.0",
             "routes": {
               "turbofanRulClassifierToIoTHub": "FROM /messages/modules/turbofanRulClassifier/outputs/* INTO $upstream"
             },
             "storeAndForwardConfiguration": {
               "timeToLiveSecs": 7200
             }
           }
        }
        
    • deployment.debug.template.json: يُعد هذا الملف هو إصدار التصحيح لملف deployment.template.json. ينبغي عادةً أن يظل هذا الملف متزامنًا مع محتوى ملف deployment.template.json، لكن هذا الأمر ليس ضروريًا في هذا البرنامج التعليمي.

    • .env: في هذا الملف، يجب أن توفر اسم المستخدم وكلمة المرور للوصول إلى سجلك الخاص.

      CONTAINER_REGISTRY_USERNAME_<your registry name>=<ACR username>
      CONTAINER_REGISTRY_PASSWORD_<your registry name>=<ACR password>
      

      إشعار

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

  10. في مستكشف Visual Studio Code، انقر بزر الماوس الأيمن فوق ملف deployment.template.json وحدد إنشاء حل IoT Edge.

  11. لاحظ أن هذا الأمر ينشئ مجلد تكوين يشتمل على ملف deployment.amd64.json. هذا الملف هو قالب النشر المادي لهذا الحل.

إضافة وحدة جهاز توجيه

بعد ذلك، نضيف وحدة جهاز التوجيه إلى الحل. تؤدي وحدة جهاز التوجيه العديد من المسؤوليات في هذا الحل:

  • تلقي الرسائل من أجهزة انتقال البيانات من الخادم: عند وصول الرسائل إلى جهاز IoT Edge من أجهزة انتقال البيانات من الخادم، تتلقى وحدة جهاز التوجيه الرسالة وتبدأ في تنسيق توجيه الرسالة.
  • إرسال رسائل إلى وحدة المصنف RUL: عند استلام رسالة جديدة من جهاز نهائي، تقوم وحدة جهاز التوجيه بتحويل الرسالة إلى التنسيق الذي يتوقعه المصنف RUL. ثم يرسل جهاز التوجيه الرسالة إلى مصنف RUL لتوقع RUL. بمجرد أن يقوم المصنف بالتوقع، فإنه يرسل الرسالة مرة أخرى إلى وحدة جهاز التوجيه.
  • إرسال رسائل RUL إلى مركز IoT: عندما يتلقى جهاز التوجيه رسائل من المصنف، فإنه يحول الرسالة بحيث تحتوي على المعلومات الأساسية فقط، ومعرف الجهاز وRUL، ويرسل الرسالة المختصرة إلى مركز IoT. وهناك ميزة أخرى مُحسنة لم نستخدمها هنا وهي إرسال الرسائل إلى مركز IoT فقط عندما يقل توقع RUL عن حد معين (مثال، عندما يكون RUL أقل من 100 دورة). إن تصفية الرسائل بهذه الطريقة يقلل من حجم الرسائل ويقلل أيضًا تكلفة مركز IoT.
  • إرسال الرسائل إلى وحدة كاتب Avro: للحفاظ على جميع البيانات التي أرسلها الجهاز النهائي، ترسل وحدة جهاز التوجيه الرسالة بالكامل التي استلمتها من المصنف إلى وحدة كاتب Avro، والتي ستحتفظ بالبيانات وتحملها باستخدام تحميل الملف في مركز IoT.

تمثل وحدة جهاز التوجيه جزءًا مهمًا من الحل الذي يضمن معالجة الرسائل بالترتيب الصحيح.

إنشاء الوحدة ونسخ الملفات

  1. انقر بزر الماوس الأيمن على مجلد الوحدات في Visual Studio Code واختر إضافة وحدة IoT Edge.

  2. اختر C# module لقالب الوحدة.

  3. قم بتسمية الوحدة باسم turbofanRouter.

  4. عند مطالبتك بمستودع صورة Docker، استخدم السجل من مساحة عمل التعلم الآلي (يمكنك العثور على السجل في العقدة registryCredentials الخاصة بالملف deployment.template.json). هذه القيمة هي العنوان المؤهل بالكامل للسجل، مثل registry.azurecr.io/turbofanrouter>.<

    إشعار

    في هذه المقالة، نستخدم سجل Azure Container Registry الذي تم إنشاؤه في مساحة العمل Azure Machine Learning. لقد صممنا هذا السجل لتسهيل الأمر عليك فقط. حيث كان من الممكن لنا إنشاء سجل حاوية جديد ونشر وحداتنا هناك.

  5. في الوحدة الطرفية التي تستخدم مفسر موجه الأوامر، انسخ الملفات من نموذج الوحدة إلى الحل.

    copy c:\source\IoTEdgeAndMlSample\EdgeModules\modules\turbofanRouter\*.cs c:\source\IoTEdgeAndMlSample\EdgeSolution\modules\turbofanRouter\
    
  6. اقبل الموجه بالكتابة فوق الملف program.cs.

إنشاء وحدة جهاز التوجيه

  1. في Visual Studio Code، حدد الوحدة الطرفية>تكوين مهمة إنشاء افتراضية.

  2. حدد الملف Create tasks.json من القالب.

  3. حدد .NET Core.

  4. استبدل محتويات tasks.json بالتعليمات البرمجية التالية.

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "build",
          "command": "dotnet",
          "type": "shell",
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "args": [
            "build",
            "${workspaceFolder}/modules/turbofanRouter"
          ],
          "presentation": {
            "reveal": "always"
          },
          "problemMatcher": "$msCompile"
        }
      ]
    }
    
  5. قم بحفظ tasks.json وإغلاقه.

  6. ابدأ الإنشاء باستخدام الوحدة الطرفية Ctrl + Shift + B أو تشغيل> مهمة الإنشاء.

إعداد مسارات الوحدة

كما ورد أعلاه، يستخدم وقت تشغيل IoT Edge المسارات المكونة في الملف deployment.template.json لإدارة الاتصال بين الوحدات المقترنة بشكل غير مُحكم. في هذا القسم، سنتعرف بعمق على كيفية إعداد المسارات لوحدة turbofanRouter. حيث سنتناول مسارات الإدخال أولاً ثم ننتقل إلى مسارات الإخراج.

الإدخالات

  1. في الأسلوب Init() من Program.cs، نسجل اثنين من الاستدعاءات لهذه الوحدة:

    await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromLeafDevice, LeafDeviceInputMessageHandler, ioTHubModuleClient);
    await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromClassifier, ClassifierCallbackMessageHandler, ioTHubModuleClient);
    
  2. يسمع الاستدعاء الأول الرسائل المرسلة إلى المتلقي deviceInput. من الرسم التخطيطي أعلاه، نرى أننا نريد توجيه الرسائل من أي جهاز انتقال البيانات من الخادم إلى هذا الإدخال. في الملف deployment.template.json، أضف مسارًا يخبر مركز Edge أن يقوم بتوجيه أي رسالة استلمها جهاز IoT Edge ولم ترسلها وحدة IoT Edge في الإدخال الذي يحمل الاسم "deviceInput" على وحدة turbofanRouter:

    "leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")"
    
  3. بعد ذلك، أضف مسارًا للرسائل من وحدة rulClassifier في وحدة turbofanRouter:

    "classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amloutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")"
    

المخرجات

أضف أربعة مسارات إضافية إلى معلمة التوجيه $edgeHub لمعالجة المخرجات من وحدة جهاز التوجيه.

  1. يقوم Program.cs بتعريف الأسلوب SendMessageToClassifier()، والذي يستخدم عميل الوحدة لإرسال رسالة إلى مصنف RUL باستخدام المسار:

    "routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")"
    
  2. يستخدم SendRulMessageToIotHub() عميل الوحدة لإرسال بيانات RUL فقط للجهاز إلى مركز IoT عبر المسار:

    "routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream"
    
  3. يستخدم SendMessageToAvroWriter() عميل الوحدة لإرسال الرسالة مع بيانات RUL المضافة إلى الوحدة avroFileWriter.

    "routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")"
    
  4. يرسل HandleBadMessage() رسائل فاشلة في المراحل التمهيدية لمركز IoT حيثما يمكن توجيهها في وقت لاحق.

    "deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
    

مع جميع المسارات التي تم أخذها معا يجب أن تبدو عقدة "$edgeHub" الخاصة بك مثل JSON التالية:

"$edgeHub": {
  "properties.desired": {
    "schemaVersion": "1.0",
    "routes": {
      "leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")",
      "classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amlOutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")",
      "routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")",
      "routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream",
      "routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")",
      "deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
    },
    "storeAndForwardConfiguration": {
      "timeToLiveSecs": 7200
    }
  }
}

إشعار

إضافة وحدة turbofanRouter التي أنشأت المسار الإضافي التالي:turbofanRouterToIoTHub": "FROM /messages/modules/turbofanRouter/outputs/* INTO $upstream. قم بإزالة هذا المسار، تاركًا المسارات الواردة أعلاه فقط في ملف deployment.template.json لديك.

إضافة وحدة كاتب Avro

تؤدي وحدة كاتب Avro بدورين في هذا الحل، لتخزين الرسائل وتحميل الملفات.

  • تخزين الرسائل: عندما تتلقى وحدة كاتب Avro رسالة، فإنها تكتب الرسالة إلى نظام الملفات المحلي بتنسيق Avro. نستخدم تحميل الربط، الذي يقوم بتحميل دليل (في هذه الحالة /data/avrofiles) في مسار في حاوية الوحدة النمطية. يسمح هذا التثبيت للوحدة بالكتابة إلى مسار محلي (/avrofiles) والوصول إلى هذه الملفات من جهاز IoT Edge مباشرةً.

  • تحميل الملفات: تستخدم وحدة كاتب Avro ميزة تحميل الملفات في مركز Azure IoT لتحميل الملفات إلى حساب تخزين Azure. بمجرد تحميل ملف بنجاح، تقوم الوحدة بحذف الملف من القرص

إنشاء وحدة ونسخ الملفات

  1. في Visual Studio Code، حدد عرض>لوحة الأوامرثم ابحث عن Python: تحديد مترجم وحدده.

  2. حدد الإصدار 3.7 المثبت من Python أو أي إصدار أحدث.

  3. انقر بزر الماوس الأيمن على مجلد الوحدات في Visual Studio Code واختر إضافة وحدة IoT Edge.

  4. اختر Python Module.

  5. قم بتسمية الوحدة avroFileWriter.

  6. عند مطالبتك بمستودع صورة Docker، استخدم السجل نفسه الذي استخدمته عند إضافة وحدة جهاز التوجيه.

  7. انسخ الملفات من نموذج الوحدة إلى الحل.

    copy C:\source\IoTEdgeAndMlSample\EdgeModules\modules\avroFileWriter\*.py C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avroFileWriter\
    
  8. اقبل أن تتم الكتابة فوق main.py.

  9. لاحظ إضافة filemanager.py وschema.py إلى الحل وتحديث main.py.

إشعار

عندما تفتح ملف Python، ربما يظهر لك أمر يطالبك بتثبيت pylint. لست بحاجة إلى تثبيت linter لإكمال هذا البرنامج التعليمي.

تثبيت مترابط لملفات البيانات

كما ذكرنا سابقا، تعتمد وحدة الكاتب على وجود تحميل ربط لكتابة ملفات Avro إلى نظام ملفات الجهاز.

إضافة دليل إلى الجهاز

  1. في مدخل Azure، ابدأ تشغيل الجهاز الظاهري IoT Edge إذا لم يكن قيد التشغيل. اتصل بالمدخل باستخدام SSH. يتطلب هذا الاتصال اسم DNS الذي يمكنك نسخه من صفحة النظرة العامة للجهاز الظاهري في مدخل Azure.

    ssh -l <user>@<vm name>.<region>.cloudapp.azure.com
    
  2. بعد تسجيل الدخول، أنشئ الدليل الذي سيحتفظ برسائل جهاز انتقال البيانات من الخادم المحفوظة.

    sudo mkdir -p /data/avrofiles
    
  3. قم بتحديث أذونات الدليل بحيث يمكن كتابته بواسطة الحاوية.

    sudo chmod ugo+rw /data/avrofiles
    
  4. تحقق الآن من أن الدليل يمتلك إذن الكتابة (w) الخاصة بالمستخدم والمجموعة والمالك.

    ls -la /data
    

    أذونات الدليل لملفات avro

إضافة دليل إلى الوحدة

لإضافة الدليل إلى حاوية الوحدة النمطية، سنقوم بتعديل Dockerfiles المقترنة بالوحدة النمطية avroFileWriter. توجد ثلاثة ملفات Docker مقترنة بالوحدة هي: Dockerfile.amd64 وDockerfile.amd64.debug وDockerfile.arm32v7. يجب أن تظل هذه الملفات متزامنة في حالة أن أردنا التصحيح أو النشر على جهاز arm32. في هذه المقالة، يتم التركيز على Dockerfile.amd64 فقط.

  1. على الجهاز الظاهري الخاص بالتطوير لديك، افتح الملف C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\Dockerfile.amd64.

  2. يجب تعديل الملف بحيث يظهر كما في المثال التالي:

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev
    python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/*
    
    RUN pip3 install --upgrade pip
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    USER moduleuser
    
    CMD [ "python3", "-u", "./main.py" ]
    

    الأمران mkdir وchown يرشدان Docker في عملية الإنشاء بحيث يقوم بإنشاء دليل بمستوى عالٍ يُسمى /avrofiles في الصورة، ثم يجعل مستخدم الوحدة هو مالك الدليل. من المهم إدراج هذه الأوامر بعد إضافة مستخدم الوحدة إلى الصورة باستخدام الأمر useradd وقبل تبديل السياق إلى مستخدم الوحدة (مستخدم الوحدة USER).

  3. وإذا لزم الأمر، قم بإجراء تغييرات متوافقة على Dockerfile.amd64.debug وDockerfile.arm32v7.

إضافة تكوين الربط إلى avroFileWriter

الخطوة الأخيرة من خطوات إنشاء الربط هي تحديث الملف deployment.template.json (والملف deployment.debug.template.json) بمعلومات الربط.

  1. افتح الملف deployment.template.json.

  2. قم بتعديل تعريف الوحدة الخاص بـ avroFileWriter بإضافة المعلمة Binds التي توجه دليل الحاوية /avrofiles إلى الدليل المحلي على جهاز Edge. يجب أن يتطابق تعريف الوحدة مع المثال التالي:

    "avroFileWriter": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "${MODULES.avroFileWriter}",
        "createOptions": {
          "HostConfig": {
            "Binds": [
              "/data/avrofiles:/avrofiles"
            ]
          }
        }
      }
    }
    

تثبيت مترابط للوصول إلى config.yaml

يجب إضافة عملية ربط أخرى لوحدة الكاتب. يمنح هذا الربط للوحدة إمكانية الوصول لقراءة سلسلة الاتصال من الملف /etc/iotedge/config.yaml على جهاز IoT Edge. نحن بحاجة إلى سلسلة الاتصال لإنشاء IoTHubClient حتى نتمكن من استدعاء أسلوب upload_blob_async لتحميل الملفات إلى مركز IoT. تتشابه خطوات إضافة هذا الربط بتلك الخطوات الواردة في القسم السابق.

إذن تحديث الدليل

  1. اتصل بجهاز IoT Edge باستخدام SSH.

    ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.com
    
  2. أضف إذن القراءة إلى الملف config.yaml.

    sudo chmod +r /etc/iotedge/config.yaml
    
  3. تحقق من صحة تعيين الأذونات بشكل صحيح.

    ls -la /etc/iotedge/
    
  4. تأكد من أن أذونات الملف config.yaml هي -r--r--r--.

إضافة دليل إلى الوحدة

  1. على جهاز التطوير لديك، افتح الملف Dockerfile.amd64.

  2. أضف مجموعة إضافية من أوامر mkdirوchown إلى الملف بحيث يبدو مثل:

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev
    python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/\*
    
    RUN pip3 install --upgrade pip
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig
    
    USER moduleuser
    
    CMD "python3", "-u", "./main.py"]
    
  3. إجراء التغييرات ذات الصلة على الملفين Dockerfile.amd64.debug وDockerfile.arm32v7.

تحديث تكوين الوحدة

  1. افتح الملف deployment.template.json.

  2. قم بتعديل تعريف الوحدة الخاص بـ avroFileWriter بإضافة سطر ثانٍ إلى المعلمة Binds التي توجه دليل الحاوية (/app/iotconfig) إلى الدليل المحلي على الجهاز (/etc/iotedge).

    "avroFileWriter": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "${MODULES.avroFileWriter}",
        "createOptions": {
          "HostConfig": {
            "Binds": [
              "/data/avrofiles:/avrofiles",
              "/etc/iotedge:/app/iotconfig"
            ]
          }
        }
      }
    }
    
  3. قم بإجراء التغييرات ذات الصلة على الملف deployment.debug.template.json.

تثبيت التبعيات

توزع وحدة الكاتب التبعيات على مكتبتين Python هما؛ fastavro وPyYAML. نحن بحاجة إلى تثبيت التبعيات على جهاز التطوير الخاص بنا وإرشاد عملية بناء Docker لتثبيتها في صورة الوحدة النمطية الخاصة بنا.

PyYAML

  1. على جهاز التطوير لديك، افتح الملف C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\requirements.txt وأضف "pyyaml" على سطر جديد في الملف.

    azure-iothub-device-client~=1.4.3
    pyyaml
    
  2. افتح الملف Dockerfile.amd64 ثم أضف الأمر pip install لترقية أدوات الإعداد.

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && \
        apt-get install -y --no-install-recommends libcurl4-openssl-dev python3-pip libboost-python1.58-dev libpython3-dev && \
        rm -rf /var/lib/apt/lists/\*
    
    RUN pip3 install --upgrade pip
    RUN pip install -U pip setuptools
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig
    USER moduleuser
    
    CMD [ "python3", "-u", "./main.py" ]
    
  3. في موجه الأوامر، قم بتثبيت pyyaml على جهاز التطوير.

    pip install pyyaml
    

Fastavro

  1. في الملف requirements.txt، أضف fastavro بعد pyyaml.

    azure-iothub-device-client~=1.4.3
    pyyaml
    fastavro
    
  2. قم بتثبيت fastavro على جهاز التطوير.

    pip install fastavro
    

إعادة تكوين مركز IoT

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

إشعار

يجب إعادة تكوين المركز قبل نشر الوحدات لأن بعض إعدادات المركز، وخصوصًا تحميل الملفات، تحتاج إلى إعداد الوحدة avroFileWriter بشكل سليم بحيث يمكن لتشغيلها بشكل صحيح

إعداد مسار رسائل RUL في مركز IoT

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

إنشاء مسار رسالة RUL

  1. في مدخل Azure، انتقل إلى مركز IoT.

  2. من القائمة الموجودة في الجزء الأيمن، ضمن Hub settings، حدد Message routing.

  3. في علامة التبويب المسارات، حدد إضافة.

  4. قم بتسمية المسار بالاسم RulMessageRoute.

  5. حدد إضافة نقطة نهاية إلى يمين محدد نقطة النهاية واختر تخزين.

  6. في صفحة إضافة نقطة نهاية التخزين، قم بتسمية نقطة النهاية بالاسم ruldata.

  7. حدد "Pick a container".

  8. في صفحة حسابات التخزين، ابحث عن حساب التخزين الذي تستخدمه خلال هذا البرنامج التعليمي، والذي يسمى مثل لاحقة> iotedgeandml<الفريدة.

  9. حدد الحاوية ruldata وانقر فوق تحديد.

  10. ارجع إلى صفحة إضافة نقطة نهاية التخزين، حدد إنشاء لإنشاء نقطة نهاية التخزين.

  11. ارجع إلى صفحة إضافة مسار، فياستعلام التوجيه، استبدل true بالاستعلام التالي:

    IS_DEFINED($body.PredictedRul) AND NOT IS_DEFINED($body.OperationalSetting1)
    
  12. قم بتوسيع قسم الاختبار ثم قسم نص الرسالة. استبدل نص الرسالة بهذا المثال من الرسائل المتوقعة:

    {
      "ConnectionDeviceId": "aaLeafDevice_1",
      "CorrelationId": "b27e97bb-06c5-4553-a064-e9ad59c0fdd3",
      "PredictedRul": 132.62721409309165,
      "CycleTime": 64.0
    }
    
  13. حدد اختبار المسار. إذا نجح الاختبار، فسترى "الرسالة تطابقت مع الاستعلام."

  14. انقر فوق حفظ.

تحديث مسار turbofanDeviceDataToStorage

لا نريد توجيه بيانات التوقعات الجديدة إلى موقع التخزين القديم، لذا قم بتحديث المسار للحد من ذلك.

  1. في صفحة توجيه الرسائلفي مركز IoT، حدد علامة التبويب المسارات.

  2. حدد turbofanDeviceDataToStorage، أو أيًا كان الاسم الذي سمّيت به مسار البيانات الأولي على جهازك.

  3. تحديث استعلام التوجيه إلى

    IS_DEFINED($body.OperationalSetting1)
    
  4. قم بتوسيع قسم الاختبار ثم قسم نص الرسالة. استبدل الرسالة بهذا المثال من رسائلنا المتوقعة:

    {
      "Sensor13": 2387.96,
      "OperationalSetting1": -0.0008,
      "Sensor6": 21.61,
      "Sensor11": 47.2,
      "Sensor9": 9061.45,
      "Sensor4": 1397.86,
      "Sensor14": 8140.39,
      "Sensor18": 2388.0,
      "Sensor12": 522.87,
      "Sensor2": 642.42,
      "Sensor17": 391.0,
      "OperationalSetting3": 100.0,
      "Sensor1": 518.67,
      "OperationalSetting2": 0.0002,
      "Sensor20": 39.03,
      "DeviceId": 19.0,
      "Sensor5": 14.62,
      "PredictedRul": 212.00132402791962,
      "Sensor8": 2388.01,
      "Sensor16": 0.03,
      "CycleTime": 42.0,
      "Sensor21": 23.3188,
      "Sensor15": 8.3773,
      "Sensor3": 1580.09,
      "Sensor10": 1.3,
      "Sensor7": 554.57,
      "Sensor19": 100.0
    }
    
  5. حدد اختبار المسار. إذا نجح الاختبار، فسترى "الرسالة تطابقت مع الاستعلام."

  6. حدد حفظ.

تكوين تحميل الملف

قم بتكوين ميزة تحميل الملفات في مركز IoT لتمكين وحدة كاتب الملفات من تحميل الملفات إلى موقع التخزين.

  1. من قائمة الجزء الأيمن في IoT Hub، ضمن Hub settings، اختر File upload.

  2. حدد حاوية Azure Storage.

  3. حدد حساب التخزين الخاص بك من القائمة.

  4. حدد الحاوية التي تبدأ بـ azureml-blobstore الملحقة بمعرف فريد عالمي وانقر فوق تحديد.

  5. حدد حفظ. ينبهك المدخل عند اكتمال الحفظ.

إشعار

لا نشغل إعلام التحميل لهذا البرنامج التعليمي، ولكن انظر استلام إعلام تحميل الملف للحصول على تفاصيل حول كيفية التعامل مع إعلامات تحميل الملف.

إنشاء الوحدات ونشرها وتوزيعها

الآن بعد أن أجرينا تغييرات على التكوين، نحن مستعدون لإنشاء الصور ونشرها في سجل حاويات Azure. تستخدم عملية الإنشاء الملف deployment.template.json لتحديد الوحدات التي يجب إنشاؤها. يمكن العثور على إعدادات كل وحدة، بما في ذلك الإصدار، في الملف module.json في مجلد الوحدات. تقوم عملية الإنشاء أولا بإنشاء Docker على ملفات Docker تتطابق مع التكوين الحالي الموجود في الملف module.json لإنشاء صورة. ثم يقوم بنشر الصورة في السجل من الملف module.json مع علامة إصدار مطابقة لتلك الموجودة في الملف module.json. وأخيرًا، يقوم بإنتاج بيان نشر مخصص للتكوين (مثل، deployment.amd64.json)، الذي سننشره على جهاز IoT Edge. يقرأ جهاز IoT Edge المعلومات من بيان النشر، وبناء على الإرشادات سيقوم بتنزيل الوحدات وتكوين المسارات وتعيين أي خصائص المطلوبة. يؤدي هذا الأسلوب في النشر إلى نتيجتين يجب أن تكون على دراية بهما:

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

  • إصدارات الوحدة النمطية مهمة: إذا قمت بنشر إصدار جديد من حاوية الوحدة النمطية إلى سجل الحاوية باستخدام نفس علامات الإصدار مثل الوحدة النمطية السابقة، فلن يقوم وقت التشغيل بتنزيل الإصدار الجديد من الوحدة النمطية. يقوم بمقارنة علامة الإصدار للصورة المحلية والصورة المطلوبة من بيان النشر. إذا تطابقت هذه الإصدارات، فلا يقوم وقت التشغيل بأي إجراء. لذلك، من المهم زيادة إصدار الوحدة في كل مرة ترغب في نشر تغييرات جديدة. قم بزيادة الإصدار عن طريق تغيير خاصية الإصدار ضمن خاصية العلامة في ملف module.json للوحدة التي تقوم بتغييرها. ثم قم بإنشاء ونشر الوحدة.

    {
      "$schema-version": "0.0.1",
      "description": "",
      "image": {
        "repository": "<your registry>.azurecr.io/avrofilewriter",
        "tag": {
          "version": "0.0.1",
          "platforms": {
            "amd64": "./Dockerfile.amd64",
            "amd64.debug": "./Dockerfile.amd64.debug",
            "arm32v7": "./Dockerfile.arm32v7"
          }
        },
        "buildOptions": []
      },
      "language": "python"
    }
    

الحفظ والنشر

  1. على الجهاز الظاهري للتطوير لديك، ابدأ تشغيل Docker إذا لم يكن قيد التشغيل بالفعل.

  2. في Visual Studio Code، ابدأ تشغيل وحدة طرفية جديدة مع موجه الأوامر، ثم سجّل الدخول إلى سجل حاويات Azure (ACR).

يمكنك العثور على اسم المستخدم المطلوب وكلمة المرور وقيم خادم تسجيل الدخول في مدخل Azure. اسم سجل الحاوية له تنسيق "معرف> turbofandemo<الفريد". من قائمة الجزء الأيسر، أسفل الإعدادات، حدد مفاتيح الاختصار لعرضها.

docker login -u <ACR username> -p <ACR password> <ACR login server>
  1. في Visual Studio Code، انقر بزر الماوس الأيمن فوق ملف deployment.template.json واختر إنشاء وتنفيذ الحل IoT Edge.

عرض الوحدات في السجل

بمجرد اكتمال عملية الإنشاء بنجاح، سنتمكن من استخدام مدخل Azure لمراجعة وحداتنا المنشورة.

  1. افتح سجل حاويات Azure لهذا البرنامج التعليمي. اسم سجل الحاوية له تنسيق "معرف> turbofandemo<الفريد".

  2. من قائمة الجزء الأيمن، ضمن الخدمات، حدد مستودعات.

  3. لاحظ أن كلتا الوحدتين التي قمت بإنشائهما، avrofilewriter وturbofanrouterتظهران كمستودعات.

  4. حدد turbofanrouter ولاحظ أنك نشرت صورة واحدة موسومة على أنها 0.0.1-amd64.

    عرض أول إصدار موسوم من turbofanrouter

نشر الوحدات في جهاز IoT Edge

لقد قمنا بإنشاء وتكوين وحدات في الحل لدينا، والآن سننشر هذه الوحدات في جهاز IoT Edge.

  1. في Visual Studio Code، انقر بزر الماوس الأيمن فوق الملف deployment.amd64.json في مجلد التكوين.

  2. اختر إنشاء عملية نشر لجهاز واحد.

  3. اختر جهاز IoT Edge الخاص بك، aaTurboFanEdgeDevice.

  4. قم بتحديث لوحة أجهزة مركز Azure IoT في مستكشف Visual Studio Code. يجب أن تلاحظ نشر الوحدات الجديدة الثلاث، لكن لم يتم تشغيلها بعد.

  5. قم بالتحديث مرة أخرى بعد بضع دقائق، وسوف ترى الوحدات تعمل.

    عرض الوحدات التي قيد التشغيل في Visual Studio Code

إشعار

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

تشخيص الأعطال

في هذا القسم، نشارك بعض التقنيات التي تفهم من خلالها ما حدث من أعطال في وحدة معينة أو الوحدات. يمكن رصد أي عطل في العادة أولا من الحالة في Visual Studio Code.

تحديد الوحدات المعطلة

  • Visual Studio Code: انظر إلى لوحة أجهزة مركز Azure IoT. إذا كانت معظم الوحدات فيد التشغيل ولكن تم إيقاف واحد منها، فأنت بحاجة إلى فحص هذه الوحدة المتوقفة بشكل أكبر. في حال توقف كل الوحدات لفترة طويلة، فربما يشير ذلك إلى حدوث عطل.

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

التشخيص من الجهاز

من خلال تسجيل الدخول إلى جهاز IoT Edge (جهاز Linux VM في حالتنا)، يمكنك الحصول على المزيد من المعلومات حول حالة الوحدات لديك. الآلية الرئيسية التي نستخدمها هي أوامر Docker التي تسمح لنا بفحص الحاويات والصور على الجهاز.

  1. تسجيل الدخول إلى جهاز IoT Edge:

    ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.com
    
  2. إدراج جميع الحاويات التي قيد التشغيل. نتوقع أن نرى حاوية لكل وحدة تحمل اسم يتوافق مع الوحدة. أيضًا، يقوم هذا الأمر بإدراج الصورة الدقيقة للحاوية، بما في ذلك الإصدار، بحيث تتمكن من مطابقتها لتوقعاتك. يمكنك أيضا سرد الصور عن طريق استبدال "صورة" ل "حاوية" في الأمر.

    sudo docker container ls
    
  3. الحصول على السجلات الخاصة بأي حاوية. يقوم هذا الأمر بإخراج كل ما كُتب إلى StdErr وStdOut في الحاوية. يفيد هذا الأمر الحاويات التي بدأت ثم توقفت لسبب ما. كما أنه مفيد لما يحدث مع حاويات edgeAgent أو edgeHub.

    sudo docker container logs <container id>
    
  4. فحص حاوية. يقدم هذا الأمر قدرًا هائلاً من المعلومات حول الصورة. يمكن تصفية البيانات اعتمادًا على ما تبحث عنه. على سبيل المثال، يمكنك استخدام هذا الأمر إذا كنت تريد معرفة ما إذا كانت عمليات الربط على avroFileWriter صحيحة:

    sudo docker container inspect -f "{{ json .Mounts }}" avroFileWriter | python -m json.tool
    
  5. الاتصال بحاوية قيد التشغيل. يمكن أن يكون هذا الأمر مفيدًا إذا كنت تريد فحص الحاوية في أثناء تشغيلها:

    sudo docker exec -it avroFileWriter bash
    

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

يمثل هذا البرنامج التعليمي جزءًا من مجموعة حيث تعتمد كل مقالة على العمل المنجز في المقالات السابقة. يرجى الانتظار، إذ يتم تنظيف أي موارد، وبعدها يمكنك إكمال البرنامج التعليمي النهائي.

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

في هذه المقالة، أنشأنا حل IoT Edge في Visual Studio Code باستخدام ثلاث وحدات: مصنف، وجهاز توجيه، وكاتب/مُحمّل ملفات. لقد قمنا بإعداد المسارات للسماح للوحدات بالاتصال ببعضها على جهاز Edge. قمنا بتعديل تكوين جهاز الحافة، وتحديث Dockerfiles لتثبيت التبعيات وإضافة عمليات تحميل الربط إلى حاويات الوحدات النمطية.

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

تابع المقالة التالية لبدء إرسال البيانات وتنفيذ الحل على أرض الواقع.