تطوير وحدة C# IoT Edge لنقل الملفات على Azure Stack Edge Pro

ينطبق على:Yes for Pro GPU SKU Azure Stack Edge Pro - GPUAzureYes for Pro 2 SKU Stack Edge Pro 2AzureYes for Pro R SKU Stack Edge Pro RAzureYes for Mini R SKU Stack Edge Mini R

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

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

ستتعلم في هذا المقال طريقة إجراء ما يلي:

  • قم بإنشاء سجل حاوية لتخزين الوحدات النمطية وإدارتها (صور Docker).
  • قم بإنشاء وحدة IoT Edge النمطية لنشرها على جهاز Azure Stack Edge Pro.

حول وحدة IoT Edge

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

  1. تتم كتابة الملفات إلى المشاركة المحلية على جهاز Azure Stack Edge Pro.
  2. يقوم مولد أحداث الملفات بإنشاء حدث ملف لكل ملف مكتوب إلى المشاركة المحلية. يتم أيضا إنشاء أحداث الملف عند تعديل ملف. ثم يتم إرسال أحداث الملف إلى IoT Edge Hub (في وقت تشغيل IoT Edge).
  3. تقوم الوحدة النمطية المخصصة IoT Edge بمعالجة حدث الملف لإنشاء كائن حدث ملف يحتوي أيضا على مسار نسبي للملف. تقوم الوحدة النمطية بإنشاء مسار مطلق باستخدام مسار الملف النسبي ونسخ الملف من المشاركة المحلية إلى المشاركة السحابية. ثم تقوم الوحدة النمطية بحذف الملف من المشاركة المحلية.

How Azure IoT Edge module works on Azure Stack Edge Pro

بمجرد أن يصبح الملف في المشاركة السحابية، يتم تحميله تلقائيا إلى حساب Azure Storage الخاص بك.

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

قبل أن تبدأ، تأكد من أن لديك:

إنشاء سجل حاويات

سجل حاوية Azure هو سجل Docker خاص في Azure حيث يمكنك تخزين صور حاوية Docker الخاصة بك وإدارتها. خدمتا تسجيل Docker الشائعتان المتوفران في السحابة هما Azure Container Registry و Docker Hub. تستخدم هذه المقالة "سجل الحاويات".

  1. سجّل الدخول إلى مدخل Azure على https://portal.azure.com.

  2. حدد إنشاء سجل حاويات > موارد>. انقر فوق ⁧⁩Create⁧⁩.

  3. زود:

    1. اسم تسجيل فريد داخل Azure يحتوي على 5 إلى 50 حرفا أبجديا رقميا.

    2. اختر اشتراكا.

    3. إنشاء مجموعة موارد جديدة أو اختيار مجموعة موارد موجودة.

    4. تحديد الموقع. نوصي بأن يكون هذا الموقع هو نفسه المقترن بمورد Azure Stack Edge.

    5. قم بتبديل مستخدم المسؤول إلى تمكين.

    6. اضبط SKU على أساسي.

      Create container registry

  4. حدد Create.

  5. بعد إنشاء سجل الحاوية، استعرض للوصول إليه، وحدد مفاتيح Access.

    Get Access keys

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

إنشاء مشروع وحدة IoT Edge

الخطوات التالية إنشاء مشروع وحدة IoT Edge استنادا إلى .NET Core 2.1 SDK. يستخدم المشروع Visual Studio Code وملحق Azure IoT Edge.

إنشاء حل جديد

