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

ينطبق على:yes icon IoT الحافة 1.1

توضح هذه المقالة كيفية استخدام Visual Studio لتطوير التعليمات البرمجية بـ C ونشرها على جهاز Windows الذي يقوم بتشغيل Azure IoT Edge.

ملاحظة

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

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

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

  • استخدم Visual Studio لإنشاء وحدة IoT Edge تستند إلى SDK C.
  • استخدم Visual Studio وDocker لإنشاء صورة Docker ونشرها في السجل الخاص بك.
  • نشر الوحدة إلى جهاز IoT Edge الخاص بك.
  • عرض البيانات التي تم إنشاؤها.

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

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

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

يوضح هذا البرنامج التعليمي كيفية تطوير وحدة في C باستخدام Visual Studio 2019 ثم نشرها على جهاز Windows. إذا كنت تقوم بتطوير وحدات باستخدام حاويات Linux، فانتقل إلى تطوير وحدات C IoT Edge باستخدام حاويات Linux بدلاً من ذلك.

لفهم الخيارات الخاصة بك لتطوير ونشر وحدات C باستخدام حاويات Windows، راجع الجدول التالي:

C تعليمة Visual Studio برمجية Visual Studio 2017 و 2019
Windows AMD64 Develop C modules for WinAMD64 in Visual Studio

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

قم بتثبيت Azure IoT C SDK لنظام التشغيل Windows x64 من خلال vCPKG عن طريق تشغيل الأوامر التالية:

git clone https://github.com/Microsoft/vcpkg
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install azure-iot-sdk-c:x64-windows
.\vcpkg --triplet x64-windows integrate install

تلميح

إذا كنت تستخدم Visual Studio 2017 (إصدار 15.7 أو أحدث)، فقم بتنزيل وتثبيت Azure IoT Edge Tools لـ Visual Studio 2017 من Visual Studio Marketplace.

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

في هذا القسم، يمكنك إنشاء مشروع وحدة IoT Edge يستند إلى SDK C باستخدام Visual Studio وملحقات Azure IoT Edge Tools. بعد إنشاء قالب مشروع، ستقوم بإضافة تعليمات برمجية جديدة بحيث تقوم الوحدة بتصفية الرسائل استنادًا إلى خصائصها التي تم الإبلاغ عنها.

إنشاء مشروع جديد

إنشاء قالب حل بـ C يمكنك تخصيصه باستخدام التعليمات البرمجية الخاصة بك.

  1. افتح Visual Studio 2019 وحدد Create New Project.

  2. في جزء Create a new project، ابحث عن IoT Edge ثم حدد في قائمة النتائج مشروع Azure IoT Edge (Windows amd64) .

    Screenshot of the IoT Edge

  3. حدد "Next".

    يفتح جزء Configure your new project.

    Screenshot of the

  4. في جزء Configure your new project، قم بإعادة تسمية المشروع والحل إلى شيء أكثر وصفًا، مثل CTutorialApp.

  5. حدد Create لإنشاء المشروع.

    يتم فتح جزء Add Module.

    Screenshot of the

  6. في صفحة تكوين مشروعك الجديد، قم بما يلي:

    أ. في الجزء الأيمن، حدد قالب C Module.
    ب. في مربع Module Name، أدخل CModule.
    ج. في المربع Url مستودع استبدال localhost:5000 مع قيمة ملقم تسجيل الدخول من تسجيل حاوية Azure الخاص بك بالتنسيق التالي:

    ملاحظة

    يتضمن مستودع الصور اسم سجل الحاوية واسم صورة الحاوية. تمت تعبئة صورة الحاوية مسبقًا من قيمة project-name للوحدة. يمكنك استرداد خادم تسجيل الدخول من صفحة نظرة عامة على سجل الحاوية في مدخل Azure.

  7. حدد Add لإنشاء المشروع.

