Pages: 1 2 [3] 4   Go Down
Author Topic: Wie bestimmten Wert von einer Webseite auslesen und darstellen ?  (Read 4264 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn Fiddler wegen Mac nicht geht, dann eben den hier: https://www.owasp.org/index.php/Webscarab. Zur Not kann man auch auf dem Mac eine Windows VM laufen lassen und dort den Fiddler installieren.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du könntest einen anderen Webserver (zu dem du uneingeschränkten Zugang hast) mit PHP dafür benutzen, mit wesentlich mehr Power und den erforderlichen Routinen für Benutzername und Passwort, die Werte auszulesen. Dann stellst du sie quasi minimalistisch und somit Arduino-gerecht zum Download bereit ...
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann könnte er auch gleich anstelle des Arduinos eine Maschine mit etwas mehr Leistungsfähigkeit nehmen und das Problem wäre gelöst. Ich bin ja schon immer der Meinung, daß der Arduino für http untermotorisiert ist. Klar kann man auch an einen Smart eine LKW Anhängerkupplung schrauben. Und man kann damit auch einen 20t Anhänger ziehen. Ob es sinnvoll ist...

Aber wir sind hier ja im Arduino Forum smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moment mal, der Arduino soll ja nicht als Webserver dienen, sondern nur eine TCP-Verbindung aufbauen und die wesentlichen 4 oder 5 Bytes aus dem TCP-Stream lesen. Dafür ist der Arduino sicher nicht untermotorisiert.
Zur Zeit gibt es ja nur noch zwei Probleme, die sicher lösbar sind.

1) Die HTTP-Abfrage stabil zu bekommen, was meiner Meinung nach eher nach einem Problem auf der Gegenseite aussieht, denn der TCP-Connect scheint laut Debugausgabe ja zu klappen.
2) Möglichst einfach / simple die gewünschte Temperatur aus dem HTML-Text zu fischen. Das ist nur geschicktes Durchforsten eines char* buffers und auf jeden Fall was für den Arduino.

Den Arduino als Webserver zu betreiben, da schliesse ich mich Udos Meinung an, das können andere Systeme besser. Der Due wäre ja schon deutlich besser geeignet, zumal der COrtex M3 schon eine Ethernetschnittstelle integriert hat, auch wenn die beim Due noch nicht nach aussen gelegt ist. Ich denke das wird sich bei weiteren Modellen sicher bald ändern.

Mario.
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das habe ich schon so gemeint. Weder als Client noch als Server brauchbar. Noch dazu wo es in der Preisklasse schon stärkere Teile gibt. Aber wenn Du darauf bestehst sowas per Arduino zu machen werde ich Dich sicher nicht aufhalten smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Arduino oder das Arduino-Board hat und soll für mich nur eine "kleine" Aufgabe erfüllen. Ich möchte gerne in einem entfernten Gebäude, was nicht immer bewohnt wird, gerne wissen, welche Temperatur  in einem Raum ist. Für das Gebäude habe ich mal einen AVR-Webserver gebaut, der gewisse Daten auf einer Website darstellt.
Das reicht auch vollkommen aus, nur muss ich dazu den PC anmachen, was ja eigentlich auch nicht das Problem ist, aber warum nicht die bequeme Lösung mit Blickt auf ein Display.
Interessant ist sicherlich diese Sache auch für andere Personen, die beispielsweise immer über einen Börsenwert informiert sein wollen, oder , oder, oder.
Bei mir kommt noch erschwerend dazu (ich habe meine Probleme mit der Ethernetcard in einem anderen Thread beschrieben, dass Boards in gewisser Kombination so ihr eigenes Verhalten aufzeigen, daher habe ich mir erst einmal noch einen Arduino bestellt.
Im Augenblick habe ich mit der richtigen Syntax (heisst tatsächlich DIE Syntax) so meine Probleme, weil ich nirgendwo eine genaue Erklärung finde,
so teste ich mit "  client.println("GET /search?q=Keller+Ort&output=xml&client=test&site=operations HTTP/1.0");  " (ist das richtig "test&site" ?oder
"   client.println("GET /search?q=Sensor 6 HTTP/1.0"); " mit anderen Worten - ich weiss es nicht, wie es heissen muss.

Gruß Gerd

« Last Edit: October 23, 2012, 04:29:35 pm by COOL » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Syntax für die Abfrage hat aber noch nichts mit dem Arduino zu tun. Die kannst Du auch im Browser testen. Wichtig ist, das Du z.B. keine Leerzeichen verwendest und die Zeichen entsprechend kodierst.
Siehe auch http://de.wikipedia.org/wiki/URL-Encoding
Statt
Code:
client.println("GET /search?q=Sensor 6 HTTP/1.0");
also
Code:
client.println("GET /search?q=Sensor%206 HTTP/1.0");
Woher stammt denn der Code auf dem AVR-Webserver? Kann der denn tatsächlich solche Queries ausführen?
Wie gesagt, probiere das mit einem normalen Browser aus, bis Du eine URL hast, die Du direkt aufrufen kannst und die Dir die gewünschten Daten ausgibt. Sobald Du die hast, kannst Du die in den Arduino-Code in das "GET" einbauen.
Dann kommt der nächste Schritt, den einzelnen Wert aus dem HTML-Code zu lesen.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,
das hört sich alles so gut und zugleich kompliziert an. Die Hinweise sind sehr nützlich - schön wäre natürlich ein Beispiel mit einer beliebigen Seite, wo jeder ohne Passwort drauf zugreifen könnte und man einfach mal ein Beispiel kreiert, dann kann ich das auf meine Verhältnisse umschreiben.
Es laufen ja noch nicht einmal die Beispiele vom Finder, so wie zum Beispiel dieses Script (ich habe es auf den neuen Stand von 1.0.1 gebracht)
Quote
#
/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 
 */

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(173,194,35,159); // Google

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

TextFinder finder( client);

long hits; // the number of google hits

void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;smiley-wink
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  }
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
    hits = 0; // reset hit count
    if(finder.find("Results <b>")){   
      if(finder.find("of")){     
         hits = finder.getValue(',');
         Serial.print(hits);
         Serial.println(" hits");         
      }
    }
    if(hits == 0){
      Serial.println("No Google hits ");
    }
  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;smiley-wink
      ;
  }
}
#

