توسيع Azure IoT Central باستخدام قواعد مخصصة باستخدام Stream Analytics ووظائف Azure وSendGrid

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

يوضح لك هذا الدليل الإرشادي كيفية توسيع IoT Central إلى ما هو أبعد مما يمكنه فعله بالفعل باستخدام القواعد والإجراءات المضمنة.

في هذا الدليل الإرشادي، ستتعرف على كيفية:

  • دفق القياس عن بعد من تطبيق IoT Central باستخدام تصدير البيانات المستمر.
  • أنشئ طلب بحث Stream Analytics يكتشف متى توقف الجهاز عن إرسال البيانات.
  • أرسل إعلاما بالبريد الإلكتروني باستخدام وظائف Azure وخدمات SendGrid.

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

لإكمال الخطوات الواردة في هذا الدليل الإرشادي، تحتاج إلى اشتراك Azure نشط.

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

تطبيق IoT Central

قم بإنشاء تطبيق IoT Central على موقع مدير تطبيقات Azure IoT Central على الويب باستخدام الإعدادات التالية:

الإعداد القيمة
خطة الأسعار Standard
قالب التطبيق التحليلات داخل المتجر - مراقبة الحالة
اسم التطبيق قبول الإعداد الافتراضي أو اختيار اسمك الخاص
عنوان URL قبول الإعداد الافتراضي أو اختيار بادئة عنوان URL الفريدة الخاصة بك
الدليل مستأجر Azure Active Directory الخاص بك
اشتراك Azure اشتراكك في Azure
المنطقة أقرب منطقة إليك

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

يتضمن قالب التطبيق هذا جهازي ترموستات محاكيين يرسلان القياس عن بعد.

مجموعة الموارد

استخدم مدخل Azure لإنشاء مجموعة موارد تسمى DetectStoppedDevices لاحتواء الموارد الأخرى التي تقوم بإنشائها. قم بإنشاء موارد Azure الخاصة بك في نفس موقع تطبيق IoT Central الخاص بك.

مساحة اسم "مراكز الأحداث"

استخدم مدخل Azure لإنشاء مساحة اسم مراكز الأحداث باستخدام الإعدادات التالية:

الإعداد القيمة
الاسم اختر اسم مساحة الاسم الخاصة بك
مستوى الأسعار أساسي
الاشتراك اشتراكك
مجموعة الموارد DetectStoppedDevices
‏‏الموقع شرق الولايات المتحدة
وحدات معدل النقل 1

وظيفة تحليلات البث

استخدم مدخل Azure لإنشاء مهمة Stream Analytics باستخدام الإعدادات التالية:

الإعداد القيمة
الاسم اختر اسم وظيفتك
الاشتراك اشتراكك
مجموعة الموارد DetectStoppedDevices
‏‏الموقع شرق الولايات المتحدة
بيئة الاستضافة السحابة
وحدات البث 3

تطبيق الوظيفة

استخدم مدخل Azure لإنشاء تطبيق وظيفي بالإعدادات التالية:

الإعداد القيمة
اسم التطبيق اختيار اسم تطبيق الوظيفة
الاشتراك اشتراكك
مجموعة الموارد DetectStoppedDevices
نظام التشغيل Windows
خطة الاستضافة خطة الاستهلاك
‏‏الموقع شرق الولايات المتحدة
مكدس وقت التشغيل .NET
التخزين إنشاء جديد

حساب SendGrid ومفاتيح واجهة برمجة التطبيقات

إذا لم يكن لديك حساب Sendgrid ، فقم بإنشاء حساب مجاني قبل البدء.

  1. من لوحة معلومات Sendgrid الإعدادات في القائمة اليمنى، حدد مفاتيح واجهة برمجة التطبيقات.

  2. انقر على إنشاء مفتاح واجهة برمجة التطبيقات.

  3. قم بتسمية مفتاح واجهة برمجة التطبيقات الجديد AzureFunctionAccess.

  4. انقر على إنشاء & طريقة عرض.

    Screenshot of the Create SendGrid API key.

بعد ذلك ، سيتم إعطاؤك مفتاح API. احفظ هذه السلسلة لاستخدامها لاحقا.

إنشاء مراكز أحداث

يمكنك تكوين تطبيق IoT Central لتصدير القياس عن بعد باستمرار إلى مركز أحداث. في هذا القسم، يمكنك إنشاء مركز أحداث لتلقي القياس عن بعد من تطبيق IoT Central الخاص بك. يوفر مركز الأحداث القياس عن بعد لمهمة Stream Analytics الخاصة بك للمعالجة.

  1. في مدخل Azure، انتقل إلى مساحة اسم مراكز الأحداث وحدد + مركز الأحداث.
  2. قم بتسمية مركز الأحداث centralexport، وحدد إنشاء.

تبدو مساحة اسم مراكز الأحداث مثل لقطة الشاشة التالية:


## Define the function

This solution uses an Azure Functions app to send an email notification when the Stream Analytics job detects a stopped device. To create your function app:

