IoT Hub-lekérdezési nyelv az ikereszközökhöz - és modulokhoz, feladatokhoz, valamint az üzenetirányításhoz

IoT Hub hatékony SQL-szerű nyelvet biztosít az ikereszközökkel, modulikrekkel, feladatokkal és üzenet-útválasztással kapcsolatos információk lekéréséhez. Ez a cikk a következőt mutatja be:

Konkrét példákért lásd: Eszközök és modulok ikerpéldányainak lekérdezései vagy Feladatok lekérdezései.

Megjegyzés

A cikkben említett egyes funkciók, például a felhő–eszköz irányú üzenetküldés, az ikereszközök és az eszközfelügyelet csak a standard szintű IoT Hubon érhető el. Az alapszintű és standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldáshoz megfelelő IoT Hub szint kiválasztása.

IoT Hub lekérdezések futtatása

Lekérdezéseket futtathat az IoT Hubon közvetlenül a Azure Portal.

  1. Jelentkezzen be a Azure Portal, és lépjen az IoT Hubra.
  2. A navigációs menü Eszközkezelés szakaszában válassza a Lekérdezések lehetőséget.
  3. Írja be a lekérdezést a szövegmezőbe, és válassza a Lekérdezés futtatása lehetőséget.

Az alkalmazásokban lekérdezéseket is futtathat az Azure IoT szolgáltatás SDK-jai és szolgáltatás API-k használatával.

A IoT Hub lekérdezéseket implementáló kód például a Lekérdezési példák a szolgáltatás SDK-kkal szakaszában található.

Az SDK referenciaoldalaira és mintáira mutató hivatkozásokért lásd: Azure IoT SDK-k.

A IoT Hub lekérdezések alapjai

Minden IoT Hub lekérdezés SELECT és FROM záradékokból áll, választható WHERE és GROUP BY záradékokkal.

A lekérdezések JSON-dokumentumok, például ikereszközök gyűjteményén futnak. A FROM záradék azt jelzi, hogy a dokumentumgyűjteményt ( eszközök, eszközök.modulok vagy devices.jobs) kell-e iterated-ként használni.

Ezután a WHERE záradék szűrője lesz alkalmazva. Összesítések esetén a lépés eredményei a GROUP BY záradékban megadottak szerint vannak csoportosítva. Minden csoporthoz létrejön egy sor a SELECT záradékban megadott módon.

SELECT <select_list>
  FROM <from_specification>
  [WHERE <filter_condition>]
  [GROUP BY <group_specification>]

SELECT záradék

A SELECT <select_list> záradékra minden IoT Hub lekérdezésben szükség van. Meghatározza, hogy a rendszer milyen értékeket kér le a lekérdezésből. Meghatározza az új JSON-objektumok létrehozásához használandó JSON-értékeket. A FROM gyűjtemény szűrt (és opcionálisan csoportosított) részhalmazának minden eleme esetében a vetítési fázis létrehoz egy új JSON-objektumot. Ez az objektum a SELECT záradékban megadott értékekkel jön létre.

Például:

  • Az összes érték visszaadva

    SELECT *
    
  • Adott tulajdonságok visszaadva

    SELECT DeviceID, LastActivityTime
    
  • Lekérdezés eredményeinek összesítése a darabszám visszaadásához

    SELECT COUNT() as TotalNumber
    

Jelenleg a SELECT-nél eltérő kiválasztási záradékok csak az ikereszközök összesített lekérdezéseiben támogatottak.

Az alábbi szintaxis a SELECT záradék nyelvtana:

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 a FROM gyűjtemény JSON-dokumentumának bármely tulajdonságára hivatkozik.

FROM záradék

A FROM <from_specification> záradékra minden ioT Hub-lekérdezésben szükség van. A három érték egyikének kell lennie:

  • eszközök az ikereszközök lekérdezéséhez
  • devices.modules to query module twins
  • devices.jobs a feladat eszközenkénti adatainak lekérdezéséhez

Például:

  • Az összes ikereszköz lekérése

    SELECT * FROM devices
    

WHERE záradék

A WHERE <filter_condition> záradék nem kötelező. Egy vagy több feltételt határoz meg, amelyeket a FROM gyűjtemény JSON-dokumentumainak teljesíteniük kell ahhoz, hogy az eredmény részeként szerepeljenek. Minden JSON-dokumentumnak "true" értékre kell értékelnie a megadott feltételeket, hogy szerepeljen az eredményben.

