načtení obsahu http do proměnné

jiri255
Příspěvky: 15
Registrován: 16 led 2018, 18:47
Reputation: 0

načtení obsahu http do proměnné

Příspěvek od jiri255 » 17 led 2018, 18:59

Ahoj,
trápím se už několik dní s problémem a nemůžu nikde nic nalézt a chtěl bych proto požádat o radu. Mám hlavní arduino, které má tuto část kódu pro http stránku.

Kód: Vybrat vše

  //---------------web stranka 
   
    WiFiClient client = server.available(); 
   if (client) { //Připojil se klient? 
               Serial.println("new client"); 
     boolean current_line_is_blank = true; 

    String buffer = ""; 
    while (client.connected()) { 

      if (client.available()) { 
         char c = client.read(); 
          buffer = buffer + c; 

          if (c == '\n' && current_line_is_blank) { 

   client.println("HTTP/1.1 200 OK"); 
   client.println("Content-Type: text/html"); 
   client.println("Connection: close"); 
   client.println(""); //  do not forget this one 
   client.println("<!DOCTYPE HTML>"); 
   client.println("<html>"); 
            client.println("<head>"); 
           client.println("<title>Teplomer Hlavni</title>"); 
           client.println("</head>"); 
                     client.println("<body bgcolor=#f9a46f>"); 
           
   client.println("<h1>TEPLOMER</h1>"); 
   client.print("<h3>Teplota: "); 
   client.print(teplomer1()); 
   client.print("&deg;C");    
    client.print("</h3>");  
    client.print("<br>"); 
   
      //SEM BYCH POTŘEBOVAL DOSTAT OBSAH STRÁNKY 
   client.print("http://192.168.9.25:88/"); 

   client.print("</body>");      
   client.print("<meta http-equiv=\"refresh\" content=\"5\">"); 
     client.println("</html>"); 
            break;    
            } 

         if (c == '\n') { 
           current_line_is_blank = true; 
         } else if (c != '\r') { 
           current_line_is_blank = false; 
         } 

     } 
    } 
             
   delay(20); 
       
            client.stop();      
   Serial.println("Client disconnected"); 
   Serial.println(""); 
   } 
   
   //--------------konec web stranky 
a potřeboval bych do něj doplnit funkci nebo javascript, který by dokázal načíst část obsahu/zdrojového kódu stránky např. mezi <head> a </head> nebo mezi <h1> až </h3> a podobně nebo pokud to nepůjde, tak celou stránku jiného arduina v síti např http://192.168.9.25:88/ a uložit ho jako text do proměnné.
Http stránka toho jiného arduina v síti např. http://192.168.9.25:88/ vypadá takto:

Kód: Vybrat vše

 <!DOCTYPE HTML> 
   <html> 
       <head> 
          <title>Teplomer 2</title> 
          </head>          
   <h1>TEPLOMER 2</h1> 
   <h3>Teplota: 
   22,23°C 
    </h3>  
     Doba behu pristroje: 3dny 11:10:54 
    <br> 
   </h6></body> 
   <meta http-equiv=\"refresh\" content=\"5\"> 
     </html> 
a ve výsledku bych měl v prohlížeči vidět stránku hlavního arduina co je na začátku a v něm část nebo celou stránku toho dalšího arduina v síti
asi takto:
  • TEPLOMER

    24,12 °C

    <!DOCTYPE HTML>
    <html>
    <head>
    <title>Teplomer 2</title>
    </head>
    <h1>TEPLOMER 2</h1>
    <h3>Teplota:
    22,23°C
    </h3>
    Doba behu pristroje: 3dny 11:10:54
    <br>
    </h6></body>
    <meta http-equiv=\"refresh\" content=\"5\">
    </html>
nebo v nejlepším případě jen to co je mezi <h1> až </h3> takže nejlepší výsledek by byl v prohlížeči tento:
  • TEPLOMER

    24,12 °C

    <h1>TEPLOMER 2</h1>
    <h3>Teplota:
    22,23°C
    </h3>
Předem děkuji za pomoc

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

Re: načtení obsahu http do proměnné

Příspěvek od martinius96 » 17 led 2018, 20:52

Dnes som tu nahrával sketch, ktorý vie parsovať riadok, kde môže byť premenná, ktorá niečo robí, porovnáva sa v kóde...
Pre inšpiráciu:

Kód: Vybrat vše

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

void loop(){
if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET /rele/rele1.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=="0"){
  digitalWrite(rele, LOW); 
  }else if(readString=="1"){
  digitalWrite(rele, HIGH);  
    }
    else{
 Serial.println("Nepodporovany stav premennej.");
 }
  
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
} 
Toto ovláda relé, prečíta riadok, kde je premenná, porovná s podmienkami a vyhodnotí sa, sťahuje to z netu, ale prakticky server stačí prepísať s IP vášho druhého Arduina, nastaviť request na .html súbor, ten čítať.. char c vracia celú HTTP hlavičku, teda si viete ľahko spočítať riadky.
Response začína s: HTTP/1.1 200 OK --> to je prvý riadok. Potom na základe ostatnej response počítajte riadky k vášmu riadku.
Obrázek
Upravte si to na riadok, ak to máte usporiadané v riadku, alebo pridajte (prelezte) prijatý string napríklad medzi (> <) možností je niekoľko.

jiri255
Příspěvky: 15
Registrován: 16 led 2018, 18:47
Reputation: 0

Re: načtení obsahu http do proměnné

Příspěvek od jiri255 » 18 led 2018, 16:52

