FULL-C sharing

Z onlinetechnology.cz

Přejít na: navigace, hledání
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Obsah

Sdílené proměnné

Často nestačí mít "jenom" program spuštěný v zařízení SDS, ale je také potřeba ho na dálku řídit (nebo jenom čas od času mu "změnit nastavení" bez nutnosti nahrávat upravený program znovu). Současně je potřeba program i sledovat.

Nejčastěji se používá webová stránka, která je nahraná spolu s FULL-C programem v zařízení SDS, a která periodicky získává hodnoty sdílených proměnných z programu, a vhodně je zobrazuje. Současně je možné (na té samé stránce) poskytnout uživateli možnost hodnoty i měnit.

Podporované typy sdílených proměnných:

typ položky               rozsah           celková velikost
-----------------------+----------------+----------------------------------
  signed   integer     |  -2^31..+2^31  |  4 BYTES
  unsigned integer     |      0..+2^32  |  4 BYTES
  IP address           |  uchar[4]      |  4 BYTES
  float                |  IEEE-754      |  4 BYTES 
  string (text)        |   char[n]      |  1..n BYTES
  binary array         |  uchar[n]      |  1..n BYTES

POZOR - proměnné o velikosti 64-bit nelze v této verzi firmware sdílet. Podporovány jsou POUZE proměnné maximálně 32-bit široké (viz tabulka výše).


Identifikace sdílených proměnných ve FULL-C programu

Ve vašem programu musíte deklarovat specifické proměnné, které budou přístupné "z venku". Toto je zde z bezpečnostních důvodů, protože tak má autor programu plnou kontrolu nad tím, které proměnné bude možnost měnit a které ne.

Názvy sdílených proměnných jsou právě tím klíčem, který určuje, zda-li je proměnné "sdílená" (přístupná) nebo ne.

SDÍLENÁ PROMĚNNÁ: název je složen vždy z jednoho znaku a dvou čísel.

Příklad:

signed long   S00;
unsigned long U00;
float         F00;
char          T00[32];

Samozřejmě číselná hodnota je od "00" do "99" (decimální hodnota).

unsigned long U23;
char          T11[8];

Vnější přístup - změna

Přistupuje se přes webové rozhraní zařízení SDS.

192.168.1.250/sv?S00=-123&U02=1000&T00=hello

Uvedený příklad způsobí toto: současně budou nastaveny: proměnná S00 na -123, proměnná U02 na 1000 a proměnné T00 na "hello" (zbytek pole nastaven na 0x00).

Jak lze vidět, lze současně měnit jedno nebo více proměnných.

Skladba volání:

192.168.1.250 / sv            ? U01       = 1        & S02       = 2 

IP_nebo_DNS   / název_příkazu ? proměnná1 = hodnota1 & proměnná2 = hodnota2 . . .

Jednotlivé páry (proměnná+hodnota) jsou od sebe odděleny znakem '&', přičemž tento znak se nedává za posledná pár (pouze mezi páry).


Vnější přístup - zabezpečení

Zápis lze omezit - pokud provedete nastavení, pouze přihlášení uživatelé budou moct zapisovat do sdílených proměnných.

Záleží na nastavení hodnoty indexu 150: použijte sds_set_u(150, hodnota); kde hodnota je nula pro neomezený přístup (zápis a čtení i bez přihlášení), nebo jakékoliv nenulové číslo (potom je zápis omezen pouze pro přihlášené uživatele).


Příklad programu

FULL-C program není automaticky informován o tom, že došlo ke změně. Musí si ji a) buď detekovat sám nebo b) využít jednu z proměnných jako indikátoru změny.

 // toto je ukazka sdilenych promennych
 // >>> 192.168.1.250/sv?U00=1234
 
 unsigned long U00;
 
 void main(void)
 {
   unsigned long old_U00;
 
   // start - nastav vychozi hodnoty
   U00 = 0;
   old_U00 = U00;
 
   // nekonecna smycka - zobrazit zmeny prichazejici "z venku"
   for (;;)
   {
     // cekam na zmenu "z venku"
     while (U00 == old_U00)
     {
       ;  // nedoslo ke zmene, cekam
     }
     // doslo ke zmene, ulozim si hodnotu
     old_U00 = U00;
     // a napisu novou do echo.html
     printf("nova hodnota U00 je %u \n", U00);
   }
 }

Tento vzorovy program je dostatečně zřejmý, a ukazuje variantu kdy se čeká na změnu proměnné.


Samozřejmě lze to i jinak, pokud si jednu ze sdílených proměnných vyhradíme jako indikátor změny, a nastavíme ji vždy současné se změnou jiné proměnné.

 // toto je ukazka sdilenych promennych (U00 - indikator zmeny) (S23 - aktualni promenna)
 // >>> 192.168.1.250/sv?U00=1&S23=-1234
 
 unsigned long U00;
 signed long S23;
 
 void main(void)
 {
 
   // start - nastav vychozi hodnoty
   U00 = 0;
   S23 = 0;
 
   // nekonecna smycka - zobrazit zmeny prichazejici "z venku"
   for (;;)
   {
     // cekam na zmenu "z venku"
     while (U00 != 1)
     {
       ;  // nedoslo ke zmene, cekam
     }
     // vynuluju flag at muzu znovu reagovat pri pristi zmene
     U00 = 0;
 
     // a napisu novou do echo.html
     printf("nova hodnota S23 je %d \n", S23);
   }
 }