Hast Du denn nicht mal ein einfaches Beispiel, was man auch ausprobieren kann, um eine Zahl oder einen Text aus einer willkürlich gewählten Website, auszugeben ?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zwei Bitten.

1) Poste den Code bitte nicht als "Insert Quote", sondern mit dem "#" Tag links daneben. Dann wird der code auch vernünftig ausgegeben.
2) Der Sketch den Du gepostet hast, der scheint nicht zu machen was Du willst. Aber was macht er denn? Welche Ausgaben gibt es?

Mario.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,
habe mich schon gewundert, welche Raute-Zeichen du meinst, habe somit sie ins Script gebracht - habe jetzt aber verstanden.
Also jetzt noch einmal - es ist die Demodatei "SimpleClientWithFinder" nur auf 1.01 angepasst.

Code:
/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 
 */

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(173,194,35,159); // Google

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

TextFinder finder( client);

long hits; // the number of google hits

void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  }
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
    hits = 0; // reset hit count
    if(finder.find("Results <b>")){   
      if(finder.find("of")){     
         hits = finder.getValue(',');
         Serial.print(hits);
         Serial.println(" hits");         
      }
    }
    if(hits == 0){
      Serial.println("No Google hits ");
    }
  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}

Das sollte auch bei dir funktionieren - Google wird nach Arduino abgefragt nur es kommen keine Ergebnisse

Auch seltsam verhält sich bei einem anderen Script diese Funktion

client.print(LOGIN);
client.println("GET /search?q=Keller HTTP/1.0");    //hier soll doch nach "Keller" gesucht werden
    client.println();
...
...
...
  if (client.available()) {   // wenn das zutrifft, wird das gespeichert
    char c = client.read();  // hier abgefragt
    Serial.print(c); //und hier alles ausgegeben
  }

...leider wird hier der GANZE HTML-Code der Seite ausgegeben

Gruß Gerd






* Bildschirmfoto 2012-10-24 um 14.06.34.png (9.71 KB, 131x165 - viewed 22 times.)
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
client.print(LOGIN);
client.println("GET /search?q=Keller HTTP/1.0");    //hier soll doch nach "Keller" gesucht werden
    client.println();
...
...
...
  if (client.available()) {   // wenn das zutrifft, wird das gespeichert
    char c = client.read();  // hier abgefragt
    Serial.print(c); //und hier alles ausgegeben
  }

...leider wird hier der GANZE HTML-Code der Seite ausgegeben

