ترتيب أحداث اتصال الجهاز من Azure IoT Hub باستخدام Azure Cosmos DB

تساعدك Azure Event Grid على إنشاء تطبيقات تستند إلى الحدث ودمج أحداث IoT بسهولة في حلول عملك. ترشدك هذه المقالة خلال إعداد يمكن استخدامه لتعقب وتخزين أحدث حالة اتصال للجهاز في Cosmos DB. سنستخدم رقم التسلسل المتوفر في الأحداث المتصلة بالجهاز والأحداث غير المتصلة بالجهاز ونخزن أحدث حالة في Cosmos DB. سنستخدم إجراء مخزنا، وهو منطق تطبيق يتم تنفيذه مقابل مجموعة في Cosmos DB.

رقم التسلسل هو تمثيل سلسلة لرقم سداسي عشري. يمكنك استخدام سلسلة مقارنة لتحديد العدد الأكبر. إذا كنت تقوم بتحويل السلسلة إلى سداسي عشري، فسيكون الرقم رقم 256 بت. يزداد رقم التسلسل بشكل صارم، وسيكون للحدث الأخير عدد أعلى من الأحداث الأخرى. يعد هذا مفيدا إذا كان لديك اتصالات متكررة للجهاز وقطع اتصاله، وتريد التأكد من استخدام أحدث حدث فقط لتشغيل إجراء انتقال البيانات من الخادم، حيث لا تدعم Azure Event Grid ترتيب الأحداث.

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

  • حساب Azure نشط. في حال لم يكن لديك اشتراك Azure، أنشئ حسابًا مجّانيًّا.

  • حساب Azure Cosmos DB SQL API نشط. إذا لم تكن قد أنشأت حسابا بعد، فشاهد إنشاء حساب قاعدة بيانات لمعاينة.

  • مجموعة في قاعدة البيانات الخاصة بك. راجع إضافة مجموعة لمعاينة. عند إنشاء مجموعتك، استخدم /id لمفتاح القسم.

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

إنشاء إجراء مخزّن

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

  1. في Cosmos DB SQL API، حدد DataExplorerItemsNew>>Stored Procedure.

    Create stored procedure

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

    // SAMPLE STORED PROCEDURE
    function UpdateDevice(deviceId, moduleId, hubName, connectionState, connectionStateUpdatedTime, sequenceNumber) {
      var collection = getContext().getCollection();
      var response = {};
    
      var docLink = getDocumentLink(deviceId, moduleId);
    
      var isAccepted = collection.readDocument(docLink, function(err, doc) {
        if (err) {
          console.log('Cannot find device ' + docLink + ' - ');
          createDocument();
        } else {
          console.log('Document Found - ');
          replaceDocument(doc);
        }
      });
    
      function replaceDocument(document) {
        console.log(
          'Old Seq :' +
            document.sequenceNumber +
            ' New Seq: ' +
            sequenceNumber +
            ' - '
        );
        if (sequenceNumber > document.sequenceNumber) {
          document.connectionState = connectionState;
          document.connectionStateUpdatedTime = connectionStateUpdatedTime;
          document.sequenceNumber = sequenceNumber;
    
          console.log('replace doc - ');
    
          isAccepted = collection.replaceDocument(docLink, document, function(
            err,
            updated
          ) {
            if (err) {
              getContext()
                .getResponse()
                .setBody(err);
            } else {
              getContext()
                .getResponse()
                .setBody(updated);
            }
          });
        } else {
          getContext()
            .getResponse()
            .setBody('Old Event - current: ' + document.sequenceNumber + ' Incoming: ' + sequenceNumber);
        }
      }
      function createDocument() {
        document = {
          id: deviceId + '-' + moduleId,
          deviceId: deviceId,
          moduleId: moduleId,
          hubName: hubName,
          connectionState: connectionState,
          connectionStateUpdatedTime: connectionStateUpdatedTime,
          sequenceNumber: sequenceNumber
        };
        console.log('Add new device - ' + collection.getAltLink());
        isAccepted = collection.createDocument(
          collection.getAltLink(),
          document,
          function(err, doc) {
            if (err) {
              getContext()
                .getResponse()
                .setBody(err);
            } else {
              getContext()
                .getResponse()
                .setBody(doc);
            }
          }
        );
      }
    
      function getDocumentLink(deviceId, moduleId) {
        return collection.getAltLink() + '/docs/' + deviceId + '-' + moduleId;
      }
    }
    
  3. حفظ الإجراء المخزن:

    save stored procedure

