بناء جملة استعلام توجيه رسالة IoT Hub

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

إشعار

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

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

الاستعلام استنادا إلى خصائص الرسالة

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

{ 
  "message": { 
    "systemProperties": { 
      "contentType": "application/json", 
      "contentEncoding": "UTF-8", 
      "iothub-message-source": "deviceMessages", 
      "iothub-enqueuedtime": "2017-05-08T18:55:31.8514657Z" 
    }, 
    "appProperties": { 
      "processingPath": "{cold | warm | hot}", 
      "verbose": "{true, false}", 
      "severity": 1-5, 
      "testDevice": "{true | false}" 
    }, 
    "body": "{\"Weather\":{\"Temperature\":50}}" 
  } 
} 

خصائص النظام

تساعد خصائص النظام في تحديد محتويات الرسائل ومصدرها، وبعضها موضح في الجدول التالي:

الخاصية نوع ‏‏الوصف
نوع المحتوى سلسلة يحدد المستخدم نوع محتوى الرسالة. للسماح بالاستعلام عن نص الرسالة، يجب تعيين هذه القيمة إلى application/JSON.
contentEncoding سلسلة يحدد المستخدم نوع ترميز الرسالة. إذا تم تعيين الخاصية contentType إلى application/JSON، فإن القيم المسموح بها هي UTF-8و UTF-16و.UTF-32
iothub-connection-device-id سلسلة يتم تعيين هذه القيمة بواسطة IoT Hub وتحدد معرف الجهاز. للاستعلام، استخدم $connectionDeviceId.
iothub-connection-module-id سلسلة يتم تعيين هذه القيمة بواسطة IoT Hub وتحدد معرف وحدة الحافة. للاستعلام، استخدم $connectionModuleId.
iothub-enqueuedtime سلسلة يتم تعيين هذه القيمة بواسطة IoT Hub وتمثل الوقت الحقيقي لوضع الرسالة في قائمة بالتوقيت العالمي المتفق عليه (UTC). للاستعلام، استخدم $enqueuedTime.
dt-dataschema سلسلة يتم تعيين هذه القيمة بواسطة IoT Hub على رسائل من جهاز إلى سحابة. تحتوي على معرّف طراز الجهاز الذي تم تعيينه في اتصال الجهاز. للاستعلام، استخدم $dt-dataschema.
dt-subject سلسلة اسم المكوّن الذي يقوم بإرسال رسائل من جهاز إلى سحابة. للاستعلام، استخدم $dt-subject.

لمزيد من المعلومات حول خصائص النظام الأخرى المتوفرة، راجع إنشاء رسائل IoT Hub وقراءتها.

خصائص التطبيق

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

تعبيرات استعلام خصائص الرسالة

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

للاستعلام عن محتوى خاصية النظامالترميز:

$contentEncoding = 'UTF-8'

للاستعلام عن مسار معالجة خاصية التطبيق:

processingPath = 'hot'

لدمج هذه الاستعلامات، يمكنك استخدام التعبيرات المنطقية والوظائف:

$contentEncoding = 'UTF-8' AND processingPath = 'hot'

يتم توفير قائمة كاملة بعوامل التشغيل والوظائف المدعومة في قسم التعبير والشروط في لغة استعلام IoT Hub لتوائم الجهاز والوحدة النمطية والمهام وتوجيه الرسائل.

الاستعلام استنادا إلى نص الرسالة

لتمكين الاستعلام عن نص رسالة، يجب أن تكون الرسالة بتنسيق JSON ويتم ترميزها إما في UTF-8 أو UTF-16 أو UTF-32. contentType يجب أن تكون application/JSONخاصية النظام . contentEncoding يجب أن تكون خاصية النظام إحدى قيم ترميز UTF التي تدعمها خاصية النظام هذه. إذا لم يتم تحديد خصائص النظام هذه، فلن يقوم IoT Hub بتقييم تعبير الاستعلام على نص الرسالة.

يوضح مثال JavaScript التالي كيفية إنشاء رسالة مع نص JSON تم تكوينه وترميزه بشكل صحيح:

var messageBody = JSON.stringify(Object.assign({}, {
    "Weather": {
        "Temperature": 50,
        "Time": "2017-03-09T00:00:00.000Z",
        "PrevTemperatures": [
            20,
            30,
            40
        ],
        "IsEnabled": true,
        "Location": {
            "Street": "One Microsoft Way",
            "City": "Redmond",
            "State": "WA"
        },
        "HistoricalData": [
            {
                "Month": "Feb",
                "Temperature": 40
            },
            {
                "Month": "Jan",
                "Temperature": 30
            }
        ]
    }
}));

// Encode message body using UTF-8  
var messageBytes = Buffer.from(messageBody, "utf8");

var message = new Message(messageBytes);

// Set message body type and content encoding 
message.contentEncoding = "utf-8";
message.contentType = "application/json";

