Stránka 2 z 4
Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 12:46
od jiri255
tak jsem našel kód, který jsem trochu poupravil a teď mi stáhne stránku a uloží ji do proměnné "c"
ještě jsem si tam doplnil substring, který mi zobrazí jen část té stránky co potřebuju jenže to není úplně
ideální.
Nevěděl by někdo, jak ten substring upravit, aby mi zobrazil data podle nalezených znaků?
Tedy konkrétně "zobraz text mezi <h1> a </h1> a ještě text mezi <h3> a </h3>?
Teď mi to zobrazuje toto:
<h1>TEPLOMER 2</h1>
<h3>Teplota: 22.37
Kód: Vybrat vše
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 9, 10 };
byte gateway[] = { 192, 168, 9, 1 };
byte mask[] = { 255, 255, 255, 0 };
byte root[] = { 192, 168, 9, 25 }; //stranku jsem zmenil na tu svoji
Client client(root, 88); //port jsem zmenil na ten svuj
void setup()
{
Ethernet.begin(mac, ip, gateway, mask);
Serial.begin(115200);
delay(1000);
Serial.println("connecting...");
}
void loop ()
{
if (client.connect()) {
Serial.println("connected");
client.println("GET / HTTP/1.1");
client.println("Host: http://192.168.9.25/"); //zde jsem doplnil ip toho podružného zarizeni
client.println("Connection: Close");
client.println();
} else {
Serial.println("connection failed");
}
if (client.available()) {
char c = client.read();
Serial.print(c);
//---------zde sem si doplnil substring
String z = c; //dostan bity z buffera
String vstupni_text = z;
String vystup;
vystup = vstupni_text.substring(96,137); // vystup bude od 96 do 137 znaku
Serial.println(vystup);
//----------konec substringu
client.stop();
}
delay(8000);
}
tam po té úpravě mi to také nezobrazovalo nic jiného než ty serial printy
Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 19:07
od martinius96
Najľahšie je počítať riadky a vypísať si riadok a potom zo stringu odrezať <h1> na začiatku a </h1> na konci... Ten sketch, ktorý som tu dával to vie.. Vie prečítať 13. riadok.. Dá sa to jednoducho premennou upraviť. Riešil by som to asi tak, keď sa web nebude meniť atď..
Potom sa dá ešte čítať od/do napr čítanie prebieha po \n (nový riadok) a \r (ukončovací znak riadka) Ak som to nepomýlil, je to takto

A tam by bolo treba urobiť funkciu, že bude čítať od <h1> čítaj tu obsah..... po </h1>
Re: načtení obsahu http do proměnné
Napsal: 20 led 2018, 22:04
od martinius96
Prípadne Jirko, pošli výpis serial monitoru, ja ti to nastavím na riadok napr.
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 13:31
od jiri255
děkuji moc