Also,
das "/search?q=Keller" ist KEIN allgemeingültiges Verfahren. Das funktioniert bei Google, weil der Google-Webserver den URI Pfad "search" kennt und den Parameter "q" (aus dem q=...) auswerten kann.

Das hat aber nichts mit dem AVR-Webserver zu tun. Es hängt immer vom Webserver ab, der eine Seite ausliefert, auf welche Seiten und Parameter er reagiert.  Gibt es vom AVR-Webserver eine Doku was der genau beherrscht?

Das ist aber genau das was ich meine. Test die Aufrufe für den AVR-Server in einem Browser. Wenn Du etwas gefunden hast, das für Dich IM BROWSER funktioniert, dann kannst Du anfangen das auf den Arduino zu übernehmen.

Das die "Google-Hits" nicht funktionieren, liegt vermutlich daran, das google die Ausgabe in der HTML-Seite geändert hat. Der TextFinder sucht ja explizit nach dem String "Results <b>", nur wenn er das findet, sucht er nach den Nummer der Ergebnisse.
Wenn ich mit Google nach "arudino" suche, ist die Ausgabe aber "About 23,400,000 results" (englisch) oder "Ungefähr 23.400.000 Ergebnisse" (deutsch). Das ist wohl der Grund warum es nicht klappt.

Mario.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,
hab ich vergessen. Der Webserver ist die Hardware von Pollin AVR NET IO . Ich habe da einen 644 reingebröselt. Das Ding ist in C programmiert.
z.Z. sind 8 DS1820 & Co angeschlossen, weiter frei sind noch 3 Analog-Eingänge, weil einer für die DS1820 drauf ging, desweiteren habe ich 8 digitale Ein/Ausgänge verwendet
und z.Z. 4 Digitaleingänge noch frei.
Ich hatte auch schon mal eine Webcam seriell angebunden, aber eben nur eine, die klaut aber zu viele Ports.
Für das Board gibt es genügend Softwarevarianten, sogar auch mit Arduino-Betriebsystem.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Info, aber die Hardware ist relativ wurscht :-)
Zumindest für Dein akutelles Problem. Wichtig ist die Software die auf dem NET-IO läuft und auf was genau der Webserver reagieren kann.
Ich vermute aber das ein "GET /search?q=IRGENDWAS" nicht funktionieren wird.
Hast Du evtl. die Sourcen für den Webserver auf dem NET-IO?
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3470
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Interessant ist sicherlich diese Sache auch für andere Personen, die beispielsweise immer über einen Börsenwert informiert sein wollen, oder , oder, oder.

Du meinst für Leute die kein Smartphone haben UND in der Lage sind sowas zu programmieren UND für sowas einen Arduino nehmen würden?

Warum baust Du den Server nicht so um, daß er statt einer HTML Seite auf einer anderen URL direkt die Daten in einem passenden Format zurückliefert? So wie ich das verstehe hast Du ja volle Kontrolle über den Server, oder? Das würde das ganze Gefummel mit dem HTML parsen sofort unnötig machen.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario, hallo Udo,

@Mario,
ich werde mal meine Unterlagen durchforsten, ob ich den aktuellen Sourcecode auf dem Mac habe, weil er auf einem Windows-Rechner erstellt wurde, der sich in der "externen" Immobilie befindet.
@Udo.
du darfst es nicht wörtlich nehmen, was ich geschrieben habe, das war nur ein schnell herbeigezogenes Beispiel. Anwendungsmöglichkeiten gibt es wie Sand am Meer, wo man kein Smartphone für anschaltet und was also ständig dargestellt wird. Es ist und soll ein Hobby sein, damit man nicht im Alter im Kopf einrostet. Ich habe z.B. einen ATmega 128 damit beschäftigt, 16 Tempfühler mir auf einem grossen Display ständig anzuzeigen.
Du hast Recht, das Gefummel geht mir auf den Geist. Selbstverständlich kann ich das ändern, jedoch muss ich dann Vorort sein und den Prommer anstecken, um den Code zu ändern. Da ich, wenn ich überhaupt mal in der Immobilie bin, dann nur kurze Zeit und ich müsste einen Weg von 400km in Kauf nehmen. Da jetzt aber der Winter kommt, benötige ich einige Daten vom Haus, die ich stetig im Auge haben möchte, ohne PC oder Smartphone.

Gruß Gerd

Gruß Gerd
Logged

Pages: 1 2 [3] 4   Go Up
Jump to: