البرنامج التعليمي: تطوير وحدة C# IoT Edge النمطية باستخدام حاويات Linux
ينطبق على:
IoT Edge 1.1 IoT Edge 1.2 ![]()
استخدم Visual Studio Code لتطوير التعليمات البرمجية C# ونشرها على جهاز يعمل على Azure IoT Edge.
يمكنك استخدام وحدات Azure IoT Edge النمطية لنشر التعليمات البرمجية التي تنفذ منطق عملك مباشرةً على أجهزة IoT Edge. هذا البرنامج التعليمي يرشدك من خلال إنشاء ونشر وحدة IoT Edge التي تعمل على تصفية بيانات الاستشعار. ستستخدم جهاز IoT Edge المحاكي الذي أنشأته في عمليات التشغيل السريع. في هذا البرنامج التعليمي، تتعلم كيفية:
- استخدام Visual Studio Code لإنشاء وحدة IoT Edge نمطية تستند إلى .NET Core 2.1 SDK.
- استخدام Visual Studio Code وDocker لإنشاء صورة Docker ونشرها إلى سجلك.
- نشر الوحدة النمطية إلى جهاز IoT Edge.
- عرض البيانات التي تم إنشاؤها.
تقوم وحدة IoT Edge التي تقوم بإنشائها في هذا البرنامج التعليمي بتصفية بيانات درجة الحرارة التي تم إنشاؤها بواسطة جهازك. يرسل رسائل فقط تجاه المنبع إذا كانت درجة الحرارة فوق عتبة محددة. هذا النوع من التحليل على الحافة مفيد لتقليل كمية البيانات التي يتم توصيلها وتخزينها في السحابة.
إذا لم يكن لديك اشتراك Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.
المتطلبات الأساسية
يوضح هذا البرنامج التعليمي كيفية تطوير وحدة نمطية في C# باستخدام Visual Studio Code، ونشرها على جهاز IoT Edge. إذا كنت تطور الوحدات النمطية باستخدام حاويات Windows، فانتقِل إلى تطوير وحدة C# IoT Edge النمطية باستخدام حاويات Windows بدلاً من ذلك.
استخدم الجدول التالي لفهم خياراتك لتطوير ونشر وحدات C# باستخدام حاويات Linux:
| C# | تعليمة Visual Studio برمجية | Visual Studio |
|---|---|---|
| Linux AMD64 | ![]() |
![]() |
| Linux ARM32 | ![]() |
![]() |
| لينكس ARM64 | ![]() |
![]() |
قبل بدء هذا البرنامج التعليمي، يجب الانتهاء من البرنامج التعليمي السابق لإعداد بيئة التطوير: تطوير وحدات IoT Edge النمطية باستخدام حاويات Linux. بعد استكمال هذا البرنامج التعليمي، يجب أن تكون لديك المتطلبات الأساسية التالية:
- مركز مجاني أو قياسي لـ IoT في Azure.
- جهاز يعمل على Azure IoT Edge مع حاويات لينكس. يمكنك استخدام قوالب التشغيل السريع لإعداد جهاز Linux أو جهاز يعمل بنظام Windows .
- سجل حاوية، مثل Azure Container Registry .
- Visual Studio Code الذي تم تكوينه باستخدام Azure IoT Tools .
- Docker CE التي تم تكوينها لتشغيل حاويات Linux.
لاستكمال هذه البرامج التعليمية، يُرجى إعداد المتطلبات الأساسية الإضافية التالية على جهاز التطوير:
إنشاء مشروع وحدة نمطية
تنشئ الخطوات التالية مشروع وحدة IoT Edge نمطية لـ C# باستخدام Visual Studio Code وملحق أدوات IoT Azure. بعد إنشاء قالب مشروع، أضف تعليمات برمجية جديدة بحيث تعمل الوحدة النمطية على تصفية الرسائل استنادًا إلى خصائصها التي تم الإبلاغ عنها.
إنشاء مشروع جديد
أنشئ قالب حل C# يمكنك تخصيصه باستخدام التعليمات البرمجية.
في Visual Studio Code، حدد View>Command Palette لفتح لوحة أوامر VS Code.
في لوحة الأوامر، أدخل الأمر Azure: Sign in وشغّله واتبع الإرشادات لتسجيل الدخول إلى حسابك على Azure. إذا كنت قد سجّلت الدخول من قبل، يمكنك تخطي هذه الخطوة.
في لوحة الأوامر، أدخل الأمر Azure IoT Edge: New IoT Edge solution وشغّله. اتبع المطالبات في لوح الأوامر لإنشاء الحل الخاص بك.
الحقل القيمة حدد مجلدًا اختر الموقع على جهاز التطوير الخاص بك لأجل VS Code لإنشاء ملفات الحل. توفير اسم حل أدخل اسمًا وصفيًّا للحل الذي تستخدمه أو اقبل EdgeSolution الافتراضي. تحديد قالب الوحدة النمطية اختر وحدة C# النمطية. توفير اسم وحدة نمطية أطلق اسمًا على الوحدة النمطية CSharpFunction . توفير مستودع صور Docker للوحدة النمطية يتضمن مستودع الصور اسم سجل الحاوية واسم صورة الحاوية. صورة الحاوية الخاصة بك مملوءة مسبقًا بالاسم الذي قدمته في الخطوة الأخيرة. استبدل localhost:5000 بقيمة خادم تسجيل الدخول من سجل حاوية Azure. يمكنك استرداد ملقم تسجيل الدخول من صفحة نظرة عامة من تسجيل الحاوية في مدخل Azure.
يبدو مستودع الصور النهائي مثل <اسم> التسجيل .azurecr.io/csharpmodule.
أضف بيانات اعتماد التسجيل الخاصة بك
ملف البيئة يخزن بيانات الاعتماد الخاصة بسجل الحاوية ويشاركها مع وقت التشغيل IoT Edge. يحتاج وقت التشغيل إلى بيانات الاعتماد هذه لسحب الصور الخاصة بك إلى جهاز IoT Edge. استخدم بيانات الاعتماد من القسم Access keys من سجل حاويات Azure.
يحاول ملحق IoT Edge سحب بيانات اعتماد تسجيل الحاوية من Azure وتعبئتها في ملف البيئة. تحقق لمعرفة ما إذا كانت بيانات الاعتماد الخاصة بك مضمنة بالفعل. إذا لم يكن كذلك، فأضفها الآن:
- في مستكشف VS Code، افتح الملف .env.
- حدث الحقول باستخدام قيم username وpassword التي نسختها من سجل حاوية Azure.
- احفظ هذا الملف.
ملاحظة
يستخدم هذا البرنامج التعليمي بيانات اعتماد تسجيل دخول المسؤول لسجل Azure Container، والتي تعتبر ملائمة لسيناريوهات التطوير والاختبار. عندما تكون جاهزًا لسيناريوهات الإنتاج، نوصي بخيار مصادقة أقل امتيازًا مثل كيانات الخدمة. لمزيد من المعلومات، راجع إدارة الوصول إلى سجل الحاوية.
حدد تصميم الهدف
يمكن حاليًا لبرنامج Visual Studio Code تطوير وحدات C# الوطنية لأجهزة LINUX AMD64 وLinux ARM32v7. تحتاج إلى تحديد التصميم الذي تستهدفه مع كل حل، لأن الحاوية مبنية ويتم تشغيلها بشكل مختلف لكل نوع من أنواع التصاميم. الافتراضي هو Linux AMD64.
افتح لوحة الأوامر وابحث عن Azure IoT Edge: تعيين المنصة الهدف الافتراضي؟ لحل Edge، أو حدد رمز الاختصار في الشريط الجانبي أسفل النافذة.
في لوحة الأوامر، حدد بنية الهدف من قائمة الخيارات. في هذا البرنامج التعليمي، نستخدم جهاز Ubuntu الظاهري كجهاز IoT Edge، لذلك سنتخذ amd64 الافتراضي.
تحديث الوحدة النمطية باستخدام التعليمات البرمجية المخصصة
في مستكشف VS Code، افتح modules>CSharpModule>Program.cs.
في الجزء العلوي من مساحة الاسم CSharpModule، أضِف ثلاثة عبارات using للأنواع التي يتم استخدامها لاحقًا:
using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvertأضِف متغير temperatureThreshold إلى فئة Program. يضبط هذا المتغير القيمة التي يجب أن تتجاوزها درجة الحرارة المقاسة للبيانات التي سيتم إرسالها إلى مركز IoT.
static int temperatureThreshold { get; set; } = 25;أضف فئات MessageBody وMachine وAmbient إلى فئة Program. تعمل هذه الفئات على تعريف المخطط المتوقع للنص الأساسي الرسائل الواردة.
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;} }ابحث عن الدالة Init. تعمل هذه الدالة على إنشاء كائن ModuleClient وتكوينه، ما يسمح للوحدة النمطية بالاتصال بوقت تشغيل Azure IoT Edge المحلي لإرسال الرسائل وتلقيها. بعد إنشاء ModuleClient، تقرأ التعليمات البرمجية قيمة temperatureThreshold من الخصائص المطلوبة للوحدة النمطية. كما تسجل التعليمات البرمجية رد اتصال لتلقي الرسائل من مركز IoT Edge عبر نقطة نهاية تسمى input1.
استبدال الطريقة SetInputMessageHandlerAsync بأخرى جديدة تعمل على تحديث اسم نقطة النهاية والطريقة التي يتم استدعاؤها عند وصول الإدخال. بالإضافة إلى ذلك، أضِف الطريقة SetDesiredPropertyUpdateCallbackAsync للحصول على تحديثات للخصائص المطلوبة. لإجراء هذا التغيير، استبدل السطر الأخير من الطريقة Init بالتعليمات البرمجية التالية:
// Register a callback for messages that are received by the module. // await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", PipeMessage, iotHubModuleClient); // Read the TemperatureThreshold value from the module twin's desired properties var moduleTwin = await ioTHubModuleClient.GetTwinAsync(); await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, ioTHubModuleClient); // Attach a callback for updates to the module twin's desired properties. await ioTHubModuleClient.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 ioTHubModuleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, ioTHubModuleClient);أضِف الطريقة onDesiredPropertiesUpdate إلى فئة Program. تتلقى هذه الطريقة تحديثات على الخصائص المطلوبة من الوحدة النمطية المزدوجة، وتُحدّث متغير 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; }استبدل الطريقة PipeMessage بالطريقة FilterMessages. يتم استدعاء هذه الطريقة عندما تتلقى الوحدة النمطية رسالة من مركز IoT Edge. فهو يعمل على تصفية الرسائل التي تبلغ عن درجات حرارة أقل من الحد الأدنى لدرجة الحرارة التي تم ضبطها عبر الوحدة المزدوجة. تضيف الطريقة أيضًا خاصية MessageType إلى الرسالة مع ضبط القيمة على Alert.
static 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; } }حفظ ملف «Program.cs»
في مستكشف VS Code، افتح ملفdeployment.template.json في مساحة عمل حل IoT Edge.
نظرًا إلى أننا أجرينا تغييرًا لاسم نقطة النهاية التي تراعيها الوحدة النمطية، نحتاج أيضًا إلى تحديث المسارات في بيان النشر حتى يرسل edgeHub الرسائل إلى نقطة النهاية الجديدة.
ابحث عن قسم routes في الوحدة النمطية المزدوجة $edgeHub. يمكنك تحديث المسار sensorToCSharpModule لاستبدال
input1 بـ inputFromSensor:"sensorToCSharpModule": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/CSharpModule/inputs/inputFromSensor\")"أضِف الوحدة النمطية المزدوجة CSharpModule إلى بيان النشر. أدرِج محتوى JSON التالي في الجزء السفلي من القسم modulesContent، بعد الوحدة النمطية المزدوجة $edgeHub:
"CSharpModule": { "properties.desired":{ "TemperatureThreshold":25 } }
احفظ ملف publish.template.json.
أنشئ الوحدة النمطية وانقلها
لقد أنشأت في القسم السابق حل IoT Edge ثم أضفت التعليمات البرمجية إلى CSharpModule. تعمل التعليمات البرمجية الجديدة على تصفية الرسائل حيث تكون درجة حرارة الجهاز المبلغ عنها ضمن الحدود المقبولة. الآن تحتاج إلى إنشاء الحل كصورة حاوية ونقلها إلى سجل الحاوية.
افتح المحطة الطرفية المدمجة لـ VS Code بتحديد View>Terminal.
قم بتسجيل الدخول إلى Docker بإدخال الأمر التالي في المحطة الطرفية. قم بتسجيل الدخول باستخدام اسم المستخدم وكلمة المرور وخادم تسجيل الدخول من سجل الحاويات Azure. يمكنك استرداد هذه القيم من قسم Access keys في السجل الخاص بك في منصة Azure.
docker login -u <ACR username> -p <ACR password> <ACR login server>قد تتلقى تحذيرًا أمنيًا يوصي باستخدام
--password-stdin. على الرغم من أن أفضل الممارسات موصى بها لسيناريوهات الإنتاج، إلا أنها خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker.في مستكشف VS Code، انقر بزر الماوس الأيمن فوق ملف publish.template.json وحدد Build and Push IoT Edge Solution.
يبدأ أمر الإنشاء والدفع ثلاث عمليات. أولاً، ينشئ مجلدًا جديدًا في الحل يسمى config والذي يحتوي على بيان النشر الكامل، والذي تم إنشاؤه بناءً على المعلومات الموجودة في قالب النشر وملفات الحل الأخرى. ثانياً، يقوم بتشغيل
docker buildلإنشاء صورة الحاوية بناءً على ملف dockerfile المناسب للبنية المستهدفة. بعد ذلك، يقوم بتشغيلdocker pushلدفع مستودع الصور إلى سجل الحاوية الخاص بك.قد تستغرق هذه العملية عدة دقائق في المرة الأولى، ولكنها تكون أسرع في المرة التالية التي تعمل فيها على تشغيل الأوامر.
نشر الحل وتشغيله
استخدم مستكشف Visual Studio Code وملحق أدوات Azure IoT لنشر مشروع الوحدة النمطية على جهاز IoT Edge. لديك بالفعل بيان نشر مُجهز للسيناريو الخاص بك، الملف deployment.amd64.json في مجلد التكوين. كل ما عليك القيام به الآن هو تحديد جهاز لتلقي النشر.
تأكد من أن جهاز IoT Edge الخاص بك يعمل.
في مستكشف Visual Studio Code ضمن قسم Azure IoT Hub، قم بتوسيع الأجهزة لمشاهدة قائمة أجهزة إنترنت الأشياء الخاصة بك.
انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge الخاص بك، ثم حدد Create Deployment for Single Device.
افتح الملف deployment.amd64.json في المجلد config ثم انقر فوق Select Edge Deployment Manifest. لا تستخدم الملف deployment.template.js.
تحت جهازك، قم بتوسيع الوحدات النمطية لمشاهدة قائمة بالوحدات التي تم نشرها وتشغيلها. انقر فوق زر التحديث. من المفترض أن يظهر لك CSharpModule الجديدة تعمل بالتعاون مع الوحدة النمطية SimulatedTemperatureSensor و$ edgeAgent و$edgeHub.
قد يستغرق الأمر بضع دقائق لبدء تشغيل الوحدات النمطية. يحتاج وقت تشغيل IoT Edge إلى استلام بيان النشر الجديد الخاص به، وسحب صور الوحدة النمطية من وقت تشغيل الحاوية، ثم بدء تشغيل كل وحدة نمطية جديدة.
عرض البيانات التي تم إنشاؤها
بعد تطبيق بيان النشر على جهاز IoT Edge، يعمل وقت تشغيل IoT Edge على الجهاز على تجميع معلومات النشر الجديدة وبدء التنفيذ عليها. يتم إيقاف أي وحدات نمطية تعمل على الجهاز غير مضمنة في بيان النشر. يتم بدء تشغيل أي وحدات مفقودة من الجهاز.
في مستكشف Visual Studio Code، انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge وحدد Start Monitoring Built-in Event Endpoint.
عرض الرسائل التي تصل إلى مركز IoT. قد يستغرق وصول الرسائل بعض الوقت، لأن جهاز IoT Edge يجب أن يتلقى عملية النشر الجديد وبدء تشغيل جميع الوحدات النمطية. وبعد ذلك، تنتظر التغييرات التي أجريناها على رمز CModule حتى تصل درجة حرارة الجهاز إلى 25 درجة قبل إرسال الرسائل. كما أنها تضيف نوع الرسالة Alert إلى أي رسائل تصل إلى الحد الأدنى لدرجة الحرارة.

