Stránka 1 z 4
načtení obsahu http do proměnné
Napsal: 17 led 2018, 18:59
od jiri255
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("°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
Re: načtení obsahu http do proměnné
Napsal: 17 led 2018, 20:52
od martinius96
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.

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.
Re: načtení obsahu http do proměnné
Napsal: 18 led 2018, 16:52
od jiri255
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
}
Re: načtení obsahu http do proměnné
Napsal: 18 led 2018, 19:14
od martinius96
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.
Re: načtení obsahu http do proměnné
Napsal: 18 led 2018, 20:07
od jiri255
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
}
Re: načtení obsahu http do proměnné
Napsal: 18 led 2018, 20:18
od martinius96
Skúste toto poupraviť: client.println("GET /index.html HTTP/1.1");
Možno sa to podarí takto
Re: načtení obsahu http do proměnné
Napsal: 19 led 2018, 19:45
od jiri255
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/ ?
Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 02:46
od martinius96
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á..
Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 09:27
od jiri255
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í

Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 10:48
od zbysek
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?