أضف بيانات اعتماد التسجيل الخاصة بك

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

  1. في Visual Studio Solution Explorer، افتح ملفdeployment.template.json.

  2. ابحث عن خاصية registryCredentials في خصائص $edgeAgent المطلوبة. يجب ملء عنوان السجل الخاص بالخاصية تلقائيًا بالمعلومات التي قمت بتوفيرها عند إنشاء المشروع. يجب أن يحتوي حقلا اسم المستخدم وكلمة المرور على أسماء متغيرات. على سبيل المثال:

    "registryCredentials": {
      "<registry name>": {
        "username": "$CONTAINER_REGISTRY_USERNAME_<registry name>",
        "password": "$CONTAINER_REGISTRY_PASSWORD_<registry name>",
        "address": "<registry name>.azurecr.io"
      }
    }
    
  3. افتح ملف البيئة (ENV) في حل الوحدة الخاصة بك. بشكل افتراضي، يتم إخفاء الملف في Solution Explorer، لذلك قد تحتاج إلى تحديد الزر Show All Files لعرضه. يجب أن يحتوي ملف ENV على نفس متغيرات اسم المستخدم وكلمة المرور التي رأيتها في ملف deployment.template.json.

  4. أضف قيمUsername وPassword من سجل حاوية Azure الخاص بك.

  5. احفظ تغييراتك التي قمت بها في ملف ENV.

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

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

  1. البيانات من جهاز الاستشعار في هذا السيناريو يأتي في تنسيق JSON. لتصفية الرسائل بتنسيق JSON، قم باستيراد مكتبة JSON لـ C. يستخدم هذا البرنامج التعليمي Parson.

    أ. قم بتنزيل مستودع Parson GitHub.
    ب. نسخ ملفات parson.cوparson.h إلى مشروع CModule.
    ج. في Visual Studio، افتح الملف CMakeLists.txt من مجلد مشروع CModule.
    د. في الجزء العلوي من الملف، قم باستيراد ملفات Parson كمكتبة تسمى my_parson.

    add_library(my_parson
        parson.c
        parson.h
    )
    

    هـ. إضافة my_parson إلى قائمة المكتبات في قسم "target_link_libraries" من ملف my_parson
    و. قم بحفظ الملف CMakeLists.txt.
    ز. حدد CModuleالرئيسي.c. في أسفل قائمة عبارات التضمين، أضف جملة جديدة لتضمين parson.h لدعم JSON:

    #include "parson.h"
    
  2. في الملف الرئيسي.c، إضافة متغير عمومي يسمى بجانب messagesReceivedByInput1Queue المتغير. يعين هذا المتغير القيمة التي يجب أن تتجاوزها درجة الحرارة المقاسة للبيانات التي سيتم إرسالها إلى مركز IoT.

    static double temperatureThreshold = 25;
    
  3. ابحث عن CreateMessageInstance الوظيفة بشكل CreateMessageInstance. استبدال عبارة if-else الداخلية بالتعليمات البرمجية التالية، التي تضيف بضعة أسطر من الوظائف:

    if ((messageInstance->messageHandle = IoTHubMessage_Clone(message)) == NULL)
    {
        free(messageInstance);
        messageInstance = NULL;
    }
    else
    {
        messageInstance->messageTrackingId = messagesReceivedByInput1Queue;
        MAP_HANDLE propMap = IoTHubMessage_Properties(messageInstance->messageHandle);
        if (Map_AddOrUpdate(propMap, "MessageType", "Alert") != MAP_OK)
        {
           printf("ERROR: Map_AddOrUpdate Failed!\r\n");
        }
    }
    

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

  4. ابحث عن InputQueue1Callback الدالة، واستبدل الدالة بأكملها بالتعليمات البرمجية التالية. تقوم هذه الدالة بتنفيذ عامل تصفية المراسلة الفعلي. عند تلقي رسالة، فإنه يتحقق ما إذا كانت درجة الحرارة المبلغ عنها تتجاوز العتبة. إذا تجاوزت درجة الحرارة العتبة، تقوم الدالة بإعادة توجيه الرسالة من خلال قائمة انتظار الإخراج الخاصة بها. إذا لم يتجاوز العتبة، تتجاهل الدالة الرسالة.

    static unsigned char *bytearray_to_str(const unsigned char *buffer, size_t len)
    {
        unsigned char *ret = (unsigned char *)malloc(len + 1);
        memcpy(ret, buffer, len);
        ret[len] = '\0';
        return ret;
    }
    
    static IOTHUBMESSAGE_DISPOSITION_RESULT InputQueue1Callback(IOTHUB_MESSAGE_HANDLE message, void* userContextCallback)
    {
        IOTHUBMESSAGE_DISPOSITION_RESULT result;
        IOTHUB_CLIENT_RESULT clientResult;
        IOTHUB_MODULE_CLIENT_LL_HANDLE iotHubModuleClientHandle = (IOTHUB_MODULE_CLIENT_LL_HANDLE)userContextCallback;
    
        unsigned const char* messageBody;
        size_t contentSize;
    
        if (IoTHubMessage_GetByteArray(message, &messageBody, &contentSize) == IOTHUB_MESSAGE_OK)
        {
            messageBody = bytearray_to_str(messageBody, contentSize);
        } else
        {
            messageBody = "<null>";
        }
    
        printf("Received Message [%zu]\r\n Data: [%s]\r\n",
                messagesReceivedByInput1Queue, messageBody);
    
        // Check whether the message reports temperatures that exceed the threshold
        JSON_Value *root_value = json_parse_string(messageBody);
        JSON_Object *root_object = json_value_get_object(root_value);
        double temperature;
    
        // If temperature exceeds the threshold, send to output1
        if (json_object_dotget_value(root_object, "machine.temperature") != NULL && (temperature = json_object_dotget_number(root_object, "machine.temperature")) > temperatureThreshold)
        {
            printf("Machine temperature %f exceeds threshold %f\r\n", temperature, temperatureThreshold);
            // This message should be sent to next stop in the pipeline, namely "output1".  What happens at "outpu1" is determined
            // by the configuration of the Edge routing table setup.
            MESSAGE_INSTANCE *messageInstance = CreateMessageInstance(message);
            if (NULL == messageInstance)
            {
                result = IOTHUBMESSAGE_ABANDONED;
            }
            else
            {
                printf("Sending message (%zu) to the next stage in pipeline\n", messagesReceivedByInput1Queue);
    
                clientResult = IoTHubModuleClient_LL_SendEventToOutputAsync(iotHubModuleClientHandle, messageInstance->messageHandle, "output1", SendConfirmationCallback, (void *)messageInstance);
                if (clientResult != IOTHUB_CLIENT_OK)
                {
                    IoTHubMessage_Destroy(messageInstance->messageHandle);
                    free(messageInstance);
                    printf("IoTHubModuleClient_LL_SendEventToOutputAsync failed on sending msg#=%zu, err=%d\n", messagesReceivedByInput1Queue, clientResult);
                    result = IOTHUBMESSAGE_ABANDONED;
                }
                else
                {
                    result = IOTHUBMESSAGE_ACCEPTED;
                }
            }
        }
        // If message does not exceed the threshold, do not forward
        else
        {
            printf("Not sending message (%zu) to the next stage in pipeline.\r\n", messagesReceivedByInput1Queue);
            result = IOTHUBMESSAGE_ACCEPTED;
        }
    
        messagesReceivedByInput1Queue++;
        return result;
    }
    
  5. إضافة moduleTwinCallbackوظيفة. تتلقى هذه الطريقة تحديثات على الخصائص المطلوبة من الوحدة المزدوجة، وتقوم بتحديث متغير temperatureThreshold لمطابقته. تحتوي جميع الوحدات على توأم الوحدة الخاص بها، والذي يتيح لك تكوين التعليمات البرمجية التي تعمل داخل الوحدة مباشرة من السحابة.

    static void moduleTwinCallback(DEVICE_TWIN_UPDATE_STATE update_state, const unsigned char* payLoad, size_t size, void* userContextCallback)
    {
        printf("\r\nTwin callback called with (state=%s, size=%zu):\r\n%s\r\n",
            MU_ENUM_TO_STRING(DEVICE_TWIN_UPDATE_STATE, update_state), size, payLoad);
        JSON_Value *root_value = json_parse_string(payLoad);
        JSON_Object *root_object = json_value_get_object(root_value);
        if (json_object_dotget_value(root_object, "desired.TemperatureThreshold") != NULL) {
            temperatureThreshold = json_object_dotget_number(root_object, "desired.TemperatureThreshold");
        }
        if (json_object_get_value(root_object, "TemperatureThreshold") != NULL) {
            temperatureThreshold = json_object_get_number(root_object, "TemperatureThreshold");
        }
    }
    
  6. ابحث عن SetupCallbacksForModule الدالة. استبدل الوظيفة بالتعليمة البرمجية التالية التي تضيف عبارة else if للتحقق مما إذا كان قد تم تحديث الوحدة المزدوجة.

    static int SetupCallbacksForModule(IOTHUB_MODULE_CLIENT_LL_HANDLE iotHubModuleClientHandle)
    {
        int ret;
    
        if (IoTHubModuleClient_LL_SetInputMessageCallback(iotHubModuleClientHandle, "input1", InputQueue1Callback, (void*)iotHubModuleClientHandle) != IOTHUB_CLIENT_OK)
        {
            printf("ERROR: IoTHubModuleClient_LL_SetInputMessageCallback(\"input1\")..........FAILED!\r\n");
            ret = MU_FAILURE;
        }
        else if (IoTHubModuleClient_LL_SetModuleTwinCallback(iotHubModuleClientHandle, moduleTwinCallback, (void*)iotHubModuleClientHandle) != IOTHUB_CLIENT_OK)
        {
            printf("ERROR: IoTHubModuleClient_LL_SetModuleTwinCallback(default)..........FAILED!\r\n");
            ret = MU_FAILURE;
        }
        else
        {
            ret = 0;
        }
    
        return ret;
    }
    
  7. حفظ الملف main.c.

  8. افتح الملف deployment.template.json.

  9. إضافة الوحدة المزدوجة CModule إلى بيان النشر. قم بإدراج محتوى JSON التالي في الجزء السفلي من moduleContent القسم، بعد $edgeHubالوحدة المزدوجة:

    "CModule": {
        "properties.desired":{
            "TemperatureThreshold":25
        }
    }
    

    Screenshot showing the module twin being added to the deployment template.

  10. احفظ ملف deployment.template.js.