إنشاء تطبيق منطق

أولا، أنشئ تطبيقا منطقيا وأضف مشغل شبكة الأحداث الذي يراقب مجموعة الموارد لجهازك الظاهري.

إنشاء مورد logic app

  1. في مدخل Microsoft Azure، حدد +Create a resource، وحدد Integration ثم Logic App.

    Create logic app

  2. امنح التطبيق المنطقي اسمًا فريدًا في اشتراكك، ثم حدد نفس الاشتراك ومجموعة الموارد والموقع الذي حدده مركز IoT.

    New logic app

  3. حدد Create لإنشاء تطبيق المنطق.

    لقد قمت الآن بإنشاء مورد Azure لتطبيق المنطق الخاص بك. بعد نشر Azure لتطبيق المنطق الخاص بك، يعرض لك Logic Apps Designer قوالب للأنماط الشائعة حتى تتمكن من البدء بشكل أسرع.

    ملاحظة

    للبحث عن تطبيق المنطق وفتحه مرة أخرى، حدد Resource groups وحدد مجموعة الموارد التي تستخدمها لهذه الكيفية. ثم حدد تطبيق المنطق الجديد. يؤدي هذا إلى فتح Logic App Designer.

  4. في Logic App Designer، قم بالتمرير إلى اليمين حتى ترى المشغلات الشائعة. ضمن Templates، اختر Blank Logic App بحيث يمكنك إنشاء تطبيق المنطق الخاص بك من البداية.

اختر مشغلاً

المشغل عبارة عن حدث محدد يبدأ تطبيقك المنطقي. لهذا البرنامج التعليمي، المشغل الذي يقوم بتعيين سير العمل يتلقى طلبًا عبر HTTP.

  1. في شريط البحث الموصلات والمشغلات، اكتب HTTP واضغط على Enter.

  2. حدد طلب - عند تلقي طلب HTTP كمشغل.

    Select HTTP request trigger

  3. حدد استخدام حمولة عينة لإنشاء مخطط.

    Use sample payload to generate a schema

  4. الصق نموذج التعليمات البرمجية JSON التالي في مربع النص، ثم حدد تم:

    [{
     "id": "fbfd8ee1-cf78-74c6-dbcf-e1c58638ccbd",
     "topic":
       "/SUBSCRIPTIONS/DEMO5CDD-8DAB-4CF4-9B2F-C22E8A755472/RESOURCEGROUPS/EGTESTRG/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/MYIOTHUB",
     "subject": "devices/Demo-Device-1",
     "eventType": "Microsoft.Devices.DeviceConnected",
     "eventTime": "2018-07-03T23:20:11.6921933+00:00",
     "data": {
       "deviceConnectionStateEventInfo": {
         "sequenceNumber":
           "000000000000000001D4132452F67CE200000002000000000000000000000001"
       },
       "hubName": "MYIOTHUB",
       "deviceId": "48e44e11-1437-4907-83b1-4a8d7e89859e",
       "moduleId": ""
     },
     "dataVersion": "1",
     "metadataVersion": "1"
    }]
    

    Paste sample JSON payload

  5. قد تتلقى إعلاما منبثقا يقول، تذكر تضمين عنوان نوع المحتوى الذي تم تعيينه إلى application/json في طلبك. يمكنك تجاهل هذا الاقتراح بأمان، والانتقال إلى القسم التالي.