Például:

  • Egy adott eszközt célzó összes feladat lekérése

    SELECT * FROM devices.jobs
      WHERE devices.jobs.deviceId = 'myDeviceId'
    

Az engedélyezett feltételeket a kifejezések és feltételek szakasz ismerteti.

GROUP BY záradék

A GROUP BY <group_specification> záradék nem kötelező. Ez a záradék a WHERE záradékban megadott szűrő után és a SELECT záradékban megadott vetület előtt fut. Egy attribútum értéke alapján csoportosítja a dokumentumokat. Ezek a csoportok a SELECT záradékban megadott összesített értékek létrehozására szolgálnak.

Például:

  • Az egyes telemetriakonfigurációs állapotot jelentő eszközök számának visszaadása

    SELECT properties.reported.telemetryConfig.status AS status,
      COUNT() AS numberOfDevices
    FROM devices
    GROUP BY properties.reported.telemetryConfig.status
    

A GROUP BY záradék jelenleg csak az ikereszközök lekérdezésekor támogatott.

Figyelemfelhívás

A kifejezés group jelenleg speciális kulcsszóként van kezelve a lekérdezésekben. Ha a tulajdonságnévként használja group , érdemes lehet két szögletes zárójelekkel körülvenni, hogy elkerülje a hibákat, például SELECT * FROM devices WHERE tags.[[group]].name = 'some_value': .

A GROUP BY formális szintaxisa a következő:

GROUP BY <group_by_element>
<group_by_element> :==
    attribute_name
    | < group_by_element > '.' attribute_name

Attribute_name a FROM gyűjtemény JSON-dokumentumának bármely tulajdonságára hivatkozik.

Lekérdezési eredmények lapozása

A lekérdezésobjektumok példányosítása 100 rekordnál kisebb vagy azzal egyenlő maximális oldalmérettel történik. Több oldal beszerzéséhez hívja meg többször a következőAsTwin metódust Node.js SDK-n vagy GetNextAsTwinAsync a .Net SDK-metóduson. A lekérdezésobjektumok a lekérdezés által igényelt deszerializálási lehetőségtől függően több Next értéket is elérhetővé tehetnek. A lekérdezésobjektumok például ikereszköz- vagy feladatobjektumokat, illetve egyszerű JSON-t adhatnak vissza leképezések használatakor.

Kifejezések és feltételek

Magas szinten egy kifejezés:

  • JSON-típusú példányra (például logikai, szám, sztring, tömb vagy objektum) értékeli ki.
  • Az eszköz JSON-dokumentumából származó adatok és állandók beépített operátorok és függvények használatával történő módosításával definiált.

A feltételek olyan kifejezések, amelyek logikai értékre vannak kiértékelve. A logikai igaztól eltérő állandók hamisnak minősülnek. Ez a szabály null értékű, nem definiált, bármely objektum- vagy tömbpéldányt, bármilyen sztringet és logikai hamis értéket tartalmaz.

A kifejezések szintaxisa a következő:

<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>]+ ']'

A kifejezések szintaxisában szereplő szimbólumok értelmezéséhez tekintse meg az alábbi táblázatot:

Szimbólum Definíció
attribute_name A JSON-dokumentum bármely tulajdonsága a FROM gyűjteményben.
binary_operator Az Operátorok szakaszban felsorolt bináris operátorok .
function_name A Függvények szakaszban felsorolt függvények .
decimal_literal Decimális jelöléssel kifejezett lebegőpontos.
hexadecimal_literal A "0x" sztring által kifejezett szám, amelyet hexadecimális számjegyek sztringje követ.
string_literal Unicode-sztringek, amelyeket nulla vagy több Unicode-karakterből vagy feloldósorozatból álló sorozat jelöl. A sztringkonstansok egy idézőjelek vagy dupla idézőjelek közé vannak zárva. Engedélyezett feloldások: \', \", \\, \uXXXX a négy hexadecimális számjegy által definiált Unicode-karakterekhez.

Operátorok

A következő operátorok támogatottak:

Family (Család) Operátorok
Aritmetikai +, -, *, /, %
Logikai ÉS, VAGY NEM
Összehasonlítás =, !=, <, >, <=, >=, <>

Functions

Ikerpéldányok és feladatok lekérdezésekor az egyetlen támogatott függvény a következő:

Függvény Leírás
IS_DEFINED(tulajdonság) Egy logikai értéket ad vissza, amely azt jelzi, hogy a tulajdonsághoz érték van-e rendelve (beleértve a értéket is null).

