لغة استعلام IoT Hub لتوأم الجهاز والوحدة النمطية والوظائف وتوجيه الرسائل
يوفر IoT Hub لغة قوية تشبه SQL لاسترداد المعلومات المتعلقة بتوائم الجهاز وتوائمالوحدة النمطيةوالوظائفوتوجيه الرسائل. تقدم هذه المقالة:
- مقدمة عن الميزات الرئيسية للغة استعلام IoT Hub، و
- الوصف التفصيلي للغة. للحصول على تفاصيل حول لغة الاستعلام لتوجيه الرسالة، راجع الاستعلامات في توجيه الرسائل.
ملاحظة
تتوفر بعض الميزات المذكورة في هذه المقالة، مثل المراسلة من السحابة إلى الجهاز، وتوائم الأجهزة، وإدارة الأجهزة، فقط في المستوى القياسي من IoT Hub. لمزيد من المعلومات حول مستويات مركز IoT الأساسية والمعيارية، راجع كيفية اختيار مستوى مركز IoT الصحيح.
الاستعلامات المزدوجة للجهاز والوحدة النمطية
يمكن أن تحتوي توائم الجهازوتوائم الوحدة النمطية على كائنات JSON عشوائية كعلامات وخصائص. يمكنك IoT Hub من الاستعلام عن توائم الجهاز وتوائم الوحدة النمطية كمستند JSON واحد يحتوي على جميع معلومات التوائم.
افترض ، على سبيل المثال ، أن توائم جهاز مركز إنترنت الأشياء لديهم البنية التالية (سيكون توأم الوحدة متشابهة فقط مع moduleId إضافي):
{
"deviceId": "myDeviceId",
"etag": "AAAAAAAAAAc=",
"status": "enabled",
"statusUpdateTime": "0001-01-01T00:00:00",
"connectionState": "Disconnected",
"lastActivityTime": "0001-01-01T00:00:00",
"cloudToDeviceMessageCount": 0,
"authenticationType": "sas",
"x509Thumbprint": {
"primaryThumbprint": null,
"secondaryThumbprint": null
},
"version": 2,
"tags": {
"location": {
"region": "US",
"plant": "Redmond43"
}
},
"properties": {
"desired": {
"telemetryConfig": {
"configId": "db00ebf5-eeeb-42be-86a1-458cccb69e57",
"sendFrequencyInSecs": 300
},
"$metadata": {
...
},
"$version": 4
},
"reported": {
"connectivity": {
"type": "cellular"
},
"telemetryConfig": {
"configId": "db00ebf5-eeeb-42be-86a1-458cccb69e57",
"sendFrequencyInSecs": 300,
"status": "Success"
},
"$metadata": {
...
},
"$version": 7
}
}
}
الاستعلامات المزدوجة في الجهاز
يعرض IoT Hub توائم الجهاز كمجموعة مستندات تسمى الأجهزة. على سبيل المثال، يقوم الاستعلام التالي باسترداد المجموعة الكاملة من توائم الجهاز:
SELECT * FROM devices
ملاحظة
تدعم Azure IoT SDKs ترحيل النتائج الكبيرة.
يتم دعم التجميعات. على سبيل المثال، يحصل الاستعلام التالي على عدد إجمالي عدد الأجهزة في مركز إنترنت الأشياء:
SELECT COUNT() as totalNumberOfDevices FROM devices
يسمح لك IoT Hub باسترداد تصفية توائم الجهاز بظروف تعسفية. على سبيل المثال، لتلقي توائم الجهاز حيث يتم تعيين علامة location.region إلى الولايات المتحدة ، استخدم الاستعلام التالي:
SELECT * FROM devices
WHERE tags.location.region = 'US'
يتم دعم المشغلات المنطقية والمقارنات الحسابية أيضا. على سبيل المثال، لاسترداد توائم الجهاز الموجودة في الولايات المتحدة والتي تم تكوينها لإرسال القياس عن بعد أقل من كل دقيقة، استخدم الاستعلام التالي:
SELECT * FROM devices
WHERE tags.location.region = 'US'
AND properties.reported.telemetryConfig.sendFrequencyInSecs >= 60
كوسيلة للراحة ، من الممكن أيضا استخدام ثوابت الصفيف مع مشغلي IN و NIN (وليس in). على سبيل المثال ، لاسترداد توائم الجهاز التي تبلغ عن اتصال WiFi أو اتصال سلكي ، استخدم الاستعلام التالي:
SELECT * FROM devices
WHERE properties.reported.connectivity IN ['wired', 'wifi']
غالبا ما يكون من الضروري تحديد جميع توائم الجهاز التي تحتوي على خاصية معينة. يدعم IoT Hub الوظيفة is_defined() لهذا الغرض. على سبيل المثال، لاسترداد توائم الجهاز التي تحدد connectivity الخاصية، استخدم الاستعلام التالي:
SELECT * FROM devices
WHERE is_defined(properties.reported.connectivity)
ارجع إلى قسم بند WHERE للحصول على المرجع الكامل لقدرات التصفية.
يتم دعم التجميع أيضا. على سبيل المثال، للعثور على عدد الأجهزة في كل حالة تكوين للقياس عن بعد، استخدم الاستعلام التالي:
SELECT properties.reported.telemetryConfig.status AS status,
COUNT() AS numberOfDevices
FROM devices
GROUP BY properties.reported.telemetryConfig.status
سيؤدي استعلام التجميع هذا إلى إرجاع نتيجة مشابهة للمثال التالي:
[
{
"numberOfDevices": 3,
"status": "Success"
},
{
"numberOfDevices": 2,
"status": "Pending"
},
{
"numberOfDevices": 1,
"status": "Error"
}
]
في هذا المثال، أبلغت ثلاثة أجهزة عن تكوين ناجح، ولا يزال جهازان يطبقان التكوين، وأبلغ جهاز واحد عن حدوث خطأ.
تسمح استعلامات الإسقاط للمطورين بإرجاع الخصائص التي يهتمون بها فقط. على سبيل المثال، لاسترداد وقت النشاط الأخير مع معرف الجهاز لجميع الأجهزة الممكنة التي تم قطع اتصالها، استخدم الاستعلام التالي:
SELECT DeviceId, LastActivityTime FROM devices WHERE status = 'enabled' AND connectionState = 'Disconnected'
فيما يلي مثال على نتيجة استعلام هذا الاستعلام في مستكشف الاستعلام لمركز إنترنت الأشياء:
[
{
"deviceId": "AZ3166Device",
"lastActivityTime": "2021-05-07T00:50:38.0543092Z"
}
]
الاستعلامات المزدوجة للوحدة النمطية
يشبه الاستعلام عن توائم الوحدة النمطية الاستعلام عن توائم الجهاز ، ولكن باستخدام مجموعة / مساحة اسم مختلفة ؛ بدلا من الأجهزة ، يمكنك الاستعلام من devices.modules:
SELECT * FROM devices.modules
لا نسمح بالانضمام بين الأجهزة ومجموعات الأجهزة.الوحدات. إذا كنت ترغب في الاستعلام عن توائم الوحدة النمطية عبر الأجهزة ، فيمكنك القيام بذلك استنادا إلى العلامات. سيعرض هذا الاستعلام جميع توائم الوحدة النمطية عبر جميع الأجهزة بحالة المسح الضوئي:
SELECT * FROM devices.modules WHERE properties.reported.status = 'scanning'
سيقوم هذا الاستعلام بإرجاع جميع توائم الوحدة النمطية مع حالة المسح الضوئي، ولكن فقط على المجموعة الفرعية المحددة من الأجهزة:
SELECT * FROM devices.modules
WHERE properties.reported.status = 'scanning'
AND deviceId IN ['device1', 'device2']
مثال على C #
يتم الكشف عن وظيفة الاستعلام بواسطة SDK خدمة C # في فئة RegistryManager .
فيما يلي مثال على استعلام بسيط:
var query = registryManager.CreateQuery("SELECT * FROM devices", 100);
while (query.HasMoreResults)
{
var page = await query.GetNextAsTwinAsync();
foreach (var twin in page)
{
// do work on twin object
}
}
يتم إنشاء مثيل لكائن الاستعلام بحجم صفحة (يصل إلى 100). ثم يتم استرداد صفحات متعددة عن طريق استدعاء أساليب GetNextAsTwinAsync عدة مرات.
يعرض كائن الاستعلام قيم Next متعددة، استنادا إلى خيار إلغاء التسلسل المطلوب بواسطة الاستعلام. على سبيل المثال، توأم الجهاز أو كائنات المهمة، أو JSON عادي عند استخدام الإسقاطات.
مثال Node.js
يتم الكشف عن وظيفة الاستعلام بواسطة SDK خدمة Azure IoT Node.js في كائن التسجيل .
فيما يلي مثال على استعلام بسيط:
var query = registry.createQuery('SELECT * FROM devices', 100);
var onResults = function(err, results) {
if (err) {
console.error('Failed to fetch the results: ' + err.message);
} else {
// Do something with the results
results.forEach(function(twin) {
console.log(twin.deviceId);
});
if (query.hasMoreResults) {
query.nextAsTwin(onResults);
}
}
};
query.nextAsTwin(onResults);
يتم إنشاء مثيل لكائن الاستعلام بحجم صفحة (يصل إلى 100). ثم يتم استرداد صفحات متعددة عن طريق استدعاء طريقة NextAsTwin عدة مرات.
يعرض كائن الاستعلام قيم Next متعددة، استنادا إلى خيار إلغاء التسلسل المطلوب بواسطة الاستعلام. على سبيل المثال، توأم الجهاز أو كائنات المهمة، أو JSON عادي عند استخدام الإسقاطات.
التقييدات
هام
يمكن أن يكون لنتائج الاستعلام بضع دقائق من التأخير فيما يتعلق بأحدث القيم في توائم الجهاز. في حالة الاستعلام عن توائم جهاز فردي بواسطة ID، استخدم واجهة برمجة تطبيقات Get twin REST. تقوم واجهة برمجة التطبيقات هذه دائما بإرجاع أحدث القيم ولها حدود اختناق أعلى. يمكنك إصدار واجهة برمجة تطبيقات REST مباشرة أو استخدام الوظيفة المكافئة في إحدى مجموعات تطوير البرامج (SDK) لخدمة Azure IoT Hub.
حاليا ، يتم دعم المقارنات فقط بين الأنواع البدائية (بدون كائنات) ، على سبيل المثال ... WHERE properties.desired.config = properties.reported.config يتم دعمها فقط إذا كانت هذه الخصائص لها قيم بدائية.
بدء استخدام استعلامات الوظائف
توفر الوظائف طريقة لتنفيذ العمليات على مجموعات من الأجهزة. يحتوي كل جهاز توأم على معلومات الوظائف التي يعد جزءا منها في مجموعة تسمى الوظائف.
{
"deviceId": "myDeviceId",
"etag": "AAAAAAAAAAc=",
"tags": {
...
},
"properties": {
...
},
"jobs": [
{
"deviceId": "myDeviceId",
"jobId": "myJobId",
"jobType": "scheduleTwinUpdate",
"status": "completed",
"startTimeUtc": "2016-09-29T18:18:52.7418462",
"endTimeUtc": "2016-09-29T18:20:52.7418462",
"createdDateTimeUtc": "2016-09-29T18:18:56.7787107Z",
"lastUpdatedDateTimeUtc": "2016-09-29T18:18:56.8894408Z",
"outcome": {
"deviceMethodResponse": null
}
},
...
]
}
حاليا، هذه المجموعة قابلة للاستعلام devices.jobs في لغة استعلام IoT Hub.
هام
حاليا، لا يتم إرجاع خاصية الوظائف مطلقا عند الاستعلام عن توائم الجهاز. أي الاستعلامات التي تحتوي على "من الأجهزة". لا يمكن الوصول إلى خاصية الوظائف مباشرة إلا باستخدام الاستعلامات التي تستخدم FROM devices.jobs.
على سبيل المثال ، للحصول على جميع المهام (السابقة والمجدولة) التي تؤثر على جهاز واحد ، يمكنك استخدام الاستعلام التالي:
SELECT * FROM devices.jobs
WHERE devices.jobs.deviceId = 'myDeviceId'
لاحظ كيف يوفر هذا الاستعلام الحالة الخاصة بالجهاز (وربما استجابة الطريقة المباشرة) لكل مهمة تم إرجاعها.
من الممكن أيضا التصفية بشروط منطقية تعسفية على جميع خصائص الكائن في مجموعة devices.jobs .
على سبيل المثال، لاسترداد جميع مهام التحديث المزدوج للجهاز المكتملة التي تم إنشاؤها بعد سبتمبر 2016 لجهاز معين، استخدم الاستعلام التالي:
SELECT * FROM devices.jobs
WHERE devices.jobs.deviceId = 'myDeviceId'
AND devices.jobs.jobType = 'scheduleTwinUpdate'
AND devices.jobs.status = 'completed'
AND devices.jobs.createdTimeUtc > '2016-09-01'
يمكنك أيضا استرداد نتائج كل جهاز لوظيفة واحدة.
SELECT * FROM devices.jobs
WHERE devices.jobs.jobId = 'myJobId'
التقييدات
حاليا، لا تدعم الاستعلامات حول devices.jobs ما يلي:
- التوقعات ، وبالتالي هو ممكن فقط
SELECT *. - الشروط التي تشير إلى توأم الجهاز بالإضافة إلى خصائص الوظيفة (انظر القسم السابق).
- تنفيذ تجميعات، مثل العد والمتوسط والمجموعة حسب.
أساسيات استعلام مركز إنترنت الأشياء
يتكون كل استعلام IoT Hub من جمل SELECT و FROM ، مع جمل WHERE و GROUP BY الاختيارية. يتم تشغيل كل استعلام على مجموعة من مستندات JSON، على سبيل المثال توائم الجهاز. يشير بند FROM إلى مجموعة المستندات التي سيتم تكرارها (الأجهزة أو الأجهزة.الوحدات النمطية أو devices.jobs). ثم، يتم تطبيق عامل التصفية في العبارة WHERE. باستخدام التجميعات، يتم تجميع نتائج هذه الخطوة كما هو محدد في العبارة GROUP BY. لكل مجموعة، يتم إنشاء صف كما هو محدد في العبارة SELECT.
SELECT <select_list>
FROM <from_specification>
[WHERE <filter_condition>]
[GROUP BY <group_specification>]
عبارة FROM
يمكن أن تفترض عبارة FROM <from_specification> ثلاث قيم فقط: من الأجهزة إلى توائم جهاز الاستعلام، أو FROM devices.modules إلى توائم وحدة الاستعلام، أو من devices.jobs إلى تفاصيل مهمة الاستعلام لكل جهاز.
عبارة WHERE
شرط WHERE <filter_condition> اختياري. يحدد شرطا واحدا أو أكثر يجب أن تستوفيه مستندات JSON في مجموعة FROM ليتم تضمينها كجزء من النتيجة. يجب على أي مستند JSON تقييم الشروط المحددة إلى "true" ليتم تضمينها في النتيجة.
يتم وصف الشروط المسموح بها في قسم التعبيرات والشروط.
عبارة SELECT
يعد select_list> SELECT < إلزاميا ويحدد القيم التي يتم استردادها من الاستعلام. يحدد قيم JSON لاستخدامها لإنشاء كائنات JSON جديدة. لكل عنصر من عناصر المجموعة الفرعية التي تمت تصفيتها (وتجميعها اختياريا) من مجموعة FROM، تقوم مرحلة الإسقاط بإنشاء كائن JSON جديد. يتم إنشاء هذا الكائن مع القيم المحددة في العبارة SELECT.
فيما يلي قواعد الجملة SELECT:
SELECT [TOP <max number>] <projection list>
<projection_list> ::=
'*'
| <projection_element> AS alias [, <projection_element> AS alias]+
<projection_element> :==
attribute_name
| <projection_element> '.' attribute_name
| <aggregate>
<aggregate> :==
count()
| avg(<projection_element>)
| sum(<projection_element>)
| min(<projection_element>)
| max(<projection_element>)
يشير Attribute_name إلى أي خاصية لمستند JSON في مجموعة FROM. يمكن العثور على بعض الأمثلة على عبارات SELECT في قسم بدء استخدام الاستعلامات المزدوجة للجهاز.
حاليا، يتم دعم بنود التحديد المختلفة عن SELECT* فقط في الاستعلامات المجمعة على توائم الجهاز.
مجموعة حسب البند
العبارة GROUP BY <group_specification> هي خطوة اختيارية يتم تنفيذها بعد عامل التصفية المحدد في العبارة WHERE، وقبل الإسقاط المحدد في SELECT. يقوم بتجميع المستندات استنادا إلى قيمة السمة. تستخدم هذه المجموعات لإنشاء قيم مجمعة كما هو محدد في عبارة SELECT.
مثال على استعلام باستخدام GROUP BY هو:
SELECT properties.reported.telemetryConfig.status AS status,
COUNT() AS numberOfDevices
FROM devices
GROUP BY properties.reported.telemetryConfig.status
بناء الجملة الرسمي ل GROUP BY هو:
GROUP BY <group_by_element>
<group_by_element> :==
attribute_name
| < group_by_element > '.' attribute_name
يشير Attribute_name إلى أي خاصية لمستند JSON في مجموعة FROM.
حاليا، يتم دعم بند GROUP BY فقط عند الاستعلام عن توائم الجهاز.
هام
يتم التعامل مع المصطلح group حاليا ككلمة رئيسية خاصة في طلبات البحث. في حالة استخدامك group كاسم لمكان الإقامة الخاص بك ، فكر في إحاطته بأقواس مزدوجة لتجنب الأخطاء ، على سبيل المثال ، SELECT * FROM devices WHERE tags.[[group]].name = 'some_value'.
التعبيرات والشروط
على مستوى عال ، تعبير:
- يتم تقييمه إلى مثيل من نوع JSON (مثل منطقي أو رقم أو سلسلة أو صفيف أو كائن).
- يتم تعريفه من خلال معالجة البيانات الواردة من مستند JSON الخاص بالجهاز والثوابت باستخدام عوامل تشغيل ووظائف مضمنة.
الشروط هي التعبيرات التي تقيم إلى منطقي. أي ثابت مختلف عن الصحيح المنطقي يعتبر خاطئا. تتضمن هذه القاعدة فارغةوغير محددة وأي مثيل كائن أو صفيف وأي سلسلة والخطأ المنطقي.
بناء جملة التعبيرات هو:
<expression> ::=
<constant> |
attribute_name |
<function_call> |
<expression> binary_operator <expression> |
<create_array_expression> |
'(' <expression> ')'
<function_call> ::=
<function_name> '(' expression ')'
<constant> ::=
<undefined_constant>
| <null_constant>
| <number_constant>
| <string_constant>
| <array_constant>
<undefined_constant> ::= undefined
<null_constant> ::= null
<number_constant> ::= decimal_literal | hexadecimal_literal
<string_constant> ::= string_literal
<array_constant> ::= '[' <constant> [, <constant>]+ ']'
لفهم ما يرمز إليه كل رمز في بناء جملة التعبيرات، راجع الجدول التالي:
| الرمز | التعريف |
|---|---|
| attribute_name | أي خاصية لمستند JSON في مجموعة FROM . |
| binary_operator | أي عامل تشغيل ثنائي مدرج في قسم المشغلين . |
| function_name | أي وظيفة مدرجة في قسم الوظائف . |
| decimal_literal | تعويم معبرا عنه بالتدوين العشري. |
| hexadecimal_literal | رقم يتم التعبير عنه بواسطة السلسلة "0x" متبوعا بسلسلة من الأرقام السداسية العشرية. |
| string_literal | القيم الحرفية للسلسلة هي سلاسل Unicode ممثلة بتسلسل من صفر أو أكثر من أحرف Unicode أو سلاسل الإلغاء. يتم تضمين حروف السلسلة في علامات اقتباس مفردة أو علامات اقتباس مزدوجة. الهروب المسموح به: \', , \\, \"، \uXXXX لأحرف Unicode المعرفة بواسطة 4 أرقام سداسية عشرية. |
المشغلون
يتم دعم العوامل التالية:
| العائلة | المشغلون |
|---|---|
| حسابي | +, -, *, /, % |
| المنطقية | AND, OR, NOT |
| المقارنة | =, !=, <, >, <=, >=, <> |
الوظائف
عند الاستعلام عن التوائم والوظائف، تكون الوظيفة الوحيدة المدعومة هي:
| الوظيفة | الوصف |
|---|---|
| IS_DEFINED (عقار) | إرجاع صورة منطقية تشير إلى ما إذا كان قد تم تعيين قيمة للخاصية (بما في ذلك null). |
في ظروف المسارات، يتم دعم دالات الرياضيات التالية:
| الوظيفة | الوصف |
|---|---|
| ABS (x) | ترجع القيمة المطلقة (الموجبة) للتعبير الرقمي المحدد. |
| إكسب (خ) | ترجع هذه الدالة القيمة الأسية للتعبير الرقمي المحدد (e^x). |
| الطاقة (س ، ص) | ترجع هذه الدالة قيمة التعبير المحدد إلى الطاقة المحددة (x^y). |
| مربع(x) | تقوم بإرجاع مربع القيمة الرقمية المحددة. |
| السقف (x) | مسؤول عن إرجاع أصغر قيمة عدد صحيح أكبر من التعبير الرقمي المحدد أو مساوياً له. |
| الطابق (x) | يقوم بإرجاع أكبر عدد صحيح أقل من التعبير الرقمي المحدد أو يساويه. |
| علامة (x) | تُرجع هذه الدالة الموجبة (+1)، أو الصفر (0)، أو السالب (-1) للتعبير الرقمي المحدد. |
| SQRT(x) | تقوم بإرجاع الجذر التربيعي للقيمة الرقمية المحددة. |
في ظروف المسارات، يتم دعم وظائف التحقق من النوع والصب التالية:
| الوظيفة | الوصف |
|---|---|
| AS_NUMBER | تحويل سلسلة الإدخال إلى رقم. noop إذا كان الإدخال رقما ؛ Undefined إذا كانت السلسلة لا تمثل رقما. |
| IS_ARRAY | ترجع قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد عبارة عن صفيف. |
| IS_BOOL | تُرجع القيمة المنطقية لتشير إلى ما إذا كان نوع التعبير المحدد منطقي. |
| IS_DEFINED | يرجع منطقية تشير إلى ما إذا تم تعيين قيمة للخاصية. يتم دعم هذا فقط عندما تكون القيمة من النوع الأولي. تتضمن الأنواع البدائية سلسلة أو منطقية أو رقمية أو null. لا يتم دعم DateTime وأنواع الكائنات والمصفوفات. |
| IS_NULL | إرجاع قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد خالياً. |
| IS_NUMBER | ترجع قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد عبارة عن رقم. |
| IS_OBJECT | إرجاع قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد يكون عنصر JSON. |
| IS_PRIMITIVE | ترجع هذه الدالة قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد بدائيا (سلسلة أو منطقية أو رقمية أو null). |
| IS_STRING | تُرجع قيمة منطقية تشير إلى ما إذا كان نوع التعبير المحدد عبارة عن سلسلة. |
في ظروف المسارات، يتم دعم وظائف السلسلة التالية:
| الوظيفة | الوصف |
|---|---|
| كونكات (س ، ص ، ...) | تُرجع سلسلة ناتجة عن تسلسل قيمتين أو أكثر من قيم السلسلة. |
| الطول (x) | تُرجع عدد أحرف تعبير السلسلة المحدد. |
| أقل(x) | استعادة التسلسل السريع بعد تحويل بيانات الأحرف الكبيرة إلى أحرف صغيرة. |
| العلوي(x) | يرجع تعبير سلسلة بعد تحويل بيانات الأحرف الصغيرة إلى أحرف كبيرة. |
| سلسلة فرعية (سلسلة، ابدأ [، طول]) | تُرجع جزءاً من تعبير سلسلة يبدأ من الموضع الصفري للحرف المحدد ويستمر حتى الطول المحدد، أو حتى نهاية السلسلة. |
| INDEX_OF (سلسلة، جزء) | تُرجع موضع البداية للتواجد الأول لتعبير السلسلة الثاني ضمن أول تعبير سلسلة محدد، أو -1 إذا لم يُعْثَر على السلسلة. |
| STARTS_WITH (س، ص) | إرجاع قيمة منطقية تشير إلى ما إذا كان تعبير السلسلة الأول يبدأ بالتعبير الثاني. |
| ENDS_WITH (س، ص) | إرجاع قيمة منطقية تشير إلى ما إذا كان تعبير السلسلة الأول ينتهي بالتعبير الثاني. |
| تحتوي على (س، ص) | إرجاع تعبير منطقي يشير إلى ما إذا كان تعبير السلسلة الأولى يطابق الثاني. |
الخطوات التالية
تعرف على كيفية تنفيذ الاستعلامات في تطبيقاتك باستخدام Azure IoT SDKs.