děkuju za pomoc, zkusil jsem to upravit a nahrát do toho hlavního arduina, ale v serial monitoru mi to píše jen pořád dokola "connected"
a nic mi to nezobrazuje můžete mi prosím zkontrolovat, kde bych mohl mít v tom kódu chybu?
Předpokládám, že když to vypisuje "connected", tak že ke spojení s tím arduinem na adrese http://192.168.9.25:88/ došlo?

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xAA, 0xBE, 0xCA, 0x81, 0x7B, 0x4A }; //fyzicka adresa MAC
char serverName[] = "http://192.168.9.25:88/"; // webserver
IPAddress ip(192,168,9,1);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(rele, OUTPUT);
 if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  Serial.begin(115200); 
}

void loop(){
if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET HTTP/1.1"); //download text
    client.println("Host: http://192.168.9.25:88/");
    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==6) readString += c; //TADY KDYZ TO PREPISU NA 6 TAK TO BERE 4 RADEK?  

   } 
  
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
} 

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

Re: načtení obsahu http do proměnné

Příspěvek od martinius96 » 18 led 2018, 19:14

Na server ako taký sa pripojí ale na čo urobiť GET.. Ja by som to trošku pozmenil na:

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xAA, 0xBE, 0xCA, 0x81, 0x7B, 0x4A }; //fyzicka adresa MAC
char serverName[] = "http://192.168.9.25:88"; // webserver
IPAddress ip(192,168,9,1);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(rele, OUTPUT);
 if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  Serial.begin(115200); 
}

void loop(){
if (client.connect(serverName, 80)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET / HTTP/1.1"); //download text
    client.println("Host: http://192.168.9.25:88");
    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==6) readString += c; //TADY KDYZ TO PREPISU NA 6 TAK TO BERE 4 RADEK?  

   } 
  
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
} 
Keď sa priamo napojí už na ten server (webstránku) tak sa vždy musí vrátiť i jej obsah.. Starosti mi robí i port, ktorý ste tam dali, pretože v kroku:
if (client.connect(serverName, 80)) { sa pripájame na port 80 (HTTP). Keď chcete iný port (8880, 88 alebo iný), tak to zmeňte tam, do adresy servera by som to nepísal.. Skúste upraviť ten port a vyskúšať aj s tým sketchom, ktorý ste poslali ako upravený.. S jednou variantou to pôjde.

jiri255
Příspěvky: 15
Registrován: 16 led 2018, 18:47
Reputation: 0

Re: načtení obsahu http do proměnné

Příspěvek od jiri255 » 18 led 2018, 20:07

tak jsem to ještě upravil viz níže a doplnil o další serial.print, abych věděl co se děje, ale stále dostávám jen "conected" pak "http" pak "zobrazeni http" ,ale žádný obsah stránky. Ta stránka "http://192.168.9.25" je dostupná a v prohlížeči ji vidím.

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xAA, 0xBE, 0xCA, 0x81, 0x7B, 0x4A }; //fyzicka adresa MAC
char serverName[] = "http://192.168.9.25"; // webserver
IPAddress ip(192,168,9,1);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(rele, OUTPUT);
 if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  Serial.begin(115200); 
}

void loop(){
if (client.connect(serverName, 88)) {  //starts client connection, checks for connection
    Serial.println("connected");
    client.println("GET / HTTP/1.1"); //download text
    client.println("Host: http://192.168.9.25");
    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();
  }
   Serial.println("http");
  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==6) readString += c; //TADY KDYZ TO PREPISU NA 6 TAK TO BERE 4 RADEK?  

   } 
     Serial.println("zobrazeni http");
  readString = ("");
  x=0;
  client.stop(); //ukonc spojenie
  delay(5000); //pockaj 5s a vykonaj novu slucku loop
}

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

Re: načtení obsahu http do proměnné

Příspěvek od martinius96 » 18 led 2018, 20:18

Skúste toto poupraviť: client.println("GET /index.html HTTP/1.1");
Možno sa to podarí takto

jiri255
Příspěvky: 15
Registrován: 16 led 2018, 18:47
Reputation: 0

Re: načtení obsahu http do proměnné

Příspěvek od jiri255 » 19 led 2018, 19:45

tak to nepomohlo a stále to ukazuje jen ty serial printy, ale žádný obsah stránky. Napadá mě možná jestli není problém v tom, že já vlastně nemám tu html stránku v žádném souboru třeba to index.html, ale je to vlastně součást kódu na tom arduinu http://192.168.9.25/ ?

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

Re: načtení obsahu http do proměnné

Příspěvek od martinius96 » 20 led 2018, 02:46

To bude ten problém, že tam nie je tá html stránka, ale je to priamo na tom odkaze..
jedine ma napadá dať ako server http://192.168.9.25 (bez lomítka na konci)
A potom client.println("GET / HTTP/1.1");
Jedine takto ma to napadá..

jiri255
Příspěvky: 15
Registrován: 16 led 2018, 18:47
Reputation: 0

Re: načtení obsahu http do proměnné

Příspěvek od jiri255 » 20 led 2018, 09:27

když smažu lomítko, tak mi to začne hlásit, že "připojení neúspěšné", takže možná tohle asi potřebuje tahat data z nějakého souboru třeba
client.println("GET /něco.html HTTP/1.1");
Hledal jsem nějaké příklady na to client println get a našel jsem pár podobných kódů, ale všechny tam mají nějaký soubor a bez toho
nic nezobrazí :-(

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18
Reputation: 0

Re: načtení obsahu http do proměnné

Příspěvek od zbysek » 20 led 2018, 10:48

Ještě zkuste řádek

Kód: Vybrat vše

client.println("Host: http://192.168.9.25");
změnit na

Kód: Vybrat vše

client.println("Host: 192.168.9.25");
HTTP je určené už tím, že používáte port 80 (na něm http komunikuje).

Chápu to dobře, že máte dvě Arduina - jedno poskytuje data a druhé je přes HTTP čte?

Odpovědět

Kdo je online

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