HTTP parser s Ethernet Wiznet W5100

Tvoříte zajímavý projekt? Pochlubte se s ním.
Pravidla fóra
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Odpovědět
martinius96
Příspěvky: 405
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

HTTP parser s Ethernet Wiznet W5100

Příspěvek od martinius96 » 05 led 2018, 15:53

Ahojte, tak sa mi konečne podaril parser pre Ethernet shield, ktorý dokáže z celej prijatej HTTP hlavičky vytiahnuť premennú, ktorá je uložená v Json súbore, alebo textovom súbore. Rád by som sa s vami podelil o výsledok. Parser bol skúšaný na jednoriadkovú premennú, na viacriadkovom súbore nebude fungovať, nakoľko je nastavený fixný riadok prijatej response na parsovanie.
Obrázek
S premennou je možné následne pracovať ako s textom, dá sa jednoducho porovnávať cez operátor == s jednoduchým if/else statementom pre vykonanie akcie.

Kód: Vybrat vše

if(readString=="VYP"){
  Serial.println("Vypnutie spotrebica");
  }else if(readString=="ZAP"){
  Serial.println("Zapnutie spotrebica");
  }
Využitie napríklad pre ovládanie výstupov z internetu, toto riešenie je Webclient mód.

Sketch môže a nemusí fungovať pri všetkých správne. Je to z dôvodu nastavenia počtu riadkov prijatej response na konkrétne číslo. Response sa môže líšiť v závislosti od hostingu a od webservera, ktorý môže vracať rôzny počet riadkov HTTP hlavičky, ktorá môže byť "obohatená" o doplnkové hlavičky, hlavičky sa líšia aj v závislosti od enginu stránky, napríklad nginx, Apache atď. Testovaná hlavička bola na serveri php5.sk.
Nezabúdajte, že toto funguje iba na HTTP stránkach. S Ethernet shieldom W5100 sa na HTTPS stránku nepripojíte.

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>
int led = 6;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //fyzicka adresa MAC
char serverName[] = "www.arduino.php5.sk"; // webserver
IPAddress ip(192, 168, 2, 40);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(led, OUTPUT);
 if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  Serial.begin(9600); 
}

void loop(){
if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET /PHP_cz/preklady.txt HTTP/1.1"); //download text
    client.println("Host: www.arduino.php5.sk");
    client.println("Connection: close");  //close 1.1 persistent connection  
    client.println(); //end of get request
  } 
  else {
    Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
    Serial.println();
  }

  while(client.connected() && !client.available()) delay(1); //cakaj na data
  while (client.connected() || client.available()) { //pramenna
    char c = client.read(); //dostan bity z buffera
    Serial.print(c); //cela http hlavicka
    if (c==lf) x=(x+1); //pocitaj 
    else if (x==12) readString += c; //nasa premenna

   } 
if(readString=="Zapni"){
  digitalWrite(led, HIGH); 
  }else if(readString=="Vypni"){
  digitalWrite(led, LOW);  
    }
    else{
 Serial.println("Nepodporovana premenna.");
 }
  
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
} 

Vzorový sketch funguje, je univerzálny pre tento demo kód. Upravte si ho podľa potreby pre váš projekt.
Zmeniť výstup servera do súboru môžete hlasom/textom na: https://arduino.php5.sk/PHP_cz/ - používajte Google Chrome pre zadávanie hlasom.
Podporované príkazy:
  • Zapni všechno/Zapni/Zapni vše/Zapnout/Zapnout vše/Zapnout všechno
  • Vypni všechno/Vypni/Vypni vše/Vypnout/Vypnout vše/Vypnoutvšechno

martinius96
Příspěvky: 405
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: HTTP parser s Ethernet Wiznet W5100

Příspěvek od martinius96 » 20 dub 2018, 01:06

Ako správne vyrátať premennú čítanú zo svojho webu?
V prvom rade urobíme response na textový súbor/iný (PHP/HTML/JSON). Výsledkom je niekoľko riadkov kódu a konkrétny riadok vieme prečítať následovne:
Obrázek
Jednoducho spočítame riadky v prijatej response a túto hodnotu nastavíme do kódu. Ako vidíte, počítame po premennú (riadok premennej sa už neráta!)
Toto číslo následne dosadíme do Arduino kódu do parametra:

Kód: Vybrat vše

else if (x==12) readString += c; //nasa premenna 12 nahrad svojim riadkom
Výsledkom je možnosť porovnať string "VYP"/"ZAP" s podmienkou pre vykonanie akcie. Obsah textového súboru sa môže meniť napríklad cez PHP kód na ktorý robí Arduino request.
Riešenie je použiteľné ako s knižnicou Ethernet.h ta i s Ethernet2.h, takže prakticky pre celú rodinu Ethernet modulov a shieldov Wiznet.

martinius96
Příspěvky: 405
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: HTTP parser s Ethernet Wiznet W5100

Příspěvek od martinius96 » 10 pro 2018, 22:33

Tento tutoriál by som rád ešte rozšíril o jednu vec.
V prípade, že sa tento parser bude používať na .php súbor, ktorý má v sebe jednoduché echo (výpis) premennej, je nutné použiť hlavičku HTTP 1.0 a nie 1.1. Pri verzii 1.1 sa vracia hlavička s parametrom chunk encoding.
Napríklad text:

Kód: Vybrat vše

Wikipedia in

chunks.

Príde v HTTP hlavičke reprezentovaný ako:

Kód: Vybrat vše

4\r\n
Wiki\r\n
5\r\n
pedia\r\n
E\r\n
 in\r\n
\r\n
chunks.\r\n
0\r\n
\r\n
Pri čítaní premennej z .php súboru je nutné použiť hlavičku HTTP 1.0, pri čítaní .txt súboru je možné ponechať HTTP 1.1, tu sa chunk encoding neaplikuje. Platí pre Arduino i ESP dosky.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host