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

ينطبق على:علامة اختيار IoT Edge 1.4 IoT Edge 1.4

هام

IoT Edge 1.5 LTS وIoT Edge 1.4 هي إصدارات مدعومة. IoT Edge 1.4 LTS هو نهاية العمر الافتراضي في 12 نوفمبر 2024. إذا كنت تستخدم إصدارا سابقا، فشاهد تحديث IoT Edge.

يستعرض هذا البرنامج التعليمي تطوير التعليمات البرمجية الخاصة بك وتصحيح الأخطاء ونشرها على جهاز IoT Edge باستخدام IoT Edge ل Linux على Windows وVisual Studio 2022. ستتعلم سيناريو المطور الأكثر شيوعا لحلول IoT Edge من خلال نشر وحدة C# على جهاز Linux. ستقوم بنشر وتصحيح وحدة Azure IoT Edge مخصصة تعمل في حاوية Linux على Windows (EFLOW). حتى إذا كنت تخطط لاستخدام لغة مختلفة أو نشر خدمة Azure، فإن هذا البرنامج التعليمي لا يزال مفيدًا للتعرف على أدوات ومفاهيم التطوير.

تتضمن هذه المقالة خطوات لأدوتي تطوير IoT Edge:

  • واجهة سطر الأوامر (CLI) هي الأداة المفضلة للتطوير.
  • أدوات Azure IoT Edge لملحق Visual Studio . الملحق في وضع الصيانة.

استخدم زر محدد الأداة في بداية هذه المقالة لتحديد إصدار الأداة.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إعداد جهاز التطوير الخاص بك.
  • استخدم أدوات IoT Edge للتعليمات البرمجية Visual Studio لإنشاء مشروع جديد.
  • إنشاء المشروع كحاوية وتخزينه في تسجيل حاوية Azure.
  • نشر التعليمات البرمجية إلى جهاز IoT Edge.

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

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

بعد أن يكون Visual Studio 2022 جاهزا، تحتاج أيضا إلى الأدوات والمكونات التالية:

  • قم بتنزيل وتثبيت أدوات Azure IoT Edge من Visual Studio Marketplace. يمكنك استخدام ملحق Azure IoT Edge Tools لإنشاء حل IoT Edge الخاص بك وبنائه. أداة التطوير المفضلة هي سطر الأوامر (CLI) Azure IoT Edge Dev Tool. يتضمن الملحق قوالب مشروع Azure IoT Edge المستخدمة لإنشاء مشروع Visual Studio. حاليا، تحتاج إلى تثبيت الملحق بغض النظر عن أداة التطوير التي تستخدمها.

    هام

    ملحق Azure IoT Edge Tools for VS 2022 في وضع الصيانة. أداة التطوير المفضلة هي سطر الأوامر (CLI) Azure IoT Edge Dev Tool.

    تلميح

    إذا كنت تستخدم Visual Studio 2019، فقم بتنزيل وتثبيت أدوات Azure IoT Edge ل VS 2019 من سوق Visual Studio.

موارد السحابة:

  • مركز IoTمجاني أو قياسي المستوى في Azure.

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

المفاهيم الرئيسية

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

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

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

إعداد اتصال docker-cli ومحرك Docker عن بعد

يتم حزم وحدات IoT Edge كحاويات، لذلك تحتاج إلى محرك حاوية على جهاز التطوير الخاص بك لبناء وإدارة هذه الوحدات. يحتوي الجهاز الظاهري EFLOW بالفعل على مثيل لمحرك Docker، لذلك يوضح لك هذا البرنامج التعليمي كيفية الاتصال عن بعد من جهاز مطور Windows بمثيل EFLOW VM Docker. باستخدام هذا، نقوم بإزالة التبعية على Docker Desktop لنظام التشغيل Windows.

