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

ينطبق على:نعم ل Pro GPU SKUAzure Stack Edge Pro - GPUنعم ل Pro 2 SKUAzure Stack Edge Pro 2نعم ل Pro R SKUAzure Stack Edge Pro Rنعم ل Mini R SKUAzure 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 وتشغيلها. وحدات الحافة هي في الأساس حاويات Docker التي تقوم بتنفيذ مهمة معينة، مثل استيعاب رسالة من جهاز أو تحويل رسالة أو إرسال رسالة إلى IoT Hub. في هذه المقالة، ستقوم بإنشاء وحدة نمطية تنسخ الملفات من مشاركة محلية إلى مشاركة سحابية على جهاز Azure Stack Edge Pro.

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

كيفية عمل وحدة Azure IoT Edge على Azure Stack Edge Pro

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

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

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

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

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

  1. من مستعرض، قم بتسجيل الدخول إلى مدخل Microsoft Azure.

  2. حدد Create a resource > Containers > Container Registry. انقر فوق Create.

  3. توفير:

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

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

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

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

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

    6. تعيين SKU إلى Basic.

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

  4. حدد إنشاء.

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

    الحصول على مفاتيح الوصول

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

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

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

إنشاء حل جديد

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

  1. في Visual Studio Code، حدد View > Command Palette لفتح لوحة أوامر VS Code.

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

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

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

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

      إنشاء حل جديد 1

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

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

      إنشاء حل جديد 2

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

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

      إنشاء حل جديد 3

  4. انتقل إلى File > Open Folder.

    إنشاء حل جديد 4

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

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

    إنشاء حل جديد 5

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

  1. في مستكشف VS Code، افتح الوحدات النمطية > FileCopyModule > Program.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. يمكنك أيضا تنزيل نموذج تعليمة برمجية موجود لهذا المشروع. يمكنك بعد ذلك التحقق من صحة الملف الذي قمت بحفظه مقابل ملف program.cs في هذه العينة.

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

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

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

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

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

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

     إنشاء حل IoT Edge ودفعه

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

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

    إنشاء ودفع حل IoT Edge 2

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

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

    تحديد النظام الأساسي

    هام

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

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

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

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

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

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