Jak je vidět, vyhrazena byla proměnná U00, která když se nastaví "z venku" do 1, tak je to (v tomto příkladu) indikace že S23 má novou hodnotu.

Pozor - oba příklady způsobí zablokování vykonávání programu na "while" smyčce. Jedná se samozřejmě o příklady, přičemž ve skutečném programu to bude potřeba udělat jinak; tak aby k zablokování činnosti zbytku programu nedošlo. Jde to samozřejmě snadno, viz další příklad.


 // toto je ukazka sdilenych promennych
 // >>> 192.168.1.250/sv?U00=1234
 
 unsigned long U00;
 
 void main(void)
 {
   unsigned long old_U00;
 
   // start - nastav vychozi hodnoty
   U00 = 0;
   old_U00 = U00;
 
   // nekonecna smycka - program
   for (;;)
   {
 
     //... delam neco jiheho ...
 
     // otestujina zmenu "z venku"
     if (U00 != old_U00)
     {
       // doslo ke zmene, ulozim si hodnotu
       old_U00 = U00;
       // a napisu novou do echo.html
       printf("nova hodnota U00 je %u \n", U00);
     }
 
     //... delej neco dalsiho ...
 
   }
 }


Vnější přístup - čtení sdílených proměnných

Sdílené proměnné lze i číst, stačí poslat správný dotaz do zařízení SDS, a odpovědí je buď XML soubor nebo textová delimitovaná odpověď - obojí s očekávaným obsahem.

Základem je použití shared.txt souboru = tento soubor obsahuje výpis VŠECH sdílených proměnných, které jsou v programu zavedeny.

Příklad obsahu XML souboru pro program, který definuje proměnné T00 a U24:

 et|1421594413|ut|528|T00|text|U24|1895647|

Stavba textu v odpovědi je následující - zde je pro názornost položku za položkou vysvětlen příklad uvedený o řádek výše:

 položka (zleva doprava)   obsah
-------------------------+---------------------------------------
 et                      | (speciální) název následující položky (bude to EpochTime hodnota)
 znak '|' (svislítko)    | oddělovač položek (pozor ať jej nepoužijete vy v hodnotách Txx)
 1421594413              | EpochTime v okamžiku generování odpovědi (lze použít pro vyloučení starých hodnot v cache prohlížeče)
 znak '|' (svislítko)    | oddělovač položek
 ut                      | (speciální) název následující položky (bude to UpTime hodnota)
 znak '|' (svislítko)    | oddělovač položek (pozor ať jej nepoužijete vy v hodnotách Txx)
 528                     | UpTime v okamžiku generování odpovědi (lze použít pro vyloučení starých hodnot v cache prohlížeče)
 znak '|' (svislítko)    | oddělovač položek
 T00                     | název proměnné, která bude mít následně vypsán svůj obsah
 znak '|' (svislítko)    | oddělovač položek
 text                    | aktuální obsah T00
 znak '|' (svislítko)    | oddělovač položek
 U24                     | název proměnné, která bude mít následně vypsán svůj obsah
 znak '|' (svislítko)    | oddělovač položek
 1895647                 | aktuální obsah U24
 znak '|' (svislítko)    | oddělovač položek (je umístěn i na konci)

Pozor na používání znaku svislítka v proměnných Txx, takový znak v obsahu Txx samozřejmě znemožní zpracování této odpovědi.

Hodnota EpochTime určuje počet vteřin od 1.1.1970 (pokud má konkrétní zařízení SDS k dispozici NTP server). Hodnota UpTime určuje čas od zapnutí zařízení (kdy to bylo nastaveno na nulu) v milisekundách.


Pokud obdržíte následující specifickou odpověď (NOSV):

 et|1421594413|ut|528|NOSV|0|

pak to znamená, že a) buď není v zařízení nahraný FULL-C program nebo b) nahraný program nepoužívá sdílené proměnné.


Druhou možností je použití shared.xml souboru = tento soubor obsahuje výpis VŠECH sdílených proměnných, které jsou v programu zavedeny.

Příklad obsahu XML souboru pro program, který definuje proměnné T00 a U24:

 <?xml version="1.0" encoding="UTF-8"?>
 <FULL-C>
 
  <et>1421594413</et>
  <ut>528</ut>
 
  <sv>
   <n>T00</n>
   <v>text</v>
  </sv>
 
  <sv>
   <n>U24</n>
   <v>1895647</v>
  </sv>
 
 </FULL-C> 


Vnější přístup - protokol S-UDP

Ke všem sdíleným proměnným lze zabezpečeným a rychlým způsobem přistupovat i prostřednictvím S-UDP protokolu. Rychlost je dána použitím UDP protokolu pro přenos dat, zabezpečení je provedeno symetrickou šifrou.

Více informací viz SUDP Protokol.

Osobní nástroje
Translate