الخطوة الأولى هي تكوين docker-cli على جهاز تطوير Windows لتكون قادرة على الاتصال بمحرك docker البعيد.

  1. قم بتنزيل إصدار docker.exe المحوسب مسبقا من docker-cli من docker-cli Chocolatey. يمكنك أيضا تنزيل مشروع cli الرسمي من docker/cli GitHub وتحويله برمجيا باتباع تعليمات المستودع.
  2. استخراج docker.exe إلى دليل في جهاز التطوير الخاص بك. على سبيل المثال، C:\Docker\bin
  3. فتح حول الكمبيوتر ->معلومات النظام ->إعدادات النظام المتقدمة
  4. حدد Advanced ->Environment variables -> ضمن User variables check Path
  5. تحرير متغير المسار وإضافة موقع docker.exe
  6. فتح جلسة عمل PowerShell غير مقيدة
  7. تحقق من أن Docker CLI يمكن الوصول إليه باستخدام الأمر
    docker --version
    

إذا تم تكوين كل شيء بنجاح، يجب أن يقوم الأمر السابق إخراج إصدار docker، شيء مثل إصدار Docker 20.10.12، بناء e91ed57.

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

تحذير

قد يؤدي تعريض محرك Docker للاتصالات الخارجية إلى زيادة مخاطر الأمان. يجب استخدام هذا التكوين فقط لأغراض التطوير. تأكد من إعادة التكوين إلى الإعدادات الافتراضية بعد انتهاء التطوير.

  1. افتح جلسة عمل PowerShell غير مقيدة وقم بتشغيل الأوامر التالية

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    فيما يلي مثال على الإخراج.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. الخطوة الأخيرة هي اختبار اتصال Docker بمحرك EFLOW VM Docker. أولا، تحتاج إلى عنوان IP الخاص ب EFLOW VM.

    Get-EflowVmAddr
    

    تلميح

    إذا تم نشر EFLOW VM بدون IP ثابت، فقد يتغير عنوان IP عبر عمليات إعادة تشغيل نظام التشغيل المضيف ل Windows أو تغييرات الشبكات. تأكد من استخدام عنوان IP الصحيح ل EFLOW VM في كل مرة تريد فيها إنشاء اتصال محرك Docker بعيد.

    فيما يلي مثال على الإخراج.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. باستخدام عنوان IP الذي تم الحصول عليه، اتصل بمحرك EFLOW VM Docker، وقم بتشغيل حاوية عينة Hello-World. استبدل <EFLOW-VM-IP> بعنوان IP الخاص بجهاز EFLOW الظاهري الذي تم الحصول عليه في الخطوة السابقة.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

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

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

إنشاء مشروع Azure IoT Edge

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

هام

بنية مشروع IoT Edge التي تم إنشاؤها بواسطة Visual Studio ليست هي نفسها الموجودة في Visual Studio Code.

حاليا، لا يدعم Azure IoT Edge Dev Tool CLI إنشاء نوع مشروع Visual Studio. تحتاج إلى استخدام ملحق Visual Studio IoT Edge لإنشاء مشروع Visual Studio.

  1. في Visual Studio، قم بإنشاء مشروع جديد.

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

  3. في صفحة تكوين مشروعك الجديد، أدخل اسما لمشروعك وحدد الموقع، ثم حدد إنشاء.

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

  5. في عنوان URL للمستودع، قم بتوفير اسم مستودع صور الوحدة النمطية. يقوم Visual Studio بملء اسم الوحدة النمطية تلقائيا باسم localhost:5000/<your module name>. استبدله بمعلومات التسجيل الخاصة بك. استخدم localhost إذا كنت تستخدم سجل Docker محليا للاختبار. إذا كنت تستخدم حاوية تسجيل Azure، ثم استخدم ملقم تسجيل الدخول من إعدادات التسجيل الخاص بك. يبدو خادم تسجيل الدخول مثل <اسم> السجل.azurecr.io. استبدل فقط جزء localhost:5000 من السلسلة بحيث تبدو النتيجة النهائية مثل< اسم> السجل.azurecr.io/< اسم> الوحدة النمطية.

  6. حدد إضافة لإضافة الوحدة النمطية إلى المشروع.

    لقطة شاشة لإضافة كيفية إضافة تطبيق وحدة نمطية إلى حل Visual Studio

    إشعار

    إذا كان لديك مشروع IoT Edge موجود، يمكنك تغيير عنوان URL للمستودع عن طريق فتح ملف module.json . يقع عنوان URL للمستودع في خاصية المستودع لملف JSON.

