ابدأ مع توائم الجهاز (Node.js)

توائم الجهاز عبارة عن مستندات JSON تُخزِّن معلومات حالة الجهاز، بما في ذلك بيانات التعريف والتكوينات والحالات. يحتفظ IoT Hub بتوأم جهاز لكل جهاز يتصل به.

إشعار

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

استخدم توائم الجهاز من أجل ما يلي:

  • خزّن بيانات التعريف للجهاز من النهاية الخلفية للحل الخاص بك.

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

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

  • الاستعلام عن بيانات التعريف للجهاز، أو التكوين، أو الحالة.

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

تخزن مراكز IoT توائم الجهاز، والتي تحتوي على العناصر التالية:

  • العلامات. يمكن الوصول إلى بيانات التعريف للجهاز فقط من خلال النهاية الخلفية للحل.

  • الخصائص المرغوبة. عناصر JSON قابلة للتعديل من خلال النهاية الخلفية للحل ويمكن ملاحظتها بواسطة تطبيق الجهاز.

  • الخصائص المبلغ عنها. عناصر JSON قابلة للتعديل من خلال تطبيق الجهاز ويمكن قراءتها بواسطة النهاية الخلفية للحل.

لا يمكن أن تحتوي العلامات والخصائص على صفائف، ولكن يمكن أن تحتوي على كائنات متداخلة.

يوضح الرسم التوضيحي التالي تنظيم توأم الجهاز:

لقطة شاشة لمخطط مفهوم توأم الجهاز.

بالإضافة إلى ذلك، يمكن للجهة الخلفية للحل الاستعلام عن توائم الجهاز بناءً على جميع البيانات المذكورة أعلاه. لمزيد من المعلومات حول توائم الجهاز، راجع التعرف على توائم الجهاز. لمزيد من المعلومات حول الاستعلام، راجع لغة استعلام IoT Hub.

توضح لك هذه المقالة كيفية:

  • استخدم تطبيق جهاز محاكاة للإبلاغ عن قناة الاتصال الخاصة به كخاصية تم الإبلاغ عنها على توأم الجهاز.

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

في هذه المقالة، يمكنك إنشاء تطبيقي وحدة تحكم Node.js:

  • AddTagsAndQuery.js: تطبيق للجهة الخلفية يضيف علامات واستعلامات توائم الجهاز.

  • TwinSimulatedDevice.js: تطبيق جهاز محاكاة يتصل بمركز IoT ويبلغ عن حالة الاتصال.

إشعار

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

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

لإكمال هذه المقالة، تحتاج إلى الآتي:

  • IoT Hub. أنشئ واحدا باستخدام CLI أو مدخل Microsoft Azure.

  • جهاز مسجل. سجَل واحدًا في مدخل Azure.

  • Node.js الإصدار 10.0.x أو أحدث.

  • تأكد من أن المنفذ 8883 مفتوح في جدار الحماية. يستخدم نموذج الجهاز في هذه المقالة بروتوكول MQTT، الذي يتصل عبر المنفذ 8883. قد يُحظر هذا المنفذ في بعض بيئات الشبكات التعليمية، وشبكات الشركات. لمزيد من المعلومات وطرق التغلب على هذه المشكلة، راجع الاتصال بمركز IoT (MQTT).

احصل على سلسلة اتصال IoT hub

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

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

  1. في مدخل Microsoft Azure، حدد Resource groups. حدد مجموعة الموارد حيث يوجد المركز الخاص بك، ثم حدد المركز الخاص بك من قائمة الموارد.

  2. في الجزء الأيسر من مركز IoT، قم بتحديد Shared access policies.

  3. من القائمة أعلى قائمة النهج، حدّد إضافة نهج الوصول المشترك.

  4. ضمن جزء إضافة نهج الوصول المشترك، على اليمين، أدخل اسماً وصفياً للنهج الخاص بك، مثل serviceAndRegistryRead. ضمن الأذونات، حدد قراءة السجل و اتصال الخدمة، ثم حدد إضافة.

    لقطة شاشة توضح كيفية إضافة نهج وصول مشترك جديد.

  5. حدد النهج الخاص بك الجديدة من قائمة النُهج.

  6. حدد أيقونة النسخ لسلسلة الاتصال الأساسية واحفظ القيمة.

    لقطة شاشة توضح كيفية استرداد سلسلة الاتصال.

للمزيد من المعلومات حول نهج الوصول المشترك لـIoT Hub والأذونات، راجع التحكم في الوصول والأذونات.