بناء ودفع الوحدة الخاصة بك

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

تسجيل الدخول إلى Docker

توفير بيانات اعتماد تسجيل الحاوية إلى Docker على آلة التطوير الخاص بك بحيث يمكن دفع صورة الحاوية ليتم تخزينها في التسجيل.

  1. افتح PowerShell أو نافذة موجه الأوامر.

  2. تسجيل الدخول إلى Docker باستخدام بيانات اعتماد تسجيل حاوية Azure التي قمت بحفظها بعد إنشاء التسجيل.

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

    قد تتلقى تحذيرًا أمنيًا يوصي باستخدام --password-stdin. على الرغم من أننا نوصي بهذا كأفضل ممارسة لسيناريوهات الإنتاج، فإنه خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker .

قم ببناء ودفع

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

  1. في Visual Studio Solution Explorer، انقر بزر الماوس الأيمن فوق اسم المشروع الذي تريد بناءه. الاسم الافتراضي هو AzureIotEdgeApp1. لهذا البرنامج التعليمي، اخترنا اسم CTutorialApp، ولأنك تقوم ببناء وحدة Windows، ينبغي أن يكون الامتداد Windows. Amd64.

  2. حدد Build and Push IoT Edge Modules.

    يبدأ الأمران إنشاء ودفع ثلاث عمليات:

    • أولاً، فإنه ينشئ مجلدًا جديدًا في الحل المسمى config، الذي يحمل بيان النشر الكامل. تم بناؤه من المعلومات في قالب النشر وملفات الحلول الأخرى.
    • ثانيًا، يتم تشغيله docker build لبناء صورة الحاوية بناءً على ملف Dockerfile المناسب للبنية المستهدفة.
    • بعد ذلك، يتم تشغيله docker push لدفع مستودع الصورة إلى سجل الحاوية الخاص بك.

    قد تستغرق هذه العملية عدة دقائق في المرة الأولى، ولكنها سوف تسير بشكل أسرع في المرة التالية التي تقوم فيها بتشغيل الأوامر.