إنشاء شرط

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

  1. حدد + New step ثم Built-in، ثم ابحث عن Condition وحدده. انقر في اختيار قيمة وسيظهر مربع يظهر المحتوى الديناميكي -- الحقول التي يمكن تحديدها. املأ الحقول كما هو موضح أدناه لتنفيذ هذا فقط للأحداث المتصلة بالجهاز والأحداث غير المتصلة بالجهاز:

    • اختر قيمة: eventType -- حدد هذا من الحقول في المحتوى الديناميكي الذي يظهر عند النقر فوق هذا الحقل.

    • التغيير "يساوي" لينتهي به.

    • اختر قيمة: nected.

      Fill Condition

  2. في مربع الحوار إذا كان صحيحا ، انقر فوق إضافة إجراء.

    Add action if true

  3. ابحث عن Cosmos DB وحدد Azure Cosmos DB - تنفيذ الإجراء المخزن

    Search for CosmosDB

  4. املأ cosmosdb-connection ل Connection Name وحدد الإدخال في الجدول، ثم حدد Create. ترى لوحة تنفيذ الإجراء المخزن . أدخل قيم الحقول:

    معرف قاعدة البيانات: ToDoList

    معرف المجموعة: العناصر

    معرف Sproc: LatestDeviceConnectionState

  5. حدد إضافة معلمة جديدة. في القائمة المنسدلة التي تظهر، حدد المربعات الموجودة بجانب مفتاح القسموالمعلمات للإجراء المخزن، ثم انقر فوق أي مكان آخر على الشاشة؛ يضيف حقلا لقيمة مفتاح القسم وحقل معلمات الإجراء المخزن.

    Screenshot shows an Execute stored procedure item with Add new parameter selected.

  6. الآن أدخل قيمة مفتاح القسم والمعلمات كما هو موضح أدناه. تأكد من وضع الأقواس وعلامات الاقتباس المزدوجة كما هو موضح. قد تحتاج إلى النقر فوق إضافة محتوى ديناميكي للحصول على القيم الصالحة التي يمكنك استخدامها هنا.

    Screenshot shows an Execute stored procedure item with parameters entered.

  7. في الجزء العلوي من الجزء حيث يظهر لكل منها، ضمن تحديد إخراج من الخطوات السابقة، تأكد من تحديد النص الأساسي .

    populate logic app for-each

  8. حفظ تطبيق المنطق الخاص بك.

نسخ عنوان URL HTTP

قبل مغادرة Logic Apps Designer، انسخ عنوان URL الذي يستمع إليه تطبيق المنطق الخاص بك لمشغل. يمكنك استخدام URL هذا لتكوين Event Grid.

  1. قم بتوسيع مربع تكوين المشغل عند تلقي طلب HTTP بالنقر فوقه.

  2. انسخ قيمة URL HTTP POST عن طريق تحديد زر النسخ المجاور له.

    Copy the HTTP POST URL

  3. احفظ عنوان URL هذا بحيث يمكنك الرجوع إليه في القسم التالي.

تكوين الاشتراك لأحداث مركز IoT

في هذا القسم، تقوم بتكوين مركز IoT الخاص بك لنشر الأحداث بينما تحدث.

  1. في مدخل Azure، انتقل إلى مركز IoT.

  2. حدد Events.

    Open the Event Grid details

  3. حدد + اشتراك الحدث.

    Create new event subscription

  4. تعبئة تفاصيل اشتراك الحدث: قم بتوفير اسم وصفي وحدد مخطط شبكة الأحداث.

  5. املأ حقول أنواع الأحداث . في القائمة المنسدلة، حدد الجهاز المتصل والجهاز غير متصل فقط من القائمة. انقر فوق أي مكان آخر على الشاشة لإغلاق القائمة وحفظ التحديدات.

    Set event types to look for

  6. بالنسبة إلى تفاصيل نقطة النهاية، حدد نوع نقطة النهاية ك Web Hook وانقر فوق تحديد نقطة النهاية والصق عنوان URL الذي نسخته من تطبيق المنطق الخاص بك وتأكد من التحديد.

    Select endpoint url

  7. يجب أن يبدو النموذج الآن مشابها للمثال التالي:

    Sample event subscription form

    حدد ⁧⁩إنشاء⁧⁩ لحفظ اشتراك الحدث.