الآن، لديك مشروع IoT Edge والوحدة النمطية IoT Edge في حل Visual Studio الخاص بك.

بنية المشروع

في الحل الخاص بك، هناك مجلدان على مستوى المشروع بما في ذلك مجلد مشروع رئيسي ومجلد وحدة نمطية واحدة. على سبيل المثال، قد يكون لديك مجلد مشروع رئيسي يسمى AzureIotEdgeApp1 ومجلد وحدة نمطية يسمى IotEdgeModule1. يحتوي مجلد المشروع الرئيسي على بيان التوزيع الخاص بك.

يحتوي مجلد الوحدة النمطية على ملف للتعليمات البرمجية للوحدة النمطية الخاصة بك، باسم إما Program.cs أو main.c اعتمادا على اللغة التي اخترتها. يحتوي هذا المجلد أيضا على ملف يسمى module.json يصف بيانات التعريف للوحدة النمطية الخاصة بك. توفر ملفات Docker المختلفة المعلومات اللازمة لإنشاء الوحدة النمطية الخاصة بك كحاوية Windows أو Linux.

بيان التوزيع لمشروعك

يسمى deployment.debug.template.jsonبيان النشر الذي تقوم بتحريره . هذا الملف هو قالب من بيان توزيع IoT Edge الذي يحدد جميع الوحدات النمطية التي تعمل على جهاز جنبا إلى جنب مع كيفية تواصلها مع بعضها البعض. لمزيد من المعلومات حول بيانات النشر، راجع التعرف على كيفية نشر الوحدات النمطية وإنشاء المسارات.

إذا فتحت قالب النشر هذا، فسترى أن وحدتي وقت التشغيل، edgeAgent وedgeHub مضمنتان، جنبا إلى جنب مع الوحدة النمطية المخصصة التي قمت بإنشائها في مشروع Visual Studio هذا. يتم أيضا تضمين وحدة نمطية رابعة تسمى SimulatedTemperatureSensor . تنشئ هذه الوحدة النمطية الافتراضية بيانات محاكاة يمكنك استخدامها لاختبار الوحدات النمطية الخاصة بك، أو حذفها إذا لم يكن ذلك ضروريا. لمعرفة كيفية عمل مستشعر درجة الحرارة المحاكية، اعرض التعليمة البرمجية المصدر SimulatedTemperatureSensor.csproj.

تعيين إصدار وقت تشغيل IoT Edge

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

  1. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق اسم المشروع الرئيسي وحدد تعيين إصدار وقت تشغيل IoT Edge.

    لقطة شاشة لكيفية العثور على عنصر القائمة المسمى

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

    حاليا، لا يتضمن الملحق تحديدا لأحدث إصدارات وقت التشغيل. إذا كنت تريد تعيين إصدار وقت التشغيل الأعلى من 1.2، فافتح ملف بيان التوزيع deployment.debug.template.json . تغيير إصدار وقت التشغيل لصور وحدة وقت تشغيل النظام edgeAgent وedgeHub. على سبيل المثال، إذا كنت تريد استخدام الإصدار 1.4 من وقت تشغيل IoT Edge، فقم بتغيير الأسطر التالية في ملف بيان التوزيع:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. إذا قمت بتغيير الإصدار، فقم بإعادة إنشاء بيان النشر بالنقر بزر الماوس الأيمن فوق اسم مشروعك وتحديد إنشاء نشر ل IoT Edge. يؤدي هذا إلى إنشاء بيان نشر استنادا إلى قالب التوزيع الخاص بك ويظهر في مجلد التكوين لمشروع Visual Studio الخاص بك.

  1. افتح ملف بيان توزيع deployment.debug.template.json . بيان النشر هو مستند JSON يصف الوحدات النمطية التي سيتم تكوينها على جهاز IoT Edge المستهدف.

  2. تغيير إصدار وقت التشغيل لصور وحدة وقت تشغيل النظام edgeAgent وedgeHub. على سبيل المثال، إذا كنت تريد استخدام الإصدار 1.4 من وقت تشغيل IoT Edge، فقم بتغيير الأسطر التالية في ملف بيان التوزيع:

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

إعداد مثيل محرك Docker البعيد Visual Studio 2022

استخدم ملحق أدوات Azure IoT Edge وقم بتكوينه لاستخدام محرك Docker البعيد الذي يعمل داخل الجهاز الظاهري EFLOW.

  1. حدد Tools ->Azure IoT Edge tools ->IoT Edge tools settings...

  2. استبدل قيمة المضيف المحلي DOCKER_HOST بعنوان IP الخاص بجهاز EFLOW الظاهري. إذا كنت لا تتذكر عنوان IP، فاستخدم EFLOW PowerShell cmdlet Get-EflowVmAddr للحصول عليه. لل exmaple، إذا كان عنوان IP ل EFLOW VM هو 172.20.1.100، فيجب tcp://172.20.1.100:2375 القيمة الجديدة.

    لقطة شاشة لإعدادات أدوات IoT Edge

  3. حدد موافق

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

عند إضافة وحدة نمطية جديدة، تأتي مع التعليمات البرمجية الافتراضية الجاهزة للبناء والنشر على جهاز بحيث يمكنك بدء الاختبار دون لمس أي تعليمة برمجية. توجد التعليمات البرمجية للوحدة النمطية داخل مجلد الوحدة النمطية في ملف يسمى Program.cs (ل C#) أو main.c (ل C).

يتم إنشاء الحل الافتراضي بحيث يتم توجيه البيانات المحاكاة من الوحدة النمطية SimulatedTemperatureSensor إلى الوحدة النمطية الخاصة بك، والتي تأخذ الإدخال ثم ترسلها إلى IoT Hub.

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

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

عادة، ستحتاج إلى اختبار وتصحيح كل وحدة نمطية قبل تشغيلها داخل حل كامل مع وحدات متعددة. نظرا لأن الحل سيتم بناءه أو تصحيحه باستخدام محرك Docker الذي يعمل داخل EFLOW VM، فإن الخطوة الأولى هي إنشاء الوحدة النمطية ونشرها لتمكين تصحيح الأخطاء عن بعد.

  1. في مستكشف الحلول، حدد مجلد مشروع الوحدة النمطية وقم بتمييزه (على سبيل المثال، myIotEdgeModule). تعيين الوحدة النمطية المخصصة كمشروع بدء التشغيل. حدد Project>Set ك StartUp Project من القائمة.

  2. لتصحيح أخطاء وحدة C# Linux، نحتاج إلى تحديث ملف Dockerfile.amd64.debug لتمكين خدمة SSH. قم بتحديث ملف Dockerfile.amd64.debug لاستخدام القالب التالي: Dockerfile لوحدة Azure IoT Edge AMD64 C# النمطية مع دعم تتبع الأخطاء عن بعد.

    إشعار

    عند اختيار Debug، يستخدم Dockerfile.(amd64|windows-amd64).debug Visual Studio لإنشاء صور Docker. يتضمن ذلك مصحح أخطاء سطر الأوامر .NET Core VSDBG في صورة الحاوية أثناء إنشائها. بالنسبة إلى وحدات IoT Edge الجاهزة للإنتاج، نوصي باستخدام تكوين الإصدار ، الذي يستخدم Dockerfile.(amd64|windows-amd64) دون VSDBG.

    تحذير

    تأكد من أن السطر الأخير من القالب ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] يطابق اسم DLL اسم مشروع الوحدة النمطية IoT Edge.

    لقطة شاشة لإعداد قالب Dockerfile

  3. لإنشاء اتصال SSH مع وحدة Linux، نحتاج إلى إنشاء مفتاح RSA. افتح جلسة عمل PowerShell غير مقيدة وقم بتشغيل الأوامر التالية لإنشاء مفتاح RSA جديد. تأكد من حفظ مفتاح RSA ضمن نفس مجلد وحدة IoT Edge، واسم المفتاح id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    لقطة شاشة لكيفية إنشاء مفتاح SSH

  4. إذا كنت تستخدم سجلا خاصا مثل Azure Container Registry (ACR)، فاستخدم أمر Docker التالي لتسجيل الدخول إليه. يمكنك الحصول على اسم المستخدم وكلمة المرور من صفحة مفاتيح الوصول في السجل الخاص بك في مدخل Microsoft Azure. إذا كنت تستخدم السجل المحلي، يمكنك تشغيل سجل محلي.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مجلد المشروع وحدد Build and Push IoT Edge Modules لإنشاء صورة Docker ودفعها لكل وحدة نمطية.

  2. إذا كنت تستخدم سجلا خاصا مثل Azure Container Registry، فستحتاج إلى إضافة معلومات تسجيل الدخول إلى إعدادات وقت التشغيل الموجودة في الملف deployment.template.json. استبدل العناصر النائبة باسم المستخدم وكلمة المرور واسم السجل الفعلي لمسؤول ACR.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    إشعار

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

  3. من الضروري كشف المنفذ 22 للوصول إلى خدمة SSH للوحدة النمطية. يستخدم هذا البرنامج التعليمي 10022 كمنفذ مضيف، ولكن يمكنك تحديد منفذ مختلف، والذي سيتم استخدامه كمنفذ SSH للاتصال بالوحدة النمطية Linux C#. تحتاج إلى إضافة معلومات منفذ SSH إلى "createOptions" لإعداد الوحدة النمطية Linux هذا الموجود في الملف deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مجلد المشروع وحدد إنشاء نشر ل IoT Edge لإنشاء json نشر IoT Edge الجديد.

  5. افتح Cloud Explorer بالنقر فوق View>Cloud Explorer. تأكد من تسجيل الدخول إلى Visual Studio 2019.

  6. في Cloud Explorer، قم بتوسيع اشتراكك، وابحث عن Azure IoT Hub وجهاز Azure IoT Edge الذي تريد نشره.

  7. انقر بزر الماوس الأيمن فوق جهاز IoT Edge واختر إنشاء نشر. انتقل إلى بيان نشر التصحيح الذي تم تكوينه للنظام الأساسي الخاص بك الموجود في مجلد التكوين في حل Visual Studio، مثل deployment.amd64.json.

