FULL-C http get

Z onlinetechnology.cz

Verze z 4. 8. 2019, 08:01; Adamn (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
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

Síťové funkce: dotaz na přidělenou IP adresu pro DNS jméno

Zařízení SDS umožňuje odeslat HTTP-GET dotaz na zvolený HTTP server. FULL-C program určuje cílový server (IP adresu a Host název), a současně určuje obsah (Body) v dotazu.

Za tímto účelem jsou k dispozici tyto dvě funkce:

         void http_get(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int Port, char *HostName, char *GETtext, void *ReceiveDataBuffer, unsigned int MaximalReceiveDataLength);
 unsigned int http_get_status(unsigned int *httpResponseValue, unsigned int *receivedDataSize);

Princip

SDS po zavolání funkce http_get() se SDS spojí s webovým serverem na zadané IP adrese a předá tomuto serveru GET požadavek. Odpověď je pak v SDS zpracována a předána FULL-C programu.

Pro kontrolu průběhu a úspěchu či chyby, je k dispozici funkce http_get_status().

Funkce http_get() se typicky kombinuje s funkcí dns_resolv(), kdy jako uživatel pouze znáte HostName, a potřebujete nejprve získat aktuální hodnotu IP adresu serveru, před zavoláním http_get().

Příklad #1

V tomto příkladu komunikuje SDS s webovým serverem na adrese 192.168.1.110 na TCP portu 80, a pokud se vše povede, tak vypíše do konzole i přijatou odpověď (o délce MaximalReceiveDataLength bajtů).

void main(void)
{
 unsigned int status;
 unsigned int MaximalReceiveDataLength;
 unsigned char * ReceiveDataBuffer;
 unsigned int httpResponseValue;
 unsigned int receivedDataSize;
 
 printf("START \n");
 
 // kolik nejvice budeme chtit ?
 MaximalReceiveDataLength = 128;
 
 // ziskame docasnou pamet pro uchovani obsahu
 ReceiveDataBuffer = (unsigned char *)malloc(MaximalReceiveDataLength);
 
 // mame pridelenou pamet ?
 if (ReceiveDataBuffer == 0)
 {
   printf(" out of memory ");
   return;
 }
 
 // go
 printf("calling http_get...\n");
 http_get(192,168,1,110, 80, "www.hostname.cz", "/index.htm", (void *)ReceiveDataBuffer, MaximalReceiveDataLength);
 
 // wait for the result
 status = http_get_status(&httpResponseValue, &receivedDataSize);
 while (status == 1023)
 {
   status = http_get_status(&httpResponseValue, &receivedDataSize);
 }
 
 // zpracujeme vysledek
 if (status == 1024)
 {
    // v poradku provedeno
    printf("DONE OK.  HTTP RESPSTAT = %u    receivedDataSize = %u\n", httpResponseValue, receivedDataSize);
 
    // a muzeme zpracovat prijate data (body) v odpovedi na http-get
    if (receivedDataSize > 0)
    {
      // v tomto prikladu predpokladame ze odpoved je ciste textova
      // takze pouzijeme primo printf() pro vypis do konzole
      printf("%s", (char *)ReceiveDataBuffer);
    }
 } else
 {
    // status != 1024
    printf("FAILED. error code = %u \n", status);
 }
 
 // nakonec
 free(ReceiveDataBuffer); ReceiveDataBuffer = 0;
 
}

Příklad #2

V tomto příkladu komunikuje SDS s webovým serverem na adrese 192.168.1.110 na TCP portu 80, a ignoruje datový obsah odpovědi serveru.

void main(void)
{
 unsigned int status;
 unsigned int httpResponseValue;
 
 printf("START \n");
 
 // go
 printf("calling http_get...\n");
 http_get(192,168,1,110, 80, "www.hostname.cz", "/index.htm", (void *)0, 0);
 
 // wait for the result
 status = http_get_status(&httpResponseValue, 0);
 while (status == 1023)
 {
   status = http_get_status(&httpResponseValue, 0);
 }
 
 // zpracujeme vysledek
 if (status == 1024)
 {
    // v poradku provedeno
    printf("DONE OK.  HTTP RESPSTAT = %u \n", httpResponseValue);
 
 } else
 {
    // status != 1024
    printf("FAILED. error code = %u \n", status);
 }
 
}


Stavové hodnoty

Program musí použít volání funkce http_get_status() pro zjištění okamžitého stavu.

 http_get_status()          význam
-------------------------+-----------------------------------------------------------------------
 0                       |  klid, žádná akce nebyla zahájena
 1023                    |  právě probíhá požadovaná činnost, čekejte
 1024                    |  úspěsně provedeno (HTTP GET dotaz odeslán na server, a byla obdržena odpověď)
 1025                    |  nelze se připojit k serveru (činnost neprovedena)
 1026                    |  timeout (nepovedlo se provést činnost v určeném čase, limit je 45 vteřin)
 1027                    |  server předčasně ukončil spojení (nemáme odpověď, dotaz se zřejmě také nepovedlo předat)
 1028                    |  byly přijaty neplatné data v odpovědi ze serveru (neznáme odpověď)
 1029                    |  pokoušíte se poslat další dotaz, zatímco ten předchozí ještě nebyl dokončen (takže ten nový je ignorován a není proveden)
 1030                    |  zařízení SDS nemá platnou IP adresu (připojení k serveru neprovedeno, činnost neprovedena)
 1031                    |  zařízení SDS nemá funkční Ethernet (vytáhnutý kabel, vypnutý switch) (cinnost neprovedena)
 1032                    |  funkce byla zavolána s neplatnými parametry (činnost neprovedena)
Osobní nástroje
Translate