أنشئ قالب حل C# يمكنك تخصيصه باستخدام التعليمات البرمجية.

  1. في التعليمات البرمجية Visual Studio، حدد عرض > لوحة الأوامر لفتح لوحة أوامر VS Code.

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

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

    1. حدد المجلد الذي تريد إنشاء الحل فيه.

    2. قم بتوفير اسم للحل الخاص بك أو اقبل EdgeSolution الافتراضي.

      Create new solution 1

    3. اختر C# الوحدة النمطية كقالب الوحدة النمطية.

    4. استبدل اسم الوحدة النمطية الافتراضي بالاسم الذي تريد تعيينه، وفي هذه الحالة، يكون FileCopyModule.

      Create new solution 2

    5. حدد سجل الحاوية الذي قمت بإنشائه في القسم السابق كمستودع صور للوحدة النمطية الأولى. استبدال localhost:5000 بقيمة خادم تسجيل الدخول التي قمت بنسخها.

      السلسلة النهائية تبدو مثل <Login server name>/<Module name>. في هذا المثال، تكون السلسلة: mycontreg2.azurecr.io/filecopymodule.

      Create new solution 3

  4. انتقل إلى مجلد فتح الملف>.

    Create new solution 4

  5. استعرض مجلد EdgeSolution الذي قمت بإنشائه مسبقا وأشر إليه. تقوم نافذة VS Code بتحميل مساحة عمل حل IoT Edge الخاصة بك بمكوناتها الخمسة عالية المستوى. لن تقوم بتحرير .vscode المجلد وملف . gitignore وملف . env وملف deployment.template.json** في هذه المقالة.

    المكون الوحيد الذي تقوم بتعديله هو مجلد الوحدات النمطية. يحتوي هذا المجلد على رمز C # للوحدة النمطية وملفات Docker لإنشاء الوحدة النمطية الخاصة بك كصورة حاوية.

    Create new solution 5

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

  1. في مستكشف التعليمات البرمجية VS، افتح الوحدات النمطية > برنامج FileCopyModule > .cs.

  2. في الجزء العلوي من مساحة اسم FileCopyModule، أضف ما يلي باستخدام عبارات للأنواع التي يتم استخدامها لاحقا. Microsoft.Azure.Devices.Client.Transport.Mqtt هو بروتوكول لإرسال الرسائل إلى IoT Edge Hub.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. إضافة المتغير InputFolderPath و OutputFolderPath إلى فئة البرنامج.

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. مباشرة بعد الخطوة السابقة، أضف فئة FileEvent لتحديد نص الرسالة.

    /// <summary>
    /// The FileEvent class defines the body of incoming messages. 
    /// </summary>
    private class FileEvent
    {
        public string ChangeType { get; set; }
    
        public string ShareRelativeFilePath { get; set; }
    
        public string ShareName { get; set; }
    }
    
  5. في الأسلوب Init، تقوم التعليمة البرمجية بإنشاء كائن ModuleClient وتكوينه. يسمح هذا الكائن للوحدة النمطية بالاتصال بوقت تشغيل Azure IoT Edge المحلي باستخدام بروتوكول MQTT لإرسال الرسائل وتلقيها. يتم توفير سلسلة الاتصال المستخدمة في أسلوب Init إلى الوحدة النمطية بواسطة وقت تشغيل IoT Edge. تسجل التعليمة البرمجية رد اتصال FileCopy لتلقي الرسائل من مركز IoT Edge عبر نقطة نهاية input1 . استبدال الأسلوب Init بالتعليمة البرمجية التالية.

    /// <summary>
    /// Initializes the ModuleClient and sets up the callback to receive
    /// messages containing file event information
    /// </summary>
    static async Task Init()
    {
        MqttTransportSettings mqttSetting = new MqttTransportSettings(TransportType.Mqtt_Tcp_Only);
        ITransportSettings[] settings = { mqttSetting };
    
        // Open a connection to the IoT Edge runtime
        ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
        await ioTHubModuleClient.OpenAsync();
        Console.WriteLine("IoT Hub module client initialized.");
    
        // Register callback to be called when a message is received by the module
        await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", FileCopy, ioTHubModuleClient);
    }
    
  6. قم بإزالة التعليمات البرمجية لأسلوب PipeMessage وفي مكانها ، أدخل التعليمة البرمجية ل FileCopy.

        /// <summary>
        /// This method is called whenever the module is sent a message from the IoT Edge Hub.
        /// This method deserializes the file event, extracts the corresponding relative file path, and creates the absolute input file path using the relative file path and the InputFolderPath.
        /// This method also forms the absolute output file path using the relative file path and the OutputFolderPath. It then copies the input file to output file and deletes the input file after the copy is complete.
        /// </summary>
        static async Task<MessageResponse> FileCopy(Message message, object userContext)
        {
            int counterValue = Interlocked.Increment(ref counter);
    
            try
            {
                byte[] messageBytes = message.GetBytes();
                string messageString = Encoding.UTF8.GetString(messageBytes);
                Console.WriteLine($"Received message: {counterValue}, Body: [{messageString}]");
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    var fileEvent = JsonConvert.DeserializeObject<FileEvent>(messageString);
    
                    string relativeFileName = fileEvent.ShareRelativeFilePath.Replace("\\", "/");
                    string inputFilePath = InputFolderPath + relativeFileName;
                    string outputFilePath = OutputFolderPath + relativeFileName;
    
                    if (File.Exists(inputFilePath))                
                    {
                        Console.WriteLine($"Moving input file: {inputFilePath} to output file: {outputFilePath}");
                        var outputDir = Path.GetDirectoryName(outputFilePath);
                        if (!Directory.Exists(outputDir))
                        {
                            Directory.CreateDirectory(outputDir);
                        }
    
                        File.Copy(inputFilePath, outputFilePath, true);
                        Console.WriteLine($"Copied input file: {inputFilePath} to output file: {outputFilePath}");
                        File.Delete(inputFilePath);
                        Console.WriteLine($"Deleted input file: {inputFilePath}");
                    } 
                    else
                    {
                        Console.WriteLine($"Skipping this event as input file doesn't exist: {inputFilePath}");   
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught exception: {0}", ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
    
            Console.WriteLine($"Processed event.");
            return MessageResponse.Completed;
        }
    
  7. احفظ هذا الملف.

  8. يمكنك أيضا تنزيل نموذج تعليمات برمجية موجود لهذا المشروع. يمكنك بعد ذلك التحقق من صحة الملف الذي قمت بحفظه مقابل البرنامج .cs الملف في هذا النموذج.

إنشاء حل IoT Edge الخاص بك

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

  1. في VSCode ، انتقل إلى محطة طرفية > جديدة لفتح محطة طرفية جديدة متكاملة لرمز Visual Studio.

  2. سجل الدخول إلى Docker عن طريق إدخال الأمر التالي في المحطة الطرفية المتكاملة.

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

    استخدم خادم تسجيل الدخول واسم المستخدم اللذين قمت بنسخهما من سجل الحاوية.

    Build and push IoT Edge solution

  3. عند مطالبتك بكلمة المرور، قم بتوفير كلمة المرور. يمكنك أيضا استرداد قيم خادم تسجيل الدخول واسم المستخدم وكلمة المرور من مفاتيح الوصول في سجل الحاوية في مدخل Azure.

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

    Build and push IoT Edge solution 2

    عندما تخبر Visual Studio Code بإنشاء الحل الخاص بك ، فإنه يقوم بتشغيل أمرين في المحطة الطرفية المتكاملة: إنشاء docker ودفع docker. يقوم هذان الأمران بإنشاء التعليمات البرمجية الخاصة بك ، وحاوية CSharpModule.dll ، ثم دفع التعليمة البرمجية إلى سجل الحاوية الذي قمت بتحديده عند تهيئة الحل.

    سيطلب منك اختيار منصة الوحدة. حدد amd64 المقابلة لنظام التشغيل Linux.

    Select platform

    هام

    يتم دعم وحدات Linux فقط.

    قد ترى التحذير التالي الذي يمكنك تجاهله:

    البرنامج.cs(77,44): تحذير CS1998: تفتقر هذه الطريقة غير المتزامنة إلى عوامل التشغيل "الانتظارية" وسيتم تشغيلها بشكل متزامن. فكر في استخدام عامل التشغيل "انتظار" لانتظار مكالمات واجهة برمجة التطبيقات غير المحظورة، أو "انتظر Task.Run(...)" للقيام بعمل مرتبط بوحدة المعالجة المركزية على مؤشر ترابط خلفية.

  5. يمكنك رؤية عنوان صورة الحاوية الكامل مع العلامة في محطة VS Code المتكاملة. تم إنشاء عنوان الصورة من المعلومات الموجودة في ملف module.json بالتنسيق <repository>:<version>-<platform>. بالنسبة لهذه المقالة ، يجب أن تبدو مثل mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

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

لنشر هذه الوحدة النمطية وتشغيلها على Azure Stack Edge Pro، راجع الخطوات الواردة في إضافة وحدة نمطية.