1. In the Azure portal, navigate to the **App Service** instance in the **DetectStoppedDevices** resource group.
1. Select **+** to create a new function.
1. Select **HTTP Trigger**.
1. Select **Add**.

    :::image type="content" source="media/howto-create-custom-rules/add-function.png" alt-text="Image of the Default HTTP trigger function"::: 

## Edit code for HTTP Trigger

The portal creates a default function called **HttpTrigger1**:

```:::image type="content" source="media/howto-create-custom-rules/default-function.png" alt-text="Screenshot of Edit HTTP trigger function.":::

1. Replace the C# code with the following code:

    ```csharp
    #r "Newtonsoft.Json"
    #r "SendGrid"
    using System;
    using SendGrid.Helpers.Mail;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;

    public static SendGridMessage Run(HttpRequest req, ILogger log)
    {
        string requestBody = new StreamReader(req.Body).ReadToEnd();
        log.LogInformation(requestBody);
        var notifications = JsonConvert.DeserializeObject<IList<Notification>>(requestBody);

        SendGridMessage message = new SendGridMessage();
        message.Subject = "Contoso device notification";

        var content = "The following device(s) have stopped sending telemetry:<br/><br/><table><tr><th>Device ID</th><th>Time</th></tr>";
        foreach(var notification in notifications) {
            log.LogInformation($"No message received - Device: {notification.deviceid}, Time: {notification.time}");
            content += $"<tr><td>{notification.deviceid}</td><td>{notification.time}</td></tr>";
        }
        content += "</table>";
        message.AddContent("text/html", content);  

        return message;
    }

    public class Notification
    {
        public string deviceid { get; set; }
        public string time { get; set; }
    }
    ```

    You may see an error message until you save the new code.
1. Select **Save** to save the function.

## Add SendGrid Key

To add your SendGrid API Key, you need to add it to your **Function Keys** as follows:

1. Select **Function Keys**.
1. Choose **+ New Function Key**.
1. Enter the *Name* and *Value* of the API Key you created before.
1. Click **OK.**

    :::image type="content" source="media/howto-create-custom-rules/add-key.png" alt-text="Screenshot of Add Sangrid Key.":::


## Configure HttpTrigger function to use SendGrid

To send emails with SendGrid, you need to configure the bindings for your function as follows:

1. Select **Integrate**.
1. Choose **Add Output** under **HTTP ($return)**.
1. Select **Delete.**
1. Choose **+ New Output**.
1. For Binding Type, then choose **SendGrid**.
1. For SendGrid API Key Setting Type, click New.
1. Enter the *Name* and *Value* of your SendGrid API key.
1. Add the following information:

| Setting | Value |
| ------- | ----- |
| Message parameter name | Choose your name |
| To address | Choose the name of your To Address |
| From address | Choose the name of your From Address |
| Message subject | Enter your subject header |
| Message text | Enter the message from your integration |

1. Select **OK**.

    :::image type="content" source="media/howto-create-custom-rules/add-output.png" alt-text="Screenshot of Add SandGrid Output.":::


### Test the function works

To test the function in the portal, first choose **Logs** at the bottom of the code editor. Then choose **Test** to the right of the code editor. Use the following JSON as the **Request body**:

```json
[{"deviceid":"test-device-1","time":"2019-05-02T14:23:39.527Z"},{"deviceid":"test-device-2","time":"2019-05-02T14:23:50.717Z"},{"deviceid":"test-device-3","time":"2019-05-02T14:24:28.919Z"}]

تظهر رسائل سجل الوظائف في لوحة السجلات :


After a few minutes, the **To** email address receives an email with the following content:

