Vidíte historickú verziu tejto stránky. Pozrite si aktuálnu verziu.

Porovnať s aktuálnou verziou Zobraziť históriu stránky

« Predchádzajúce Verzia 6 Ďalej »

Koncept univerzálneho API bol  predstavený v kapitole Univerzálne API pre prístup do D2000. Skôr než budú popísané jednotlivé rozhrania REST a Comet API je potrebné v nasledujúcej kapitole popísať spôsob serializácie hodnôt a parametrov, ktorý je pri oboch rozhraniach totožný.

Použiteľnosť jednotlivých API rozhraní

Na otázku prečo Smart Web implementuje dve a nie iba jedno API rozhranie, treba hľadať odpoveď vo vhodnosti použitia jednotlivých API pre rôzne situácie.

D2000 je realtime SCADA systém, ktorý je schopný zaznamenávať zmeny veľkého počtu napr. meraných bodov. Na to aby o týchto zmenách bola notifikovaná aj webová, prípadne iná aplikácia, je potrebné implementovať komunikačnú technológiu typu server-push, kedy server sám notifikuje klienta o zmene hodnoty objektu. V opačnom prípade je nevyhnutné, aby sa klient periodicky v nejakom časovom intervale pýtal servera či nenastali zmeny hodnôt ním sledovaných objektov. Tento spôsob komunikácie je ale veľmi nevýhodný. Pri dlhšom časovom intervale môže nastať situácia, že hodnota objektu sa zmení tesne po odpovedi servera a klient nie je informovaný o tejto hodnote, až kým znova neskontroluje server. Na druhej strane ak je časový interval príliš krátky a hodnota sa mení sporadicky, môže dochádzať úplne zbytočne k značnému plytvaniu komunikačných prostriedkov. Z týchto dôvodov sú situácie kedy komunikačnú technológiu podporujúcu server-push naozaj využijeme. Spôsob server–push komunikácie ale nie je štandardizovaný, a preto bolo potrebné vybrať jednu z existujúcich technológií, ktoré boli k dispozícii. Ideálne takú ktorá bude podporovať robusnú server-push komunikáciu medzi webovou aplikáciou v prehliadači a serverom. Po analýze možností bola vybraná technológia postavená na komunikačnom koncepte Comet implementovanom v robusnej java knižnici Cometd, s dlhou produkčnou históriou a použitím v cloudovom riešení s viac ako 150 000 klientmi.

Smart Web implementuje komunikačný koncept Comet predovšetkým kvôli získavaniu aktuálnych hodnôt a možnosti volať z D2000 aj vzdialené RPC metódy zaregistrované a vykonávané na klientovi. Keďže tieto prípady použitia nie sú vždy pre aplikáciu požadované, je možné použiť implementačne jednoduchšie a štandardizované rozhranie REST API, ktoré je podmnožinou Comet API.

Autentifikácia v jednotlivých API rozhraniach

Ako už bolo spomenuté v kapitole Ďalšie funkcie Smart Web platformy, spôsob autentifikácie jednotlivých rozhraní je rozdielny. REST API so svojou HTTP-BASIC autentifikáciou je skôr určené na komunikáciu pre ne-webových klientov, Comet API neautentifikovaného používateľa presmeruje na prihlasovací formulár (FORM autentifikácia) a preto je toto rozhranie momentálne prirodzene vhodné na komunikáciu webových aplikácii so serverom.

V prípade potreby, vie cez Comet API komunikovať aj iný klient ako web aplikácia. Jedinou požiadavkou je aby bol schopný sa autentifikovať cez poslanie špeciálnej HTTP požiadavky emulujúcej prihlásenie cez prihlasovací formulár. Alternatívnou ale komplikovanejšou možnosťou je zobraziť priamo prihlasovací formulár používateľovi v špeciálnom okne s vnoreným prehliadačom a po úspešnom prihlásení extrahovať autentifikačné cookie pre ďalšie použitie v Comet API.

Serializácia dát medzi klientom a API rozhraniami

Obe rozhrania Comet aj REST API zdieľajú ten istý spôsob serializácie komunikácie prostredníctvom JSON formátu. Výnimku tvorí len volanie SBA RPC metód, ktoré slúžia na posielanie a získavanie binárnych dát z D2000 - v tomto prípade sa dáta posielajú v binárnej forme. JSON formát je univerzálnym formátom implementovaným snáď v každom programovacom jazyku. Jeho výhodou je nielen natívna podpora v každom prehliadači ale aj jednoduchá čitateľnosť človekom, pretože sa jedná o textový formát. Nevýhoda väčšieho objemu správy oproti akémukoľvek binárnemu formátu je minimalizovaná použitím gzip kompresie implicitne podporovanej ako v REST tak aj v Comet API.

Serializácia typu Unival

Základnou jednotkou výmeny dát medzi klientom aj D2000 systémom je typ Unival - zoskupujúci základné atribúty objektov v D2000. Nasledujúci príklad unival hodnoty v JSON formáte, reprezentuje hodnotu typu reálne číslo so stavom Valid.