// Add other custom application properties   
message.properties.add("Status", "Active");

deviceClient.sendEvent(message, (err, res) => {
    if (err) console.log('error: ' + err.toString());
    if (res) console.log('status: ' + res.constructor.name);
});

للحصول على نموذج ترميز رسالة في C#، راجع HubRoutingSample المتوفر في Microsoft Azure IoT SDK ل .NET. هذا النموذج هو نفس النموذج المستخدم في البرنامج التعليمي لتوجيه الرسائل. يحتوي ملف Program.cs أيضا على أسلوب يسمى ReadOneRowFromFile، والذي يقرأ أحد الملفات المشفرة، ويفك ترميزه، ويكتبه مرة أخرى ك ASCII حتى تتمكن من قراءته.

تعبيرات استعلام نص الرسالة

يجب أن يبدأ الاستعلام الموجود في نص الرسالة بـ $body. يمكنك استخدام مرجع نص أو مرجع صفيف نص أو مراجع نص متعددة في تعبير الاستعلام. يمكن لتعبير الاستعلام أيضا دمج مرجع نص مع مرجع خصائص نظام الرسائل أو مرجع خصائص تطبيق رسالة. على سبيل المثال، الأمثلة التالية هي جميع تعبيرات الاستعلام الصالحة:

$body.Weather.HistoricalData[0].Month = 'Feb' 
$body.Weather.Temperature = 50 AND $body.Weather.IsEnabled 
length($body.Weather.Location.State) = 2 
$body.Weather.Temperature = 50 AND processingPath = 'hot'

يمكنك تشغيل الاستعلامات والوظائف فقط على الخصائص الموجودة في مرجع النص. لا يمكنك تشغيل الاستعلامات أو الوظائف على مرجع النص بالكامل. على سبيل المثال، الاستعلام التالي غير مدعوم ويرجع undefined:

$body[0] = 'Feb'

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

$body.properties.desired.telemetryConfig.sendFrequency > 10

لتصفية الرسائل التي تحتوي على تغيير في الخاصية، بغض النظر عن قيمة الخاصية، يمكنك استخدام الوظيفة is_defined() (عندما تكون القيمة من النوع الأولي):

is_defined($body.properties.desired.telemetryConfig.sendFrequency)

الاستعلام استنادا إلى الجهاز أو الوحدة النمطية المزدوجة

يمكنك توجيه الرسائل من الاستعلام عن علامات وخصائص توأم الجهاز أو الوحدة النمطية، وهي كائنات JSON. يوضح النموذج التالي توأم الجهاز مع العلامات والخصائص:

{
    "tags": { 
        "deploymentLocation": { 
            "building": "43", 
            "floor": "1" 
        } 
    }, 
    "properties": { 
        "desired": { 
            "telemetryConfig": { 
                "sendFrequency": "5m" 
            }, 
            "$metadata" : {...}, 
            "$version": 1 
        }, 
        "reported": { 
            "telemetryConfig": { 
                "sendFrequency": "5m", 
                "status": "success" 
            },
            "batteryLevel": 55, 
            "$metadata" : {...}, 
            "$version": 4 
        } 
    } 
} 

إشعار

لا ترث الوحدات العلامات المزدوجة من أجهزتها المقابلة. استعلامات التوأم للرسائل التي تنشأ من وحدات الجهاز النمطية (على سبيل المثال، من وحدات IoT Edge النمطية) مقابل الوحدة المزدوجة وليس الجهاز المزدوج المقابل.

تعبيرات الاستعلام المزدوج

يجب أن يكون الاستعلام على توأم الجهاز أو الوحدة النمطية المزدوجة مسبوقا ب $twin. يمكن أن يجمع تعبير الاستعلام أيضا بين علامة مزدوجة أو مرجع خاصية مع مرجع نص أو مرجع خصائص نظام رسائل أو مرجع خصائص تطبيق رسالة. نوصي باستخدام أسماء فريدة في العلامات والخصائص لأن الاستعلام غير حساس لحالة الأحرف. تنطبق هذه التوصية على كل من توائم الجهاز وتوائم الوحدة النمطية. نوصي أيضا بتجنب استخدام twinأو $twinbodyأو أو $body كأسماء خصائص. على سبيل المثال، الأمثلة التالية هي جميع تعبيرات الاستعلام الصالحة:

$twin.properties.desired.telemetryConfig.sendFrequency = '5m'
$body.Weather.Temperature = 50 AND $twin.properties.desired.telemetryConfig.sendFrequency = '5m'
$twin.tags.deploymentLocation.floor = 1 

القيود

لا تدعم استعلامات التوجيه استخدام المسافة البيضاء أو أي من الأحرف التالية في أسماء الخصائص أو مسار نص الرسالة أو المسار المزدوج للجهاز/الوحدة: ()<>@,;:\"/?={}.

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