إنشاء صورة Docker للوحدة النمطية

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

استخدم Dockerfile الخاص بالوحدة النمطية لإنشاء صورة Docker للوحدة النمطية.

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

على سبيل المثال، لنفترض أن أمر shell الخاص بك موجود في دليل المشروع واسم الوحدة النمطية الخاصة بك هو IotEdgeModule1. لإنشاء صورة للسجل المحلي أو سجل حاوية Azure، استخدم الأوامر التالية:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

صورة Docker لوحدة الدفع

ادفع صورة الوحدة النمطية إلى السجل المحلي أو سجل الحاوية.

docker push <ImageName>

على سبيل المثال:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

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

في Visual Studio، افتح ملف بيان نشر deployment.debug.template.json في المشروع الرئيسي. بيان النشر هو مستند JSON يصف الوحدات النمطية التي سيتم تكوينها على جهاز IoT Edge المستهدف. قبل النشر، تحتاج إلى تحديث بيانات اعتماد Azure Container Registry وصور الوحدة والقيم المناسبة createOptions . لمزيد من المعلومات حول قيم createOption، راجع كيفية تكوين خيارات إنشاء الحاوية لوحدات IoT Edge النمطية.

  1. إذا كنت تستخدم Azure Container Registry لتخزين صورة الوحدة النمطية الخاصة بك، فستحتاج إلى إضافة بيانات الاعتماد الخاصة بك إلى deployment.debug.template.json في إعدادات edgeAgent . على سبيل المثال،

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. استبدل قيمة خاصية الصورة باسم صورة الوحدة النمطية التي دفعتها إلى السجل. على سبيل المثال، إذا قمت بدفع صورة ذات myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 علامة للوحدة النمطية المخصصة IotEdgeModule1، فاستبدل قيمة خاصية الصورة بقيمة العلامة.

  3. أضف قيمة createOptions أو استبدلها بمحتوى سلسلة لكل نظام ووحدة نمطية مخصصة في قالب النشر.

    على سبيل المثال، ستكون إعدادات صورة IotEdgeModule1 وcreateOptions مشابهة لما يلي:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

استخدم الأمر IoT Edge Azure CLI set-modules لنشر الوحدات النمطية إلى Azure IoT Hub. على سبيل المثال، لنشر الوحدات النمطية المحددة في ملف deployment.debug.amd64.json إلى IoT Hub my-iot-hub لجهاز IoT Edge الخاص بي، استخدم الأمر التالي:

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

تلميح

يمكنك العثور على سلسلة الاتصال IoT Hub في مدخل Azure ضمن إعدادات أمان Azure IoT Hub >نهج>الوصول المشترك.

  1. في Cloud Explorer، انقر بزر الماوس الأيمن فوق جهاز الحافة وقم بالتحديث لرؤية الوحدة النمطية الجديدة قيد التشغيل مع وحدات $edgeAgent ووحدات $edgeHub .

تصحيح أخطاء الحل

  1. تشغيل الأوامر التالية باستخدام جلسة PowerShell ورفعها

    1. احصل على moduleId استنادا إلى الاسم المستخدم للوحدة النمطية Linux C#. تأكد من استبدال <العنصر النائب iot-edge-module-name> باسم الوحدة النمطية الخاصة بك.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. تحقق من صحة $moduleId - إذا كان المتغير فارغا، فتأكد من استخدام اسم الوحدة النمطية الصحيح

    3. بدء تشغيل خدمة SSH داخل حاوية Linux

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. افتح منفذ SSH للوحدة النمطية على EFLOW VM (يستخدم هذا البرنامج التعليمي المنفذ 10022)

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    تحذير

    لأسباب أمنية، في كل مرة يقوم فيها الجهاز الظاهري EFLOW بإعادة التشغيل، سيتم حذف قاعدة جدول IP والعودة إلى الإعدادات الأصلية. أيضا، يجب بدء تشغيل خدمة SSH للوحدة النمطية مرة أخرى يدويا.

  2. بعد بدء تشغيل خدمة SSH بنجاح، حدد Debug ->Attach to Process، وقم بتعيين الاتصال ion Type إلى SSH، الاتصال الهدف إلى عنوان IP الخاص بجهاز EFLOW الظاهري. إذا كنت لا تعرف EFLOW VM IP، يمكنك استخدام Get-EflowVmAddr PowerShell cmdlet. أولا، اكتب IP ثم اضغط على enter. في النافذة المنبثقة، أدخل التكوينات التالية:

    الحقل القيمة
    اسم المضيف استخدام EFLOW VM IP
    منفذ 10022 (أو الذي استخدمته في تكوين النشر الخاص بك)
    اسم المستخدم جذر
    نوع المصادقة مفتاح خاص
    ملف المفتاح الخاص المسار الكامل إلى id_rsa التي تم إنشاؤها في خطوة سابقة
    كلمه المرور عبارة المرور المستخدمة للمفتاح الذي تم إنشاؤه في خطوة سابقة

    لقطة شاشة لكيفية الاتصال بنظام بعيد

  3. بعد الاتصال بنجاح بالوحدة النمطية باستخدام SSH، يمكنك اختيار العملية وتحديد إرفاق. بالنسبة للوحدة النمطية C# تحتاج إلى اختيار معالجة dotnet والإرفاق ب المدارة (CoreCLR). قد يستغرق الأمر من 10 إلى 20 ثانية في المرة الأولى.

    لقطة شاشة لكيفية إرفاق عملية وحدة حافة.

  4. تعيين نقطة توقف لفحص الوحدة النمطية.

    • إذا تم التطوير في C#، فقم بتعيين نقطة توقف في الدالة PipeMessage() في ModuleBackgroundService.cs.
    • إذا كنت تستخدم C، فقم بتعيين نقطة توقف في الدالة InputQueue1Callback() في main.c.
  5. يجب إعادة توجيه إخراج SimulatedTemperatureSensor إلى input1 لوحدة Linux C# المخصصة. يجب تشغيل نقطة التوقف. يمكنك مشاهدة المتغيرات في نافذة Visual Studio Locals .

    لقطة شاشة لكيفية تصحيح أخطاء وحدة نمطية واحدة

  6. اضغط على Ctrl + F5 أو حدد زر الإيقاف لإيقاف تصحيح الأخطاء.

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

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

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

قم بحذف موارد Azure.

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

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

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

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

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

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

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