نشر وحدات على الجهاز

استخدم Visual Studio Cloud Explorer وملحق Azure IoT Edge Tools لنشر مشروع الوحدة على جهاز IoT Edge. لقد قمت مسبقًا بإعداد بيان نشر للسيناريو الخاص بك، ملفdeployment.windows-amd64.json في مجلد config. كل ما عليك القيام به الآن هو تحديد جهاز لتلقي النشر.

تأكد من أن جهاز IoT Edge الخاص بك يعمل.

  1. في Visual Studio Cloud Explorer، قم بتوسيع الموارد لعرض قائمة أجهزة IoT.

  2. انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge الذي تريده لاستلام النشر.

  3. حدد Create Deployment.

  4. في Visual Studio File Explorer، حدد ملفdeployment.windows-amd64.json في مجلد config الخاص بحلك.

  5. قم بتحديث Cloud Explorer لعرض الوحدات المنشورة المسرودة تحت جهازك.

عرض البيانات التي تم إنشاؤها

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

يمكنك استخدام ملحق IoT Edge Tools لعرض الرسائل عند وصولها إلى مركز IoT الخاص بك.

  1. في Visual Studio Cloud Explorer، حدد اسم جهاز IoT Edge.

  2. في قائمة Actions حدد Start Monitoring Built-in Event Endpoint.

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

    Screenshot of the Output window displaying messages that are arriving at the IoT hub.

