načtení obsahu http do proměnné

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, 12:46

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

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, 19:07

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>

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, 22:04

Prípadne Jirko, pošli výpis serial monitoru, ja ti to nastavím na riadok napr.

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 » 21 led 2018, 13:31

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.

Uživatelský avatar
SkullKeep
Příspěvky: 290
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

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

Příspěvek od SkullKeep » 21 led 2018, 14:14

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.
:twisted: :?: :arrow: :geek: P. Q. M.

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 » 21 led 2018, 14:28

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.

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 » 21 led 2018, 18:08

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...

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 » 21 led 2018, 18:19

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);
}

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 » 21 led 2018, 18:49

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);
}

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 » 21 led 2018, 18:58

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.

Odpovědět

Kdo je online

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