```txt
The following device(s) have stopped sending telemetry:

Device ID    Time
test-device-1    2019-05-02T14:23:39.527Z
test-device-2    2019-05-02T14:23:50.717Z
test-device-3    2019-05-02T14:24:28.919Z

إضافة استعلام "إحصاءات البث"

يستخدم هذا الحل استعلام Stream Analytics للكشف عن الوقت الذي يتوقف فيه الجهاز عن إرسال القياس عن بعد لأكثر من 120 ثانية. يستخدم الاستعلام القياس عن بعد من مركز الحدث كمدخلات له. ترسل المهمة نتائج الاستعلام إلى تطبيق الوظيفة. في هذا القسم، يمكنك تكوين مهمة Stream Analytics:

  1. في مدخل Azure، انتقل إلى مهمة Stream Analytics، ضمن طوبولوجيا الوظائف ، حدد المدخلات، واختر + إضافة إدخال البث، ثم اختر مركز الأحداث.

  2. استخدم المعلومات الواردة في الجدول التالي لتكوين الإدخال باستخدام مركز الأحداث الذي أنشأته مسبقا، ثم اختر حفظ:

    الإعداد القيمة
    اسم الإدخال المستعار القياس المركزي عن بعد
    الاشتراك اشتراكك
    مساحة اسم Event Hub مساحة اسم مركز الأحداث
    اسم Event Hub استخدام القائمة - سنترال إكسبورت
  3. ضمن طبولوجياالوظائف، حدد المخرجات، واختر + إضافة، ثم اختر دالة Azure.

  4. استخدم المعلومات الواردة في الجدول التالي لتكوين الإخراج، ثم اختر حفظ:

    الإعداد القيمة
    اسم مستعار للإخراج إشعار البريد الإلكتروني
    الاشتراك اشتراكك
    تطبيق الوظيفة تطبيق الوظائف الخاص بك
    الوظيفة HttpTrigger1
  5. ضمن طبولوجيا الوظائف، حدد استعلام واستبدل الاستعلام الموجود SQL التالية:

    with
    LeftSide as
    (
        SELECT
        -- Get the device ID from the message metadata and create a column
        GetMetadataPropertyValue([centraltelemetry], '[EventHub].[IoTConnectionDeviceId]') as deviceid1, 
        EventEnqueuedUtcTime AS time1
        FROM
        -- Use the event enqueued time for time-based operations
        [centraltelemetry] TIMESTAMP BY EventEnqueuedUtcTime
    ),
    RightSide as
    (
        SELECT
        -- Get the device ID from the message metadata and create a column
        GetMetadataPropertyValue([centraltelemetry], '[EventHub].[IoTConnectionDeviceId]') as deviceid2, 
        EventEnqueuedUtcTime AS time2
        FROM
        -- Use the event enqueued time for time-based operations
        [centraltelemetry] TIMESTAMP BY EventEnqueuedUtcTime
    )
    
    SELECT
        LeftSide.deviceid1 as deviceid,
        LeftSide.time1 as time
    INTO
        [emailnotification]
    FROM
        LeftSide
        LEFT OUTER JOIN
        RightSide 
        ON
        LeftSide.deviceid1=RightSide.deviceid2 AND DATEDIFF(second,LeftSide,RightSide) BETWEEN 1 AND 120
        where
        -- Find records where a device didn't send a message 120 seconds
        RightSide.deviceid2 is NULL
    
  6. حدد ⁧حفظ⁧.

  7. لبدء مهمة Stream Analytics، اختر نظرة عامة، ثم ابدأ، ثم الآن، ثم ابدأ:

    Screenshot of Stream Analytics.

تكوين التصدير في IoT Central

على موقع ويب مدير تطبيقات Azure IoT Central، انتقل إلى تطبيق IoT Central الذي أنشأته.

في هذا القسم، يمكنك تكوين التطبيق لدفق القياس عن بعد من أجهزته المحاكية إلى مركز الأحداث. لتكوين التصدير:

  1. انتقل إلى صفحة تصدير البيانات، وحدد+ جديد، ثم مراكز أحداث Azure.

  2. استخدم الإعدادات التالية لتكوين التصدير، ثم حدد حفظ:

    الإعداد القيمة
    اسم العرض التصدير إلى مراكز الأحداث
    تم التمكين تشغيل
    نوع البيانات التي سيتم تصديرها بيانات تتبع الاستخدام
    الإثراء أدخل المفتاح المطلوب / قيمة الطريقة التي تريد بها تنظيم البيانات المصدرة
    الوجهة إنشاء جديد وإدخال معلومات عن المكان الذي سيتم تصدير البيانات إليه

    Screenshot of the Data Export.

انتظر حتى يتم تشغيل حالة التصدير قبل المتابعة .

الاختبار

لاختبار الحل، يمكنك تعطيل تصدير البيانات المستمر من IoT Central إلى الأجهزة المتوقفة للمحاكاة:

  1. في تطبيق IoT Central، انتقل إلى صفحة تصدير البيانات وحدد تكوين تصديرالتصدير إلى مراكز الأحداث .

  2. اضبط ممكن على إيقاف التشغيل واختر حفظ.

  3. بعد دقيقتين على الأقل، يتلقى عنوان البريد الإلكتروني إلى رسالة بريد إلكتروني واحدة أو أكثر تشبه محتوى المثال التالي:

    The following device(s) have stopped sending telemetry:
    
    Device ID         Time
    Thermostat-Zone1  2019-11-01T12:45:14.686Z
    

ترتيب

للترتيب بعد هذه الإرشادات وتجنب التكاليف غير الضرورية، احذف مجموعة موارد DetectStoppedDevices في مدخل Azure.

يمكنك حذف تطبيق IoT Central من صفحة الإدارة داخل التطبيق.

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

في هذا الدليل الإرشادي، تعلمت كيفية:

  • دفق القياس عن بعد من تطبيق IoT Central باستخدام تصدير البيانات المستمر.
  • أنشئ طلب بحث Stream Analytics يكتشف متى توقف الجهاز عن إرسال البيانات.
  • أرسل إعلاما بالبريد الإلكتروني باستخدام وظائف Azure وخدمات SendGrid.

الآن بعد أن تعرفت على كيفية إنشاء قواعد وإعلامات مخصصة، فإن الخطوة التالية المقترحة هي معرفة كيفية توسيع Azure IoT Central باستخدام التحليلات المخصصة.