....ten substring je asi zatím vyhovující, zobrazí data od znaku po znak
Kód: Vybrat vše
//---------zde sem si doplnil substring
String z = c; //dostan bity z buffera
String vstupni_text = z;
String vystup;
vystup = vstupni_text.substring(96,137); // vystup bude od 96 do 137 znaku
Serial.println(vystup);
//----------konec substringu
takže výstup v serial print vypadá takto, což je asi zatím ok:
<h1>TEPLOMER 2</h1>
<h3>Teplota: 22,23°C </h3>
nenašel jsem žádné příklady, jak ten substring upravit, aby zobrazil data od znaku třeba <h1> do znaku </h1>
a sám nějakou takovou funkci nebo ten substring napsat nedokážu.
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 14:14
od SkullKeep
Co takhle:
Kód: Vybrat vše
vystup = vystup.substring(3,vystup.length()-5);
A to by mělo osekat toto:
<h1>TEPLOMER 2</h1>
na :
TEPLOMER 2
Jestli se mýlím tak upravit začátek a konec délky osekání textu.
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 14:28
od martinius96
Jo, SkullKeep to napísal dobre. Rovnako si upravíš aj druhý a bude to fungovať dobre, aj keď napr teplota klesne pod dvojciferné číslo, lebo zo stringu odrežeš spredu a zozadu len <h3> a </h3> + ešte znaky textu aby ti ostalo iba číslo.
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 18:08
od jiri255
díky vám za radu, tohle pracuje dobře... vyhraju si s tím, aby to ořezávalo správně
Ještě se teď snažím ten funkční kód dostat do nodemcu, protože by to pro mě bylo lepší než to mít napojené kabelem,
ale i když jsem změnil knihovny, tak se mi to nedaří na nodemcu nahrát a rozjet, ještě budu chvílu laborovat... stáhl
jsem i nějaké 2 kódy, které by to stejné měli umět na nodemcu, tak snad se mi některý z nich podaří rozchodit...
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 18:19
od martinius96
Na HTTP spojenie na NodeMCU využívam tento koncept, ktorý mi aj vracia čítanú premennú, používam to na čítanie .txt súborov, malo by to vypísať celý obsah, potom to už len nejak "orezat"
Kód: Vybrat vše
#include <ESP8266WiFi.h>
const char* ssid = "your-ssid";
const char* password = "your-password";
const char* host = "server.sk";
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Pripajam sa na: ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); //klientsky mod
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi pripojene");
Serial.println("IP adresa: ");
Serial.println(WiFi.localIP());
}
void loop() {
delay(5000);
Serial.print("Pripajam sa na web");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80; //port
if (!client.connect(host, httpPort)) {
Serial.println("pripojenie neuspesne");
return;
}
// We now create a URI for the request
String url = "/"; // za / napr index.html .. atď podla potreby
Serial.print("request na url: ");
Serial.println(url);
// Request na samostny server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client timeout!");
client.stop();
return;
}
}
while(client.available()){
String line = client.readStringUntil('\r'); //citaj po
Serial.println(line); //nasa premenna
}
Serial.println();
Serial.println("zatvaram spojenie");
}
Ešte trošku pozmenena varianta..
Kód: Vybrat vše
#include <ESP8266WiFi.h>
const char* ssid = "your-ssid";
const char* password = "your-password";
const char* host = "server.sk";
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Pripajam sa na: ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); //klientsky mod
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi pripojene");
Serial.println("IP adresa: ");
Serial.println(WiFi.localIP());
}
void loop() {
delay(5000);
Serial.print("Pripajam sa na web");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80; //port
if (!client.connect(host, httpPort)) {
Serial.println("pripojenie neuspesne");
return;
}
// We now create a URI for the request
String url = "/"; // za / napr index.html .. atď podla potreby
Serial.print("request na url: ");
Serial.println(url);
// Request na samostny server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String line = client.readStringUntil('\n');
Serial.println(line); //nasa premenna
Serial.println();
Serial.println("zatvaram spojenie");
delay(5000);
}
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 18:49
od jiri255
díky za ty kódy odzkoušel jsem ten druhý, ale asi mám zase někde chybu jako prve, protože se připojím k wifi
ukáže mi to ip adresu a pak se zaseknu na tom řádku "pripojenie neuspesne" a toci se to porad dokola.
Můžu ještě poprosit o kontrolu kódu
Kód: Vybrat vše
#include <ESP8266WiFi.h>
const char* ssid = "moje wifi";
const char* password = "moje heslo";
const char* host = "http://192.168.9.25/"; //tady jsem zkousel 192.168.9.25 i bez lomítka i s portem a lomítkem i bez lomítka a nic
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Pripajam sa na: ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); //klientsky mod
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi pripojene");
Serial.println("IP adresa: ");
Serial.println(WiFi.localIP());
}
void loop() {
delay(5000);
Serial.println("Pripajam sa na web");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 88; //port
if (!client.connect(host, httpPort)) {
Serial.println("pripojenie neuspesne");
return;
}
// We now create a URI for the request
String url = "http://192.168.9.25/"; // za / napr index.html .. atď podla potreby
Serial.print("request na url: ");
Serial.println(url);
// Request na samostny server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String line = client.readStringUntil('\n');
Serial.println(line); //nasa premenna
Serial.println();
Serial.println("zatvaram spojenie");
delay(5000);
}
Re: načtení obsahu http do proměnné
Napsal: 21 led 2018, 18:58
od martinius96
Máš zle tento riadok..
String url = "
http://192.168.9.25/";
Najprv sa pripojíme na server (host)
http://192.168.9.25/ (možno by som hosta zapísal bez / a http.. nie som si isty. )
url je už za adresou servera (hosta, na ktoreho sme sa pripojili), teda do String url = "/";
Pristupujeme na server bez suboru/zložky.. Treba len nájsť tú správnu kombináciu, či s http a či s / na konci. Url by som nechal s /, len sa vyhrať s adresou hosta.