تحرير الوحدة المزدوجة

استخدمت وحدة CModule المزدوجة لتعيين عتبة درجة الحرارة إلي 25 درجة. يمكنك استخدام الوحدة المزدوجة لتغيير الوظيفة دون الحاجة إلى تحديث التعليمات البرمجية للوحدة.

  1. في Visual Studio، افتح الملفdeployment.windows-amd64.json.

    لا تفتح ملف deployment.template. إذا لم تشاهد بيان النشر في ملف config في Solution Explorer، حدد أيقونة Show all files في Solution Explorer toolbar.

  2. ابحث عن CSharpModule المزدوج، وقم بتغيير قيمة معلمة temperatureThreshold إلى درجة حرارة جديدة أعلى من 5 إلى 10 درجات من آخر درجة الحرارة تم الإبلاغ عنها.

  3. قم بحفظ الملف deployment.windows-amd64.json.

  4. اتبع إرشادات النشر مرة أخرى لتطبيق بيان النشر المحدث على جهازك.

  5. وراقب الرسائل الواردة من الجهاز إلى السحابة. يجب أن تتوقف الرسائل حتى يتم الوصول إلى عتبة درجة الحرارة الجديدة.

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

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

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

حذف موارد Azure

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

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

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

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

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

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

في هذا البرنامج التعليمي، قمت بإنشاء وحدة IoT Edge مع التعليمات البرمجية لتصفية البيانات الأولية التي تم إنشاؤها بواسطة جهاز IoT Edge.

لمعرفة كيف يمكن لـ Azure IoT Edge مساعدتك في نشر خدمات Azure السحابية لمعالجة البيانات وتحليلها على الحافة، تابع الدروس التعليمية التالية.