مراقبة الأحداث

الآن بعد إعداد اشتراك الحدث الخاص بك، دعنا نختبر عن طريق توصيل جهاز.

تسجيل جهاز في IoT Hub

  1. من مركز IoT، حدد IoT Devices.

  2. حدد +Add في أعلى الجزء.

  3. بالنسبة ⁧⁩لمعرف الجهاز⁧⁩، أدخل ⁧Demo-Device-1⁩ .

  4. حدد "⁧⁩Save⁧⁩".

  5. يمكنك إضافة أجهزة متعددة بمعرفات أجهزة مختلفة.

    Devices added to hub

  6. انقر على الجهاز مرة أخرى؛ الآن سيتم ملء سلاسل الاتصال والمفاتيح. انسخ سلسلة الاتصال -- المفتاح الأساسي لاستخدامها لاحقا.

    ConnectionString for device

بدء محاكي Raspberry Pi

دعونا نستخدم محاكي ويب Raspberry Pi لمحاكاة اتصال الجهاز.

بدء محاكي Raspberry Pi

تشغيل نموذج تطبيق على محاكي ويب Raspberry Pi

سيؤدي هذا إلى تشغيل حدث متصل بالجهاز.

  1. في منطقة الترميز، استبدل العنصر النائب في السطر 15 بسلسلة اتصال جهاز Azure IoT Hub التي حفظتها في نهاية القسم السابق.

    Paste in device connection string

  2. قم بتشغيل التطبيق عن طريق تحديد Run.

ترى شيئا مشابها للإخراج التالي الذي يعرض بيانات المستشعر والرسائل التي يتم إرسالها إلى مركز IoT الخاص بك.

Running the application

انقر فوق إيقاف لإيقاف المحاكي وتشغيل حدث غير متصل بالجهاز .

لقد قمت الآن بتشغيل نموذج تطبيق لجمع بيانات المستشعر وإرسالها إلى مركز IoT الخاص بك.

مراقبة الأحداث في Cosmos DB

يمكنك مشاهدة نتائج الإجراء المخزن المنفذ في مستند Cosmos DB. هذا ما سيظهر لك. يحتوي كل صف على أحدث حالة اتصال الجهاز لكل جهاز.

How to outcome

استخدام Azure CLI

بدلا من استخدام مدخل Microsoft Azure، يمكنك إنجاز خطوات IoT Hub باستخدام Azure CLI. للحصول على التفاصيل، راجع صفحات Azure CLI لإنشاء اشتراك حدثوإنشاء جهاز IoT.

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

استخدم هذا البرنامج التعليمي الموارد التي تتكبد رسومًا على اشتراك Azure. عند الانتهاء من تجربة البرنامج التعليمي واختبار النتائج، قم بتعطيل أو حذف الموارد التي لا تريد الاحتفاظ بها.

إذا كنت لا تريد فقدان العمل على تطبيق المنطق الخاص بك، ف قم بتعطيله بدلا من حذفه.

  1. انتقل إلى تطبيق المنطق الخاص بك.

  2. في جزء نظرة عامة ، حدد حذف أو تعطيل.

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

  3. انتقل إلى مركز IoT الخاص بك.

  4. في جزء Overview ، حدد Delete.

    حتى إذا احتفظت بمركز IoT الخاص بك، فقد ترغب في حذف اشتراك الحدث الذي قمت بإنشائه.

  5. في مركز IoT، حدد Event Grid.

  6. حدد اشتراك الحدث الذي تريد إزالته.

  7. حدد⁧⁩حذف⁧⁩.

لإزالة حساب Azure Cosmos DB من مدخل Microsoft Azure، انقر بزر الماوس الأيمن فوق اسم الحساب وانقر فوق حذف الحساب. راجع إرشادات مفصلة لحذف حساب Azure Cosmos DB.

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