Príklad zápisu Unival hodnoty
{
  "type": "real",
  "value": 123.456,
  "status": ["Valid"]
}

Každý Unival hodnota má jasne definovaný typ pomocou atribútu type. V prípade posielania Unival hodnôt do D2000 systému atribút type musí byť vždy definovaný. Výnimku tvorí iba možnosť keď namiesto objektového zápisu Unival typu, pošleme priamo hodnotu, v našom prípade 123,456. Tá je Smart Web serverom automaticky konvertovaná na typ "real", keďže sa jedná o hodnotu s desatinnou čiarkou (v prípade poslania reťazca by bol typ nastavený automaticky na hodnotu "text" a celého čísla na hodnotu "int").

Skrátený zápis Unival hodnoty
123.456

Odpoveď zo Smart Web servera, nikdy nechodí v tomto skrátenom zápise, ale v "objektovom" zápise s definovaným typom (atribút type) a hodnotou (atribút value) ak je platná.

Ostatné atribúty nie sú v odpovedi zo Smart Web servera implicitne vrátené kvôli optimalizácii, ale klient si ich vie vyžiadať cez špeciálny atribút returnAs (popísaný nižšie). 

Atribút type môže nadobúdať nasledovné hodnoty:

Hodnota atribútu typePopis typu hodnoty
"nan"žiadna
"bool"typ VBool
"int"celé číslo
"real"reálne číslo
"station"typ VStation
"alarm"typ VAlarm
"process"typ VProcess
"time"celé číslo (počet milisekúnd od epochy)
"timespan"reálne číslo (počet sekúnd)
"text"text
"array"pole objektov D2ApiValue
"qval"typ VQval
"record"dvojrozmerné pole (riadok, stĺpec) hodnôt

Zoznam všetkých atribútov Unival objektu je vypísaný v nasledujúcej tabuľke:

AtribútTyp hodnotyPovinnýPredvolená hodnotaPoznámka
typetextáno

valuepodľa typunie
nenastavený atribút automaticky znamená neplatnú hodnotu, nastavený platnú (ak príznak nie je preťažený v atribúte status)
valueTimecelé číslo (počet milisekúnd od epochy)nieaktuálny časčasová značka
valueTimesdvojrozmerné pole (riadok, stĺpec) celých čísel (počet milisekúnd od epochy)nieaktuálny časčasové značky hodnôt v štruktúre, len pre typ "record"
alarmTimecelé číslo (počet milisekúnd od epochy)nie
časová značka alarmu
alarmTimesdvojrozmerné pole (riadok, stĺpec) celých čísel (počet milisekúnd od epochy)nie
časové značky alarmov v štruktúre, len pre typ "record"
flagspole textov (vymenovaný typ Flag)niežiadny príznakpole uživateľských príznakov, možné hodnoty sú "A""P"
flagsSetsdvojrozmerné pole (riadok, stĺpec) polí textov (vymenovaný typ Flag)niežiadny príznakdvojrozmerné pole polí uživateľských príznakov hodnôt štruktúry, len pre typ "record"
limitStatustext (vymenovaný typ LimitStatus)nie"InLimit"limitný stav, možné hodnoty sú: "InLimit", "VeryLow", "Low", "High", "VeryHigh", "LimitsProblem"
limitStatusesdvojrozmerné pole (riadok, stĺpec) polí textov (vymenovaný typ LimitStatus)nie"InLimit"dvojrozmerné pole limitných stavov hodnôt štruktúry, len pre typ "record"
processAlarmStatustexto (vymenovaný typ ProcessAlarmStatus)nie"NoAlarm"stav alarmu procesu, možné hodnoty sú: "NoAlarm", "ToOn", "ToOff", "On", "Off", "Err", "Oscillate", "ErrCmdOn", "ErrCmdOff", "SwToTrans", "SwToOff", "SwToOn", "SwToErr", "SwTrans", "SwOff", "SwOn", "SwErr", "ErrZalCmdOff", "HL", "VHL", "LL", "VLL", "ToHL", "ToVHL", "ToLL", "ToVLL", "ErrWriteCmd", "Change", "A29", "A30", "A31", "SysPrAl"
processAlarmStatusesdvojrozmerné pole (riadok, stĺpec) polí textov (vymenovaný typ ProcessAlarmStatus)nie"NoAlarm"dvojrozmerné pole stavov alarmu procesov v štruktúre, len pre typ "record"
statuspole textov (vymenovaný typ Status)niepríznak "Valid"pole stavov, možné hodnoty sú: "Valid", "ProcAlarm", "NoAckPAlarm", "PrAlSilent", "Weak", "NoAckValue", "Transient", "Default", "Manual", "AlCrit", "Unknown"
statusSetsdvojrozmerné pole (riadok, stĺpec) polí textov (vymenovaný typ Status)niepríznak "Valid"dvojrozmerné pole stavov hodnôt štruktúry, len pre typ "record"
formattedValuetextnie
v atribúte sa vracia v odpovedi zo servera formátovaná hodnota objektu D2000, nemá význam pri volaniach RPC metód
structTypetextáno
meno štruktúry, len pre typ "record", povinný na každom type "record" posielanom do D2000
definitionobjekt D2RecordDefinition-
definícia Štruktúry, len pre typ "record", nastavený na každej hodnote s typom "record" vracanej z D2000
returnFieldspole textovnieprázdne polešpeciálny atribút definuje dodatočné návratové atribúty požadované klientom od servera, hodnoty sú popísané nižšie
returnTransformationobjekt ReturnTransformationnienulllen pre typ "record" s jedným číselnym stĺpcom a rastúcimi časovými značkami hodnôt, obsahuje konfiguráciu spracovania (downscalingu) časového radu, vykonávanom na serveri pred posielaním odpovede klientovi, kvôli veľkému rozsahu dát, hodnoty sú popísané nižšie