تحرير الوحدة النمطية المزدوجة
استخدمنا وحدة Sharp Module النمطية المزدوجة في بيان النشر لضبط الحد الأدنى لدرجة الحرارة عند 25 درجة. يمكنك استخدام الوحدة النمطية المزدوجة لتغيير الوظيفة دون الحاجة إلى تحديث التعليمات البرمجية للوحدة النمطية.
في Visual Studio Code، وسّع التفاصيل الموجودة ضمن جهاز IoT Edge لرؤية الوحدات النمطية قيد التشغيل.
انقر بزر الماوس الأيمن فوق CSharpModule، وحدد Edit module twin.
ابحث عن TemperatureThreshold في الخصائص المطلوبة. تغيير قيمته إلى درجة حرارة جديدة من 5 درجات إلى 10 درجات أعلى من آخر درجة حرارة مبلغ عنها.
احفظ ملف الوحدة النمطية المزدوجة.
انقر بزر الماوس الأيمن في أي مكان في جزء تحرير الوحدة النمطية المزدوجة وحدد تحديث الوحدة النمطية المزدوجة.
وراقب الرسائل الواردة من الجهاز إلى السحابة. يجب أن تشاهد الرسائل تتوقف حتى يتم الوصول إلى حد درجة الحرارة الجديد.
تنظيف الموارد
إذا كنت تخطط للمتابعة إلى المقالة التالية الموصى بها، يمكنك الاحتفاظ بالموارد والتكوينات التي قمت بإنشائها وإعادة استخدامها. يمكنك أيضًا الاستمرار في استخدام نفس جهاز IoT Edge كجهاز اختبار.
غير ذلك يمكنك حذف التكوينات المحلية وموارد Azure التي استخدمتها في هذه المقالة لتجنب التكاليف.
حذف موارد Azure
حذف موارد Azure ومجموعات الموارد لا رجعة فيه. تأكد من عدم حذفك لمجموعة المورد (الموارد) الخاطئة عن غير قصد. إذا قمت بإنشاء مركز IoT داخل مجموعة موارد موجودة لديها موارد تريد الاحتفاظ بها، فاحذف فقط مورد محور IoT نفسه، وليس مجموعة الموارد.
لحذف الموارد:
سجّل الدخول إلى مدخل Microsoft Azure، ثم حدد Resource groups.
حدد اسم مجموعة الموارد التي تحتوي على موارد اختبار IoT Edge.
راجع قائمة الموارد الموجودة في مجموعة الموارد الخاصة بك. إذا كنت تريد حذفها جميعاً، يمكنك تحديد Delete resource group. إذا كنت تريد حذف بعضها فقط، فيمكنك النقر فوق كل مورد لحذفها بشكل فردي.
الخطوات التالية
لقد أنشأت في هذا البرنامج التعليمي وحدة IoT Edge النمطية التي تحتوي على تعليمات برمجية لتصفية البيانات الأولية التي أنشأها جهاز IoT Edge.
يمكنك متابعة الدروس التالية لمعرفة كيف يمكن أن تساعدك Azure IoT Edge في نشر خدمات سحابة Azure لمعالجة البيانات وتحليلها على الحافة.
