Arduino schéma - arduino.sk

HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Kompletné projekty s návodom a zdrojovým kódom
Príspevky: 46
Registrovaný: Uto 23. Dec 2014 2:15:50

HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Poslaťod martinius96 » Ned 27. Máj 2018 17:28:04

Ahoj, chcem vám predstaviť useful súborík pre Arduino a Ethernet shield z rodiny Wiznet W5100 - 5500 (mimo W5400).
Sketch je kompatibilný, treba len zmeniť knižnicu pri W5200/W5300/W5500 na Ethernet2.h.
Funkčnosť spočíva v prečítaní správneho riadku prijatej response, je možné čítať ako textové súbory, tak i JSON, či HTML stránku a parsovať si niektorý riadok a ten si následne orezať..
Napr si prečítame príslušný riadok (úloha tohto sketchu): <h1>Dnes: 24°C v lokalite Poprad</h1>
Následne cez C funkciu si môžeme orezať tento riadok na: 24°C
Toto je práve úloha tohto parsera, prečítať riadok, ktorý potrebujeme, najľahšie sa aplikuje na textový súbor, kde je ten riadok presne daný, len ho treba správne vyrátať...
Response vyzerá následovne:
Obrázok
S premennou vieme pracovať veľmi jednoducho, napríklad:
Kód: Vybrať všetko
if(readString=="VYP"){
  Serial.println("Vypnutie spotrebica");
digitalWrite.... LOW;
  }else if(readString=="ZAP"){
  Serial.println("Zapnutie spotrebica");
digitalWrite.... HIGH;
  }

Týmto vieme prakticky ovládať výstupy z internetu na príslušných pinoch. Ethernet shield používa Webclient mód na pripojenie do internetu.
Priložený sketch demonštruje ovládanie ledky ako výstupu z mojej stránky s využitím ovládania hlasom, ktorý pozmení obsah textového súboru, ktorý Arduino periodicky číta. Riešenie používa čítanie 12-teho riadku response: (php5.sk webhosting), napríklad sweb.cz používa 10 riadkovú response.
HTTP parser:
Kód: Vybrať všetko
//Vytvoril: Martin Chlebovec
//Web: https://arduino.php5.sk
#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_sk/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
}

Informáciu, ktorú Arduino číta môžete pozmeniť hlasom na: https://arduino.php5.sk/PHP_sk (funguje pod Chrome).

Ak už aplikujete sketch na váš web a ovládanie nefunguje, chyba bude zrejme v počte riadkov response... poďme si preto ukázať, ako si túto response vyrátať na praktickom obrázku s počítaním riadkov:
Obrázok
Vyrátané číslo zmeníme v kóde na tomto riadku:
Kód: Vybrať všetko
else if (x==12) readString += c; //nasa premenna 12 nahrad svojim riadkom

Viac zaujímavých projektov aj na mojom webe: https://arduino.php5.sk

Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Poslaťod Robo Ulbricht » Str 18. Júl 2018 15:29:46

To nie je práve najuniverzálnejšie riešenie. Treba hľadať reťazec "\r\n\r\n", čo je miesto podľa obrázku, kde sa končí riadok 11 a riadok 12 je prázdny. Všetky ďalšie znaky za týmto reťazcom sú už body správy. Napríklad v ESP8266 to má client implementované vo funkcii find. Možno aj Ethernet má rovnakú funkciu implementovanú.

Príspevky: 46
Registrovaný: Uto 23. Dec 2014 2:15:50

Re: HTTP parser s Ethernet Wiznet W5100/W5200/W5300/W5500

Poslaťod martinius96 » Str 25. Júl 2018 23:35:16

Určite sú lepšie navrhnuté.. Videl som pár príkladov, kde sa používajú readUntil "\r\n\r\n", prípadne from "Content-length", bližšie som to ale neskúmal.
Keď sa mi už toto raz podarilo zbúchať, tak to používam, ale je to ako tikajúca bomba, pretože ak server zmení konfiguráciu, zmení engine, či odinštaluje fast-cgi už nebude sedieť počet riadkov. Takže pri čítaní premenných nastane problém.

Späť na Hotové projekty