Útvonalfeltételek esetén a következő matematikai függvények támogatottak:

Függvény Leírás
ABS(x) A megadott numerikus kifejezés abszolút (pozitív) értékét adja eredményül.
EXP(x) A megadott numerikus kifejezés exponenciális értékét adja vissza (e^x).
POWER(x;y) A megadott kifejezés értékét adja vissza a megadott hatványnak (x^y).
NÉGYZET(x) A megadott numerikus érték négyzetét adja vissza.
MENNYEZET(x) A megadott numerikus kifejezésnél nagyobb vagy egyenlő legkisebb egész számot adja vissza.
PADLÓ(x) A megadott numerikus kifejezésnél kisebb vagy egyenlő legnagyobb egész számot adja eredményül.
SIGN(x) A megadott numerikus kifejezés pozitív (+1), nulla (0) vagy negatív (-1) előjelét adja vissza.
SQRT(x) A megadott numerikus érték négyzetgyökét adja vissza.

Útvonal-feltételek esetén a következő típusellenőrzési és öntési függvények támogatottak:

Függvény Leírás
AS_NUMBER Számmá alakítja a bemeneti sztringet. noop ha a bemenet szám; Undefined ha a sztring nem jelent számot.
IS_ARRAY Logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa tömb-e.
IS_BOOL Logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa logikai-e.
IS_DEFINED Egy logikai értéket ad vissza, amely azt jelzi, hogy a tulajdonsághoz érték van-e rendelve. Ez a függvény csak akkor támogatott, ha az érték primitív típus. A primitív típusok közé tartozik a sztring, a logikai, a numerikus vagy nulla . A DateTime, az objektumtípusok és a tömbök nem támogatottak.
IS_NULL Egy logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa null-e.
IS_NUMBER Logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa szám-e.
IS_OBJECT Logikai értéket ad vissza, amely jelzi, hogy a megadott kifejezés típusa JSON-objektum-e.
IS_PRIMITIVE Logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa primitív -e (sztring, logikai, numerikus vagy null).
IS_STRING Logikai értéket ad vissza, amely azt jelzi, hogy a megadott kifejezés típusa sztring-e.

Útvonalfeltételek esetén a következő sztringfüggvények támogatottak:

Függvény Leírás
CONCAT(x, y, ...) Egy sztringet ad vissza, amely két vagy több sztringérték összefűzésének eredménye.
HOSSZ(x) A megadott sztringkifejezés karaktereinek számát adja vissza.
ALSÓ(x) Sztringkifejezést ad vissza, miután kisbetűssé konvertálta a nagybetűs adatokat.
FELSŐ(x) Sztringkifejezést ad vissza a kisbetűs adatok nagybetűssé konvertálása után.
SUBSTRING(string, start [, length]) Egy sztringkifejezés egy részét adja vissza, amely a megadott karakter nulla-alapú pozíciójától kezdve a megadott hosszig vagy a sztring végéig tart.
INDEX_OF(sztring, töredék) A második sztringkifejezés első előfordulásának kezdőpozícióját adja vissza az első megadott sztringkifejezésben, vagy -1 értéket, ha a sztring nem található.
STARTSWITH(x, y) Egy logikai értéket ad vissza, amely azt jelzi, hogy az első sztringkifejezés a másodikkal kezdődik-e.
ENDSWITH(x, y) Egy logikai értéket ad vissza, amely azt jelzi, hogy az első sztringkifejezés a másodikkal végződik-e.
CONTAINS(x;y) Egy logikai értéket ad vissza, amely azt jelzi, hogy az első sztringkifejezés tartalmazza-e a másodikat.

Példák lekérdezése a szolgáltatás SDK-kkal

C# példa

A lekérdezési funkciót a C# szolgáltatás SDK a RegistryManager osztályban teszi közzé.

Íme egy példa egy egyszerű lekérdezésre:

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
    }
}

A lekérdezési objektum a lekérdezési eredmények lapozási szakaszában említett paraméterekkel lesz példányosítva. Több oldal lekérése a GetNextAsTwinAsync metódusok többszöri meghívásával.

Node.js példa

A lekérdezési funkciót az Azure IoT service SDK Node.js a beállításjegyzék-objektumban teszi közzé.

Íme egy példa egy egyszerű lekérdezésre:

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);

A lekérdezési objektum a lekérdezési eredmények lapozási szakaszában említett paraméterekkel lesz példányosítva. Több oldal lekérése a nextAsTwin metódus többszöri meghívásával.

Következő lépések