إنشاء تطبيق جهاز يقوم بتحديث الخصائص المبلغ عنها

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

  1. قم بإنشاء مجلد فارغ جديد يسمى reportconnectivity. في المجلد reportconnectivity، قم بإنشاء ملف package.json جديد باستخدام الأمر التالي في موجه الأوامر. تقبل المعلمة --yes جميع القيم الافتراضية.

    npm init --yes
    
  2. في موجه الأوامر الخاص بك في المجلد reportconnectivity، قم بتشغيل الأمر التالي لتثبيت حزم azure-iot-deviceو azure-iot-device-mqtt :

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. باستخدام محرر نصوص، قم بإنشاء ملف ReportConnectivity.js جديد في المجلد reportconnectivity.

  4. أضف التعليمة البرمجية التالية إلى ملف ReportConnectivity.js. استبدل {device connection string} بسلسلة اتصال الجهاز التي رأيتها عند تسجيل جهاز في مركز IoT:

        'use strict';
        var Client = require('azure-iot-device').Client;
        var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
        var connectionString = '{device connection string}';
        var client = Client.fromConnectionString(connectionString, Protocol);
    
        client.open(function(err) {
        if (err) {
            console.error('could not open IotHub client');
        }  else {
            console.log('client opened');
    
            client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                var patch = {
                    connectivity: {
                        type: 'cellular'
                    }
                };
    
                twin.properties.reported.update(patch, function(err) {
                    if (err) {
                        console.error('could not update twin');
                    } else {
                        console.log('twin state reported');
                        process.exit();
                    }
                });
            }
            });
        }
        });
    

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

  5. قم بتشغيل تطبيق الجهاز

        node ReportConnectivity.js
    

    يجب أن ترى الرسالة twin state reported.

  6. الآن بعد أن أبلغ الجهاز عن معلومات الاتصال الخاصة به، يجب أن تظهر في كلا الاستعلامين. ارجع إلى المجلد addtagsandqueryapp وقم بتشغيل الاستعلامات مرة أخرى:

        node AddTagsAndQuery.js
    

    في هذه المرة، من المفترض أن يظهر myDeviceId في كل نتائج طلب البحث.

    إظهار myDeviceId في كل نتائج الاستعلام

إنشاء تطبيق خدمة يقوم بتحديث الخصائص المطلوبة والاستعلامات المزدوجة

في هذا القسم، تقوم بإنشاء تطبيق وحدة تحكم Node.js يضيف بيانات التعريف للموقع إلى الجهاز المزدوج المرتبط بـ myDeviceId. يستعلم التطبيق عن مركز IoT للأجهزة الموجودة في الولايات المتحدة، ثم عن الأجهزة التي تبلغ عن اتصال شبكة خلوية.

  1. قم بإنشاء مجلد فارغ جديد يسمى addtagsandqueryapp. في المجلد addtagsandqueryapp، قم بإنشاء ملف package.json جديد باستخدام الأمر التالي في موجه الأوامر. تقبل المعلمة --yes جميع القيم الافتراضية.

    npm init --yes
    
  2. في موجه الأوامر في المجلد addtagsandqueryapp، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iothub :

    npm install azure-iothub --save
    
  3. باستخدام محرر نصوص، قم بإنشاء ملف AddTagsAndQuery.js جديد في المجلد addtagsandqueryapp.

  4. أضف التعليمة البرمجية التالية إلى ملف AddTagsAndQuery.js. استبدل {iot hub connection string} بسلسلة اتصال IoT hub التي نسختها في الحصول على سلسلة اتصال IoT hub.

         'use strict';
         var iothub = require('azure-iothub');
         var connectionString = '{iot hub connection string}';
         var registry = iothub.Registry.fromConnectionString(connectionString);
    
         registry.getTwin('myDeviceId', function(err, twin){
             if (err) {
                 console.error(err.constructor.name + ': ' + err.message);
             } else {
                 var patch = {
                     tags: {
                         location: {
                             region: 'US',
                             plant: 'Redmond43'
                       }
                     }
                 };
    
                 twin.update(patch, function(err) {
                   if (err) {
                     console.error('Could not update twin: ' + err.constructor.name + ': ' + err.message);
                   } else {
                     console.log(twin.deviceId + ' twin updated successfully');
                     queryTwins();
                   }
                 });
             }
         });
    

    يكشف عنصر التسجيل عن جميع الطرق المطلوبة للتفاعل مع توائم الجهاز من الخدمة. يهيئ التعليمة البرمجية السابق أولاً عنصر التسجيل، ثم يسترد الجهاز المزدوج لـ myDeviceId، وأخيراً يقوم بتحديث علاماته بمعلومات الموقع المطلوبة.

    بعد تحديث العلامات، تستدعي وظيفة queryTwins.

  5. أضف التعليمة البرمجية التالية في نهاية AddTagsAndQuery.js لتنفيذ الدالة queryTwins :

         var queryTwins = function() {
             var query = registry.createQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
             query.nextAsTwin(function(err, results) {
                 if (err) {
                     console.error('Failed to fetch the results: ' + err.message);
                 } else {
                     console.log("Devices in Redmond43: " + results.map(function(twin) {return twin.deviceId}).join(','));
                 }
             });
    
             query = registry.createQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity.type = 'cellular'", 100);
             query.nextAsTwin(function(err, results) {
                 if (err) {
                     console.error('Failed to fetch the results: ' + err.message);
                 } else {
                     console.log("Devices in Redmond43 using cellular network: " + results.map(function(twin) {return twin.deviceId}).join(','));
                 }
             });
         };
    

    ينفذ التعليمة البرمجية السابق استعلامين: الأول يحدد فقط توائم الأجهزة الموجودة في مصنع Redmond43، والثاني ينقح الاستعلام لتحديد الأجهزة المتصلة أيضاً عبر الشبكة الخلوية.

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

  6. قم بتشغيل التطبيق باستخدام:

        node AddTagsAndQuery.js
    

    من المفترض أن ترى جهازًا واحدًا في نتائج الاستعلام الذي يبحث عن جميع الأجهزة الموجودة في Redmond43 ولا شيء للاستعلام الذي يقيد النتائج على الأجهزة التي تستخدم شبكة خلوية.

    رؤية جهاز واحد في نتائج الاستعلام

في هذه المقالة، ستتمكن من:

  • إضافة بيانات تعريف الجهاز كعلامات من تطبيق خلفي
  • الإبلاغ عن معلومات اتصال الجهاز في توأم الجهاز
  • الاستعلام عن معلومات توأم الجهاز باستخدام لغة استعلام مركز IoT تشبه SQL

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

‏‫تعّرف على كيفية: