إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
ينطبق على:
IoT Edge 1.5
هام
IoT Edge 1.5 LTS هو الإصدار المدعوم release. وصل IoT Edge 1.4 LTS إلى نهاية صلاحيته في 12 نوفمبر 2024. إذا كنت تستخدم إصدارا أقدم، راجع Update IoT Edge.
يوضح هذا الدرس كيفية تطوير ونشر كودك على جهاز IoT Edge. تمكنك وحدات Azure IoT Edge من نشر كود يشغل منطق عملك مباشرة على جهاز IoT Edge الخاص بك. في كود النشر على جهاز لينكس السريع
تصف هذه المقالة خطوات أداتين لتطوير IoT Edge:
- Azure IoT Edge أداة التطوير سطر الأوامر (CLI)، وهو مفضل للتطوير.
- Azure IoT Edge أدوات لتوسيع Visual Studio Code، والتي تعمل في وضع maintenance mode.
استخدم زر محدد الأداة في بداية هذه المقالة لاختيار الأداة الخاصة بك.
في هذا البرنامج التعليمي، تتعلم كيفية:
- إعداد جهاز التطوير الخاص بك
- استخدم أدوات IoT Edge لإنشاء مشروع جديد
- ابن مشروعك كحاوية Docker وخزنها في سجل حاويات Azure
- نشر كودك على جهاز IoT Edge
وحدة IoT Edge التي تنشئها في هذا الدرس تقوم بتصفية بيانات درجة الحرارة التي يولدها جهازك. ولا يرسل الرسائل في المصدر إلا إذا كانت درجة الحرارة أعلى من حد معين. يساعد هذا النوع من التحليل على الحافة على تقليل كمية البيانات المرسلة والمخزنة في السحابة.
المتطلبات الأساسية
آلة التطوير:
- استخدم الكمبيوتر الخاص بك أو جهاز ظاهري.
- تأكد من أن جهاز التطوير يدعم الظاهرية المتداخلة لتشغيل محرك حاوية.
- يمكنك استخدام معظم أنظمة التشغيل التي تعمل بمحرك حاويات لتطوير وحدات IoT Edge لأجهزة لينكس. يستخدم هذا الدرس جهاز Windows، لكنه يشير أيضا إلى الفروقات المعروفة على macOS أو Linux.
- ثبت Visual Studio Code
- قم بتثبيت Azure CLI.
An Azure IoT Edge device:
- شغل IoT Edge على جهاز منفصل. إبقاء جهاز التطوير وجهاز IoT Edge منفصلين يحاكي سيناريو نشر حقيقي ويساعد في إبقاء المفاهيم واضحة. استخدم مقالة البدء السريع Deploy code على جهاز لينكس لإنشاء جهاز IoT Edge في Azure أو قالب Azure Resource Manager لنشر آلة افتراضية مفعلة IoT Edge.
موارد السحابة:
- استخدم نسخة مجانية أو قياسية Azure IoT Hub.
إذا لم يكن لديك حساب Azure، أنشئ حسابا مجاني قبل أن تبدأ.
تلميح
للحصول على إرشادات حول التصحيح التفاعلي في Visual Studio Code أو Visual Studio 2022:
- تصحيح الأخطاء Azure IoT Edge الوحدات باستخدام Visual Studio Code
- استخدم Visual Studio 2022 لتطوير وتصحيح الوحدات ل Azure IoT Edge
يغطي هذا الدرس خطوات تطوير Visual Studio Code.
المفاهيم الرئيسية
يشرح هذا الدرس تطوير وحدة IoT Edge. وحدة IoT Edge هي حاوية تحتوي على كود تنفيذي. يمكنك نشر وحدة أو أكثر على جهاز IoT Edge. تقوم الوحدات بمهام محددة مثل استيعاب البيانات من أجهزة الاستشعار، تنظيف وتحليل البيانات، أو إرسال الرسائل إلى IoT Hub. لمزيد من المعلومات، راجع فهم Azure IoT Edge modules.
عند تطوير وحدات IoT Edge، يجب أن تفهم الفرق بين آلة التطوير وجهاز IoT Edge المستهدف حيث يتم نشر الوحدة. يجب أن تتطابق الحاوية التي تقوم بإنشائها للاحتفاظ برمز الوحدة النمطية مع نظام التشغيل (OS) للجهاز المستهدف. على سبيل المثال، السيناريو الأكثر شيوعا هو تطوير وحدة على جهاز Windows لاستهداف جهاز لينكس يعمل بنظام IoT Edge. في هذه الحالة، نظام تشغيل الحاوية هو Linux. خلال هذا البرنامج التعليمي، نضع في اعتبارنا الفرق بين نظام التشغيل جهاز التطوير ونظام التشغيل الحاوية.
تلميح
إذا كنت تستخدم IoT Edge على لينكس على Windows، فإن الجهاز المستهدف في سيناريوك هو الآلة الافتراضية للينكس، وليس مضيف Windows.
يستهدف هذا الدرس الأجهزة التي تعمل بنظام IoT Edge مع حاويات لينكس. استخدم نظام التشغيل المفضل لديك طالما أن جهاز التطوير الخاص بك يقوم بتشغيل حاويات Linux. يوصى باستخدام Visual Studio Code للتطوير باستخدام حاويات لينكس، لذا يستخدمه هذا الدرس. يمكنك استخدام Visual Studio أيضا، رغم وجود اختلافات في الدعم بين الأداتين.
الجدول التالي يسرد سيناريوهات التطوير المدعومة لحاويات لينكس في Visual Studio Code و Visual Studio.
| Visual Studio Code | Visual Studio 2019/2022 | |
|---|---|---|
| هندسة جهاز Linux | لينكس AMD64 لينكس ARM32v7 لينكس ARM64 |
لينكس AMD64 لينكس ARM32 لينكس ARM64 |
| Azure services | Azure Functions Azure Stream Analytics Azure Machine Learning |
|
| اللغات | C C# Java Node.js Python |
C C# |
| مزيد من المعلومات | Azure IoT Edge ل Visual Studio Code |
Azure IoT Edge أدوات Visual Studio 2019 Azure IoT Edge أدوات Visual Studio 2022 |
تثبيت محرك حاوية
IoT Edge الوحدات يتم تغليفها كحاويات، لذا تحتاج إلى نظام إدارة حاويات متوافق مع docker على جهاز التطوير الخاص بك لبنائها وإدارتها. يعد Docker Desktop خيارا شائعا للتطوير لأنه يحتوي على دعم قوي للميزات. يتيح لك Docker Desktop على Windows التبديل بين حاويات Linux وحاويات Windows، بحيث يمكنك تطوير وحدات لأنواع مختلفة من أجهزة IoT Edge.
استخدم وثائق Docker لتثبيت Docker على جهاز التطوير الخاص بك:
تثبيت Docker Desktop ل Windows. عند تثبيت Docker Desktop لنظام Windows، يسألك عما إذا كنت تريد استخدام حاويات لينكس أو Windows. يمكنك تغيير هذا الإعداد في أي وقت. يستخدم هذا البرنامج التعليمي حاويات Linux لأن الوحدات النمطية تستهدف أجهزة Linux. لمزيد من المعلومات، راجع التبديل بين حاويات Windows ولينكس.
اقرأ عن Docker CE للحصول على معلومات التثبيت على العديد من منصات لينكس. بالنسبة لنظام Windows Subsystem for Linux (WSL)، قم بتثبيت Docker Desktop for Windows.
إعداد الأدوات
قم بتثبيت أداة التطوير Azure IoT Edge المعتمدة على Python لإنشاء الحل IoT Edge الخاص بك. لديك خياران:
- استخدم الحاوية المطورة المفضلة IoT Edge Dev Container.
- قم بتثبيت الأداة باستخدام إعداد تطوير iotedgedev.
هام
أدوات Azure IoT Edge لتمديد Visual Studio Code موجودة في وضع وضع الصيانة. أداة التطوير المفضلة هي سطر الأوامر (CLI) Azure IoT Edge أداة التطوير.
استخدم إضافات إنترنت الأشياء ل Visual Studio Code لتطوير وحدات IoT Edge. تقدم هذه الإضافات قوالب المشاريع، وتؤتمت إنشاء بيان النشر، وتتيح لك مراقبة وإدارة أجهزة IoT Edge. في هذا القسم، تقوم بتثبيت Visual Studio Code وإضافة IoT، ثم تضبط حساب Azure الخاص بك لإدارة موارد IoT Hub من داخل Visual Studio Code.
- قم بتثبيت Azure IoT Edge الإضافية.
- قم بتثبيت Azure IoT Hub الإضافية.
- بعد تثبيت الملحقات، افتح لوحة الأوامر عن طريق تحديد View > Command Palette.
- في لوحة الأوامر، ابحث واختر Azure IoT Hub: اختر IoT Hub. اتبع التعليمات لاختيار اشتراكك في Azure وIoT Hub.
- افتح قسم المستكشف في Visual Studio Code باختيار الأيقونة في شريط النشاط أو باختيار View > Explorer.
- في أسفل قسم المستكشف، قم بتوسيع قائمة Azure IoT Hub / الأجهزة المنطوية. ترى الأجهزة وأجهزة IoT Edge المرتبطة ب IoT Hub التي اخترتها من خلال لوحة الأوامر.
تثبيت أدوات خاصة باللغة
تثبيت أدوات خاصة باللغة التي تقوم بتطويرها:
إنشاء سجل حاويات
في هذا الدرس، تستخدم امتدادات Azure IoT Edge و Azure IoT Hub لبناء وحدة وإنشاء صورة حاوية من الملفات. ثم تدفع هذه الصورة إلى سجل يخزن صورك ويديرها. وأخيرا، تقوم بنشر صورتك من سجل البيانات لتعمل على جهاز IoT Edge الخاص بك.
هام
الامتداد Azure IoT Edge Visual Studio Code في وضع صيانة .
يمكنك استخدام أي تسجيل متوافق مع Docker للاحتفاظ بصور الحاوية. خدمتان شائعتان لسجل دوكر هما Azure Container Registry و Docker Hub. يستخدم هذا الدرس Azure Container Registry.
إذا لم يكن لديك سجل حاويات بالفعل، اتبع هذه الخطوات لإنشاء سجل جديد في Azure:
في بوابة Azure، اختر إنشاء مورد>Containers>سجل الحاويات.
قم بتوفير القيم المطلوبة التالية لإنشاء سجل الحاوية الخاص بك:
الحقل القيمة الاشتراك حدد اشتراكك من القائمة المنسدلة. مجموعة الموارد استخدم نفس مجموعة الموارد لجميع موارد الاختبار التي تنشئها خلال IoT Edge البدء السريع والدروس التعليمية؛ على سبيل المثال، IoTEdgeResources. اسم السجل قم بتوفير اسم مميز. الموقع حدد موقعًا قريبًا منك. وحدة حفظ المخزون SKU حدد أساسي. حدد Review + create، ثم Create.
اختر سجل الحاويات الجديد من قسم Resources في الصفحة الرئيسية لبوابة Azure لفتحه.
في الجزء الأيمن من سجل الحاوية، حدد Access keys من القائمة الموجودة ضمن Settings.
تمكين مستخدم المسؤول باستخدام زر التبديل وعرض اسم المستخدم وكلمة المرور لسجل الحاوية.
انسخ قيم خادم تسجيل الدخول واسم المستخدم وكلمة المرور واحفظها في مكان مناسب. يمكنك استخدام هذه القيم خلال هذا البرنامج التعليمي لتوفير الوصول إلى تسجيل الحاوية.
إنشاء مشروع وحدة
تقدم إضافة Azure IoT Edge قوالب مشاريع لجميع لغات وحدات IoT Edge المدعومة بنظام Visual Studio Code. تتضمن هذه القوالب جميع الملفات والكود الذي تحتاجه لنشر وحدة عاملة لاختبار IoT Edge، أو تعطيك نقطة انطلاق لتخصيص القالب بمنطق عملك الخاص.
إنشاء قالب مشروع
أداة التطوير IoT Edge تبسط Azure IoT Edge التطوير، مع أوامر مدفوعة بمتغيرات البيئة. يساعدك على البدء في تطوير IoT Edge باستخدام حاوية تطوير IoT Edge وحلول IoT Edge التي تتضمن وحدة افتراضية وجميع ملفات التكوين المطلوبة.
قم بإنشاء دليل للحل الخاص بك في المسار الذي تريده. قم بالتغيير إلى الدليل الخاص بك
iotedgesolution.mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolutionاستخدم أمر
iotedgedev solution initلإنشاء حل وإعداد Azure IoT Hub الخاص بك بلغة التطوير التي تختارها:
يطالبك الأمر iotedgedev solution init بإكمال عدة خطوات، بما في ذلك:
- Authenticate to Azure
- اختر اشتراك في Azure
- اختيار مجموعة موارد أو إنشائها
- اختر أو إنشاء Azure IoT Hub
- اختر أو أنشئ جهاز Azure IoT Edge
استخدم Visual Studio Code وامتداد Azure IoT Edge. ابدأ بإنشاء حل، ثم قم بإنشاء الوحدة الأولى في هذا الحل. يمكن أن يتضمن كل حل وحدات نمطية متعددة.
- حدد View > Command Palette.
- في لوحة الأوامر، أدخل وشغل الأمر Azure IoT Edge: حل IoT Edge جديد.
- استعرض وصولا إلى المجلد حيث تريد إنشاء الحل الجديد، ثم حدد تحديد مجلد.
- أدخل اسما للحل الخاص بك.
- حدد قالب وحدة نمطية للغة التطوير المفضلة لتكون الوحدة النمطية الأولى في الحل.
- أدخل اسما للوحدة النمطية. اختر اسما فريدا في سجل الحاويات.
- أدخل اسم مستودع صور الوحدة النمطية. Visual Studio Code يقوم تلقائيا بملء اسم الوحدة ب localhost:5000/<اسم الوحدة الخاص بك>. استبدله بمعلومات التسجيل الخاصة بك. استخدم localhost إذا كنت تستخدم سجل Docker محليا للاختبار. إذا كنت تستخدم Azure Container Registry، استخدم Login server من إعدادات السجل الخاص بك. يبدو خادم تسجيل الدخول مثل <اسم> السجل.azurecr.io. استبدل فقط الجزء localhost:5000 من السلسلة، بحيث تبدو النتيجة النهائية مثل < اسم ><اسم الوحدة النمطية> الخاص بك.
Visual Studio Code يأخذ المعلومات التي قدمتها، وينشئ حل IoT Edge، ثم يحملها في نافذة جديدة.
بعد إنشاء الحل، تكون هذه الملفات الرئيسية في الحل:
يتضمن مجلد .vscode ملف التكوين launch.json.
يحتوي مجلد الوحدات النمطية على مجلدات فرعية لكل وحدة نمطية. في كل مجلد فرعي، يتحكم ملف module.json في كيفية إنشاء الوحدات النمطية ونشرها.
يسرد ملف .env متغيرات البيئة الخاصة بك. متغير البيئة لسجل الحاوية هو localhost:5000 بشكل افتراضي.
يسرد ملفا توزيع الوحدة النمطية،deployment.template.jsondeployment.debug.template.json، الوحدات النمطية لنشرها على جهازك. بشكل افتراضي، تشمل القائمة وحدات نظام IoT Edge (edgeAgent و edgeHub) ووحدات عينات مثل:
- filtermodule هي نموذج وحدة نمطية تنفذ دالة تصفية بسيطة.
- تحاكي وحدة SimulatedTemperatureSensor البيانات التي يمكنك استخدامها للاختبار. لمزيد من المعلومات حول كيفية عمل بيانات النشر، راجع التعرف على كيفية استخدام بيانات التوزيع لنشر الوحدات النمطية وإنشاء المسارات. لمزيد من المعلومات حول كيفية عمل وحدة درجة الحرارة المحاكاة، راجع SimulatedTemperatureSensor.csproj من الشيفرة.
إشعار
يمكن أن تعتمد الوحدات النمطية الدقيقة المثبتة على اللغة التي تختارها.
تعيين نسخة وقت التشغيل IoT Edge
أحدث إصدار مستقر من وحدة نظام IoT Edge هو 1.5. تعيين وحدات النظام النمطية إلى الإصدار 1.5.
في Visual Studio Code، افتح ملف بيان النشر deployment.template.json. بيان النشر deployment هو مستند JSON يصف الوحدات التي سيتم تكوينها على جهاز IoT Edge المستهدف.
تغيير إصدار وقت التشغيل لصور
edgeAgentوحدة وقت تشغيل النظام وedgeHub. على سبيل المثال، إذا كنت ترغب في استخدام إصدار IoT Edge 1.5 من وقت تشغيل، قم بتغيير الأسطر التالية في ملف بيان النشر:"systemModules": { "edgeAgent": { "image": "mcr.microsoft.com/azureiotedge-agent:1.5", "edgeHub": { "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
قدم بيانات اعتماد السجل الخاصة بك إلى وكيل IoT Edge
يخزن ملف البيئة بيانات اعتماد سجل الحاويات الخاص بك ويشاركها مع وقت تشغيل IoT Edge. يحتاج وقت التشغيل إلى هذه البيانات لسحب صور الحاوية إلى جهاز IoT Edge.
يحاول امتداد IoT Edge سحب بيانات اعتماد سجل الحاويات من Azure وتملئها في ملف البيئة.
إشعار
يتم إنشاء ملف البيئة فقط إذا قمت بتوفير مستودع صور للوحدة النمطية. إذا قبلت الإعدادات الافتراضية localhost لاختبار وتصحيح محليا، ثم لا تحتاج إلى تعريف متغيرات البيئة.
تحقق مما إذا كانت بيانات الاعتماد موجودة. إذا لم يكن كذلك، فأضفها الآن:
إذا كان Azure Container Registry هو السجل الخاص بك، قم بتعيين اسم مستخدم وكلمة مرور Azure Container Registry. احصل على هذه القيم من قائمة Settings>Access keys في بوابة Azure.
افتح ملف .env في حل الوحدة النمطية الخاصة بك.
أضف قيم username وقيم password التي نسختها من سجل الحاوية Azure الخاص بك. على سبيل المثال:
CONTAINER_REGISTRY_SERVER="myacr.azurecr.io" CONTAINER_REGISTRY_USERNAME="myacr" CONTAINER_REGISTRY_PASSWORD="<registry_password>"احفظ التغييرات التي أجريتها على ملف .env .
إشعار
يستخدم هذا الدرس بيانات اعتماد المسؤول ل Azure Container Registry الملائمة للتطوير والاختبار. عندما تكون جاهزا لسيناريوهات الإنتاج، نوصي بخيار مصادقة أقل امتيازا مثل كيانات الخدمة أو الرموز المميزة على نطاق المستودع. لمزيد من المعلومات، راجع إدارة الوصول إلى سجل الحاوية.
البنية المستهدفة
حدد البنية التي تستهدفها مع كل حل، لأن ذلك يؤثر على كيفية إنشاء الحاوية وتشغيلها. الافتراضي هو Linux AMD64. لهذا الدرس، استخدم جهاز افتراضي من أوبونتو كجهاز IoT Edge واحتفظ بالإعدادات الافتراضية amd64.
إذا كنت بحاجة إلى تغيير البنية الهدف للحل الخاص بك، فاتبع هذه الخطوات.
- افتح لوحة الأوامر وابحث عن Azure IoT Edge: تعيين منصة الهدف الافتراضية ل Edge Solution، أو اختر أيقونة الاختصار في الشريط الجانبي أسفل النافذة.
- في لوحة الأوامر، حدد بنية الهدف من قائمة الخيارات.
يتم تعيين البنية الهدف عند إنشاء صورة الحاوية في خطوة لاحقة.
تحديث الوحدة النمطية باستخدام التعليمات البرمجية المخصصة
يتضمن كل قالب نموذج كود يأخذ بيانات المستشعر المحاكاة من وحدة SimulatedTemperatureSensor ويوجها إلى IoT Hub. تتلقى الوحدة النمطية النموذجية الرسائل وتمريرها. تظهر وظيفة خط الأنابيب مفهوما مهما في IoT Edge: كيفية تواصل الوحدات مع بعضها البعض.
يمكن أن يكون لكل وحدة نمطية قوائم انتظار إدخالوإخراج متعددة معلنة في التعليمات البرمجية الخاصة بها. يقوم مركز IoT Edge الذي يعمل على الجهاز بتوجيه الرسائل من مخرج وحدة واحدة إلى مدخلات وحدة أو أكثر. تختلف التعليمات البرمجية المحددة للإعلان عن المدخلات والمخرجات بين اللغات، ولكن المفهوم هو نفسه لجميع الوحدات النمطية. لمزيد من المعلومات حول التوجيه بين الوحدات النمطية، راجع إعلان التوجيهات.
كود C# النموذجي الذي يأتي مع قالب المشروع يستخدم ModuleClient class من IoT Hub SDK ل .NET.
في مستكشف Visual Studio Code، افتح modules > filtermodule > ModuleBackgroundService.cs.
قبل مساحة الاسم
filtermodule، أضف ثلاثusingعبارات للأنواع التي يتم استخدامها لاحقا:using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvertأضف المتغير
temperatureThresholdإلىModuleBackgroundServiceالفصل. يحدد هذا المتغير القيمة التي يجب أن تتجاوزها درجة الحرارة المقاسة لإرسال البيانات إلى IoT Hub.static int temperatureThreshold { get; set; } = 25;أضف الفئة
MessageBody،MachineووالفئاتAmbient. تعمل هذه الفئات على تعريف المخطط المتوقع للنص الأساسي الرسائل الواردة.class MessageBody { public Machine machine {get;set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} }ابحث عن الدالة
ExecuteAsync. تقوم هذه الدالة بإنشاء وتكوين كائنModuleClientيسمح للوحدة بالاتصال بوقت التشغيل المحلي Azure IoT Edge لإرسال واستقبال الرسائل. بعد إنشاء ،ModuleClientيقرأ الرمز القيمةtemperatureThresholdمن الخصائص المطلوبة للوحدة النمطية المزدوجة. يسجل الكود استدعاء للرد لاستقبال الرسائل من مركز IoT Edge عبر نقطة نهاية تسمىinput1.استبدل استدعاء الأسلوب
ProcessMessageAsyncبأسلوب جديد يقوم بتحديث اسم نقطة النهاية والأسلوب الذي يتم استدعاؤه عند وصول الإدخال. أيضا ، أضفSetDesiredPropertyUpdateCallbackAsyncطريقة لتحديثات الخصائص المطلوبة. لإجراء هذا التغيير، استبدل السطر الأخير من الطريقةExecuteAsyncبالتعليمات البرمجية التالية:// Register a callback for messages that are received by the module. // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken); // Read the TemperatureThreshold value from the module twin's desired properties var moduleTwin = await _moduleClient.GetTwinAsync(); await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient); // Attach a callback for updates to the module twin's desired properties. await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null); // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method. await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);أضف الطريقة
OnDesiredPropertiesUpdateإلىModuleBackgroundServiceالفصل. تتلقى هذه الطريقة تحديثات على الخصائص المطلوبة من الوحدة النمطية المزدوجة، وتقوم بتحديث المتغيرtemperatureThresholdلمطابقته. تحتوي جميع الوحدات النمطية على وحدة مزدوجة خاصة بها، ما يتيح لك تكوين التعليمات البرمجية التي تعمل داخل وحدة نمطية مباشرة من السحابة.static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext) { try { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); if (desiredProperties["TemperatureThreshold"]!=null) temperatureThreshold = desiredProperties["TemperatureThreshold"]; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", exception); } } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", ex.Message); } return Task.CompletedTask; }أضف الطريقة
FilterMessages. يتم استدعاء هذه الطريقة كلما استقبلت الوحدة رسالة من مركز IoT Edge. فهو يعمل على تصفية الرسائل التي تبلغ عن درجات حرارة أقل من الحد الأدنى لدرجة الحرارة التي تم ضبطها عبر الوحدة المزدوجة. كما أنه يضيف الخاصيةMessageTypeإلى الرسالة مع تعيين القيمة إلىAlert:async Task<MessageResponse> FilterMessages(Message message, object userContext) { var counterValue = Interlocked.Increment(ref _counter); try { ModuleClient moduleClient = (ModuleClient)userContext; var messageBytes = message.GetBytes(); var messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received message {counterValue}: [{messageString}]"); // Get the message body. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " + $"exceeds threshold {temperatureThreshold}"); using (var filteredMessage = new Message(messageBytes)) { foreach (KeyValuePair<string, string> prop in message.Properties) { filteredMessage.Properties.Add(prop.Key, prop.Value); } filteredMessage.Properties.Add("MessageType", "Alert"); await moduleClient.SendEventAsync("output1", filteredMessage); } } // Indicate that the message treatment is completed. return MessageResponse.Completed; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", exception); } // Indicate that the message treatment is not completed. var moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); // Indicate that the message treatment is not completed. ModuleClient moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } }احفظ ملف ModuleBackgroundService.cs.
في مستكشف Visual Studio Code، افتح ملف deployment.template.json في مساحة عمل الحل IoT Edge الخاصة بك.
نظرا لأننا قمنا بتغيير اسم نقطة النهاية التي تستمع إليها الوحدة النمطية، نحتاج أيضا إلى تحديث المسارات في بيان النشر بحيث يرسل edgeHub رسائل إلى نقطة النهاية الجديدة.
ابحث عن القسم
routesفي الوحدة النمطية $edgeHub المزدوجة. قم بتحديث المسارsensorTofiltermoduleلاستبدالهinput1بinputFromSensor:"sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"أضف الوحدة النمطية filtermodule المزدوجة إلى بيان التوزيع. أدخل محتوى JSON التالي في أسفل القسم
modulesContent، بعد الوحدة النمطية $edgeHub المزدوجة:"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }احفظ ملف deployment.template.js.
بناء ودفع الحل الخاص بك
لقد قمت بتحديث التعليمات البرمجية للوحدة النمطية وقالب التوزيع للمساعدة في فهم بعض مفاهيم التوزيع الرئيسية. الآن، أنت مستعد لإنشاء صورة حاوية الوحدة النمطية الخاصة بك ودفعها إلى سجل الحاوية الخاص بك.
في Visual Studio Code، افتح ملف بيان النشر deployment.template.json. يصف بيان النشر deployment الوحدات التي سيتم تكوينها على جهاز IoT Edge المستهدف. قبل النشر، يجب عليك تحديث بيانات اعتماد Azure Container Registry وصور الوحدة بقيم createOptions الصحيحة. لمزيد من المعلومات حول قيم createOptions، راجع كيفية تكوين خيارات إنشاء الحاويات ل IoT Edge module.
إذا كنت تستخدم Azure Container Registry لتخزين صورة الوحدة، أضف بيانات اعتمادك إلى قسم modulesContent > edgeAgent > settings > registryCredentials في deployment.template.json. استبدل myacr باسم التسجيل الخاص بك وأدخل كلمة المرور وعنوان خادم تسجيل الدخول. على سبيل المثال:
"registryCredentials": {
"myacr": {
"username": "myacr",
"password": "<your_acr_password>",
"address": "myacr.azurecr.io"
}
}
أضف المحتوى المتسلسل التالي أو استبدل إلى createOptions قيمة كل نظام (edgeHub و*edgeAgent) والوحدة النمطية المخصصة (filtermoduleوtempSensor) المدرجة. قم بتغيير القيم إذا لزم الأمر:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
على سبيل المثال، يجب أن يكون التكوين filtermodule مشابها لما يلي:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
إنشاء صورة Docker للوحدة النمطية
افتح المحطة المتكاملة Visual Studio Code باختيار Terminal > New Terminal.
dotnet publish استخدم الأمر لإنشاء صورة الحاوية لبنية Linux وamd64. قم بتغيير الدليل إلى دليل filtermodule في مشروعك وقم بتشغيل dotnet publish الأمر.
dotnet publish --os linux --arch x64 /t:PublishContainer
حاليا، يستهدف قالب أداة iotedgedev .NET 7.0، الذي وصل إلى نهاية الدعم في مايو 2024. تحديث المشروع ليصبح مستهدفا .NET 8.0 (LTS، مدعوم حتى نوفمبر 2026) عن طريق تعديل ملف filtermodule.csproj وتغيير قيم TargetFramework و PackageReference. يجب أن يبدو ملف filtermodule.csproj الخاص بك هكذا:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
</Project>
ضع علامة على صورة docker بمعلومات سجل الحاوية والإصدار والهندسة. استبدل myacr باسم السجل الخاص بك:
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64
صورة Docker لوحدة الدفع
قم بتوفير بيانات اعتماد سجل الحاوية إلى Docker بحيث يمكنه دفع صورة الحاوية إلى التخزين في السجل.
تسجيل الدخول إلى Docker باستخدام بيانات اعتماد Azure Container Registry (ACR):
docker login -u <ACR username> -p <ACR password> <ACR login server>قد تتلقى تحذير أمان يوصي باستخدام
--password-stdin. في حين أن هذه أفضل ممارسة موصى بها لسيناريوهات الإنتاج، فإنها خارج نطاق هذا البرنامج التعليمي. للمصادقة على سجل الحاوية الإنتاجية، استخدم رمز رئيسي للخدمة أو رموز محددة بنطاق المستودع بدلا من بيانات اعتماد المسؤول. لمزيد من المعلومات، راجع إدارة الوصول إلى سجل الحاويات الخاص بك ومرجع تسجيل الدخول الخاص ب Docker .تسجيل الدخول إلى Azure Container Registry. يجب عليك install Azure CLI لاستخدام أمر
az. يطلب هذا الأمر اسم المستخدم وكلمة المرور الموجودين في سجل الحاوية في مفاتيح الوصول إلى الإعدادات>:az acr login -n <ACR registry name>تلميح
إذا كنت مسجلا الخروج في أي وقت خلال هذا الدرس، كرر خطوات تسجيل الدخول في Docker وAzure Container Registry للاستمرار.
ادفع صورة الوحدة النمطية إلى السجل المحلي أو سجل الحاوية:
docker push <ImageName>على سبيل المثال:
# Push the Docker image to the local registry docker push localhost:5000/filtermodule:0.0.1-amd64 # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name. az acr login --name myacr docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
تحديث قالب التوزيع
تحديث قالب التوزيع deployment.template.json مع موقع صورة سجل الحاوية. على سبيل المثال، إذا كنت تستخدم Azure Container Registry myacr.azurecr.io وصورتك هي filtermodule:0.0.1-amd64، قم بتحديث تكوين filtermodule إلى:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
}
في مستكشف Visual Studio Code، انقر بزر الفأرة الأيمن على ملف deployment.template.json واختر Build ودفع IoT Edge Solution.
يبدأ أمر الإنشاء والدفع ثلاث عمليات. أولاً، يقوم بإنشاء مجلد جديد في الحل يسمى config والذي يحتوي على بيان النشر الكامل، والذي تم إنشاؤه بناءً على المعلومات الموجودة في قالب النشر وملفات الحل الأخرى. ثانيًا، يقوم بتشغيل docker build لإنشاء صورة الحاوية بناءً على dockerfile المناسب للبنية المستهدفة. بعد ذلك، يتم تشغيل docker push لدفع مستودع الصور إلى سجل الحاوية الخاص بك.
قد تستغرق هذه العملية عدة دقائق في المرة الأولى، ولكنها تكون أسرع في المرة التالية التي تقوم فيها بتشغيل الأوامر.
اختياري: تحديث الوحدة النمطية والصورة
إذا أجريت تغييرات على التعليمات البرمجية للوحدة النمطية، فيجب عليك إعادة إنشاء صورة الوحدة النمطية ودفعها إلى سجل الحاوية الخاص بك. استخدم الخطوات الواردة في هذا القسم لتحديث صورة البناء والحاوية. يمكنك تخطي هذا القسم إذا لم تقم بإجراء أي تغييرات على التعليمات البرمجية للوحدة النمطية.
افتح الملف deployment.amd64.json في مجلد التكوين الذي تم إنشاؤه حديثًا. يعكس اسم الملف البنية الهدف، لذلك يكون مختلفا إذا اخترت بنية مختلفة.
لاحظ أن المعلمتين اللتين تحتويان على عناصر نائبة تحتويان الآن على قيمهما المناسبة. يحتوي القسم registryCredentials على اسم مستخدم التسجيل وكلمة المرور المسحوبين من ملف .env . يحتوي على filtermodule مستودع الصور الكامل مع الاسم والإصدار وعلامة الهندسة المعمارية من ملف module.json .
افتح ملف module.json في مجلد filtermodule.
تغيير رقم الإصدار لصورة الوحدة النمطية. على سبيل المثال، قم بزيادة رقم إصدار التصحيح إلى
"version": "0.0.2"كما لو قمت بإجراء إصلاح صغير في التعليمات البرمجية للوحدة النمطية.تلميح
تعمل إصدارات الوحدة النمطية على تمكين التحكم في الإصدار، وتسمح لك باختبار التغييرات على مجموعة صغيرة من الأجهزة قبل نشر التحديثات على الإنتاج. إذا لم تقم بزيادة إصدار الوحدة النمطية قبل الإنشاء والدفع، أنت تقوم بالكتابة فوق المستودع في سجل الحاوية.
احفظ التغييرات التي أجريتها على ملف module.json .
أنشئ الصورة المحدثة وادفعها باستخدام علامة إصدار 0.0.2 . على سبيل المثال، لبناء ودفع الصورة للسجل المحلي أو سجل حاويات Azure، استخدم الأوامر التالية:
# Build the container image for Linux and amd64 architecture.
dotnet publish --os linux --arch x64
# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.
docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64
# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64
انقر بزر الفأرة الأيمن على ملف deployment.template.json مرة أخرى، واختر Build ودفع IoT Edge Solution مرة أخرى.
افتح ملف deployment.amd64.json مرة أخرى. لاحظ أن نظام الإنشاء لا ينشئ ملفا جديدا عند تشغيل أمر الإنشاء والدفع مرة أخرى. بدلا من ذلك، يتم تحديث الملف نفسه ليعكس التغييرات. تشير صورة filtermodule الآن إلى الإصدار 0.0.2 من الحاوية.
للتحقق أكثر مما فعله أمر البناء والدفع، اذهب إلى بوابة Azure وانتقل إلى سجل الحاويات الخاص بك. في سجل الحاوية، حدد Repositories ثم filtermodule. تحقق من دفع كلا الإصدارين من الصورة إلى السجل.
استكشاف الأخطاء وإصلاحها
إذا واجهت أخطاء عند إنشاء صورة الوحدة النمطية ودفعها، فغالبًا ما يكون لها علاقة بتكوين Docker على جهاز التطوير الخاص بك. استخدم الفحوصات التالية لمراجعة التكوين الخاص بك:
- هل قمت بتشغيل الأمر
docker loginباستخدام بيانات الاعتماد التي قمت بنسخها من سجل الحاوية؟ هذه البيانات تختلف عن تلك التي تستخدمها لتسجيل الدخول إلى Azure. - هل مستودع الحاويات الخاص بك صحيح؟ هل له اسم تسجيل حاوية صحيح واسم وحدة صحيح؟ افتح ملف module.json في مجلد filtermodule للتحقق. يجب أن تكون قيمة المستودع مشابهة لاسم<> التسجيل.azurecr.io/filtermodule.
- إذا استخدمت اسما مختلفا عن filtermodule للوحدة النمطية الخاصة بك، هل هذا الاسم متناسق في جميع أنحاء الحل؟
- هل يعمل جهازك بنفس نوع الحاويات التي تقوم ببنائها؟ هذا الدرس مخصص لأجهزة لينكس IoT Edge، لذا يجب أن تكتب Visual Studio Code amd64 أو arm32v7 في الشريط الجانبي، ويجب أن يعمل Docker Desktop بحاويات لينكس.
نشر الوحدات النمطية على الجهاز
لقد تحققت من وجود صور حاوية تم إنشاؤها مخزنة في سجل الحاوية، لذلك حان الوقت لنشرها على جهاز. تأكد من أن جهاز IoT Edge الخاص بك يعمل ويعمل بشكل جيد.
استخدم أمر IoT Edge Azure CLI set-modules لنشر الوحدات على Azure IoT Hub. على سبيل المثال، لنشر الوحدات المعرفة في ملف deployment.template.json إلى IoT Hub my-iot-hub لجهاز IoT Edge my-device، استخدم الأمر التالي. استبدل قيم hub-name، device-id، وقيم login IoT Hub connection string بقيم خاصة بك.
az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"
تلميح
ابحث عن IoT Hub connection string الخاص بك، بما في ذلك مفتاح الوصول المشترك، في بوابة Azure. اذهب إلى IoT Hub الخاص بك، واختر إعدادات الأمان > سياسات الوصول المشترك > iothubowner.
في مستكشف Visual Studio Code، تحت قسم Azure IoT Hub، وسع Devices لرؤية قائمة أجهزة إنترنت الأشياء الخاصة بك.
انقر بزر الفأرة الأيمن على IoT Edge الجهاز الذي تريد نشره عليه، ثم اختر Create Deployment for Single Device.
في مستكشف الملفات، انتقل إلى مجلد التكوين ثم حدد الملف deployment.amd64.json.
لا تستخدم ملف deployment.template.json، الذي لا يحتوي على بيانات اعتماد سجل الحاوية أو قيم صورة الوحدة النمطية فيه. إذا كنت تستهدف جهاز Linux ARM32، يتم deployment.arm32v7.json اسم بيان التوزيع.
ضمن جهازك، قم بتوسيع Modules لمشاهدة قائمة بالوحدات النمطية التي تم نشرها وتشغيلها. حدد زر التحديث. يجب أن تشاهد وحدات tempSensor وتصفية الوحدات النمطية الجديدة التي تعمل على جهازك.
قد يستغرق بدء تشغيل الوحدات بضع دقائق. يستقبل وقت تشغيل IoT Edge بيان النشر الجديد، ويسحب صور الوحدات من وقت تشغيل الحاوية، ثم يبدأ كل وحدة جديدة.
عرض الرسائل من الجهاز
يحصل نموذج التعليمات البرمجية للوحدة النمطية على رسائل من خلال قائمة انتظار الإدخال الخاصة به ويرسلها من خلال قائمة انتظار الإخراج الخاصة به. يقوم بيان النشر بإعداد مسارات ترسل رسائل إلى filtermodule من tempSensor، ثم تعيد إرسال الرسائل من filtermodule إلى IoT Hub. تتيح لك امتدادات Azure IoT Edge و Azure IoT Hub رؤية الرسائل عند وصولها إلى IoT Hub من جهازك.
في مستكشف Visual Studio Code، اختر الجهاز IoT Edge الذي تريد مراقبته، ثم اختر Start Monitoring Built-in Event Endpoint.
راقب نافذة الإخراج في Visual Studio Code لترى الرسائل تصل إلى IoT Hub الخاص بك.
عرض التغييرات على الجهاز
لرؤية ما يحدث على جهازك، استخدم الأوامر في هذا القسم لفحص وقت تشغيل IoT Edge والوحدات التي تعمل على جهازك.
هذه الأوامر موجهة لجهاز IoT Edge الخاص بك، وليس لجهاز التطوير الخاص بك. إذا كنت تستخدم آلة افتراضية لجهاز IoT Edge الخاص بك، فاتصل به الآن. في Azure، اذهب إلى صفحة نظرة عامة على الآلة الافتراضية واختر Connect للوصول إلى اتصال الشل الآمن.
عرض جميع الوحدات النمطية المنشورة على جهازك، والتحقق من حالتها:
iotedge listترى أربع وحدات: وحدتا التشغيل IoT Edge، tempSensor، وfiltermodule. يجب إدراج الأربعة جميعا على أنها قيد التشغيل.
فحص السجلات لوحدة نمطية معينة:
iotedge logs <module name>أسماء الوحدات النمطية حساسة لحالة الأحرف.
تعرض سجلات tempSensorوfiltemodule الرسائل التي يعالجونها. تبدأ الوحدة النمطية edgeAgent الوحدات النمطية الأخرى، بحيث تحتوي سجلاتها على معلومات حول بيان التوزيع. إذا لم تكن الوحدة النمطية مدرجة أو لا تعمل، فتحقق من سجلات edgeAgent بحثا عن الأخطاء. تدير وحدة edgeHub الاتصال بين الوحدات و IoT Hub. إذا كانت الوحدات تعمل لكن الرسائل لا تصل إلى IoT Hub لك، تحقق من سجلات edgeHub بحثا عن الأخطاء.
تنظيف الموارد
إذا كنت تريد المتابعة إلى المقالة الموصى بها التالية، فاحتفظ بالموارد والتكوينات التي أنشأتها ثم أعد استخدامها. يمكنك أيضا الاستمرار في استخدام نفس جهاز IoT Edge كجهاز اختبار. وإلا، لتجنب الرسوم، قم بحذف التكوين المحلي وموارد Azure التي استخدمتها في هذا المقال.
Delete Azure resources
لا يمكنك التراجع عن حذف موارد Azure ومجموعات الموارد. يُرجى التأكد من عدم حذف مجموعة الموارد أو الموارد غير الصحيحة عن طريق الخطأ. إذا أنشأت IoT Hub داخل مجموعة موارد موجودة تحتوي على موارد تريد الاحتفاظ بها، احذف فقط مورد IoT Hub نفسه، وليس مجموعة الموارد.
لحذف الموارد:
- سجل الدخول إلى بوابة Azure، ثم اختر Resource groups.
- اختر اسم مجموعة الموارد التي تحتوي على موارد اختبار IoT Edge الخاصة بك.
- راجع قائمة الموارد التي تحتويها مجموعة الموارد الخاصة بك. إذا كنت تريد حذفها جميعاً، يمكنك تحديد Delete resource group. إذا أردت حذف بعضها فقط، اختر كل مورد لحذفه بشكل منفصل.
الخطوات التالية
في هذا الدرس، تقوم بإعداد Visual Studio Code على جهاز التطوير الخاص بك وتنشر أول وحدة IoT Edge باستخدام كود يقوم بتصفية البيانات الخام التي يولدها جهاز IoT Edge الخاص بك.
تابع إلى الدروس التالية لتتعلم كيف يتيح لك Azure IoT Edge نشر خدمات سحابة Azure لمعالجة وتحليل البيانات على الحافة.