Optimalizácia obsahu vrátenej hodnoty Unival

Kvôli minimalizácii prenášaných dát Unival objekty štandardne na výstupe z D2000 obsahujú len atribút type value (ak je hodnota platná). V prípade potreby ostatných rozširujúcich atribútov hodnoty, ktoré poskytuje systém D2000, je možné pri volaní nastaviť atribút returnFields a v ňom vymenovať požadované atribúty. Hodnota atribútu returnFields má formát poľa textov. Prípustné hodnoty sú v nasledujúcej tabuľke.

Hodnota v poli returnFieldsVypĺňané atribúty v odpovedi zo servera
"AlarmTime"alarmTimealarmTimes
"Flags"flagsflagsSets
"LimitStatus"limitStatuslimitStatuses
"ProcessAlarmStatus"processAlarmStatusprocessAlarmStatuses
"Status"statusstatusSets
"ValueTime"valueTimevalueTimes
"FormattedValue"formattedValue

Implicitná konverzia jednoduchých JSON typov na D2ApiValue

Pre zjednodušenie práce cez API rozhrania je možné ako vstupné hodnoty do systému D2000 používať aj jednoduché typy namiesto objektov typu Unival. Takéto hodnoty majú automaticky nastavený príznak platnosti, čas vzniku na aktuálny čas a ostatné príznaky nadobúdajú ich predvolenú hodnotu.

Typ formátu JSONZodpovedajúci typ UnivalPoznámka
boolean"bool"
number"bool"Ak je cieľový typ v D2000 BOOL. Čísla sú interpretované podľa poradia v type VBool.
number"int"Ak je cieľový typ v D2000 INT. Ak bolo zadané reálne číslo, tak bude zaokrúhlené na celé.
number"real"Ak je cieľový typ v D2000 REAL.
number"time"Ak je cieľový typ v D2000 TIMEPozor: Číslo je interpretované ako počet sekúnd od 1972-01-01 00:00:00 UTC, nie ako počet milisekúnd od epochy.
string"text"

Unival typu štruktúra ("record")

Hodnota typu štruktúra má svoje hodnoty a atribúty uložené ako dvojrozmerné pole (riadok, stĺpec). Hodnoty nadobúrajú typ podľa definície štruktúry v systéme D2000. Nepoužíva rozširujúce atribúty alarmTime, flags, limitStatus, processAlarmStatus, status a valueTime. Namiesto nich používa atribúty alarmTimes, flagsSets, limitStatuses, processAlarmStatuses, statusSets, valueTimes, ktoré sú dvojrozmerným poľom a prvky majú rovnaký typ ako pôvodné atribúty. Ďalšími atribútmi používanými len pri štruktúrach sú definition structType. Atribút definition (objekt D2RecordDefinition) je vždy automaticky nastavený na všetkých štruktúrovaných hodnotách, ktoré vystupujú zo systému D2000. Tento atribút popisuje názvy stĺpcov a ich typy v štrukturovanej premennej. Typy stĺpcov v štruktúre sú zjednodušenou verziou typov Unival.

Typ stĺpcaTyp hodnoty
"bool"typ VBool
"integer"celé číslo
"real"reálne číslo
"time"celé číslo (počet milisekúnd od epochy)
"timespan"reálne číslo (počet sekúnd)
"text"text
"object"podľa typu referencovaného D2000 objektu

Atribút structType je textový a určuje meno objektu D2000 typu definícia štruktúry. Je povinné ho nastaviť pre každú štrukturovanú hodnotu, ktorá vstupuje do systému D2000.

Príklad posielanéj hodnoty typu štruktúra - definícia SD.ArrReal_Text, 2 stĺpce (_int, text), 3 riadky:
{
  "type": "record",
  "structType": "SD.Arr_Real_Text",
  "value": [[1, "One"], [2, "Two"], [3, "Three"]]
}


Príklad vracanej hodnoty typu štruktúra - definícia SD.ArrReal_Text, 2 stĺpce (_int, text), 3 riadky:
{
  "type": "record",
  "definition": {
    "columnTypes": ["integer", "text"],
    "columnNames": ["digit", "name"]
  },
  "value": [[1, "One"], [2, "Two"], [3, "Three"]]
}


  • Žiadne štítky