Go Down

Topic: Wie bestimmten Wert von einer Webseite auslesen und darstellen ? (Read 5423 times) previous topic - next topic

COOL

..das hört sich gut an, muss ich mir erst einmal verinnerlichen. Beim groben Überfliegen des Links bin ich eher der Meinung, dass es die Serverseite betrifft, wie der zu reagieren hat, ich bin aber Client und war der Annahme, dass es vielleicht durch ein einfaches "client.print " zu lösen sei.
Werde erst mal lesen.

Gruß Gerd

Marcus W

#16
Oct 21, 2012, 08:19 pm Last Edit: Oct 21, 2012, 08:34 pm by Marcus W Reason: 1
http://www.webmaster-eye.de/fsockopen-mit-htaccess-Anmeldung.259.artikel.html

das müsste man auch auf den arduino ummünzen lassen

EDIT: das base64_encode stellt noch ein problem dar, das lässt sich allerdings mit einem PHP-Script oder ähnlichem lösen, dass einmal den String aus Name und Passwort generiert, den du dann hardcoded auf den Arduino übertragen kannst.

Marcus W

#17
Oct 21, 2012, 08:35 pm Last Edit: Oct 21, 2012, 08:37 pm by Marcus W Reason: 1
Problem gelöst:

http://www.functions-online.com/base64_encode.html

Einfach Benutzername:Passwort bei $data eintragen und den rückgabestring abschreiben.

COOL

Hallo Marcus,
erst einmal Dank. Muss ich jetzt mal sehen, ob ich das gebacken kriege und wie ich das einbinde. Habe mich gerade mit dem PHP-Script beschäftigt und ne Menge Fehler geerntet.
Werde mal es am Morgen mit klarem Kopf nochmals in Angriff nehmen.

Gruß Gerd

Marcus W

#19
Oct 21, 2012, 09:07 pm Last Edit: Oct 21, 2012, 09:11 pm by Marcus W Reason: 1
Du musst natürlich statt den PHP-funktionen die Arduino-Äquivalente nehmen.
Also kein fsockopen, sondern client.connect, statt fputs client.println etc.

Es ging dir ja nur darum, wie du beim connect dem Server klarmachst, dass du ihm gerne ein Passwort mitteilen würdest. Das geht indem du ihm nach dem connect ein
"Authorization: Basic <hier die base64-summe aus nutzername:Passwort>" mitgibts

mkl0815

Wer ein "unixoides" Betriebssystem hat (Linux, MacOS etc.) kann auch einfach auf der Kommandozeile folgendes eigeben:
Quote

echo "username:geheim" | md5sum

Das liefert dann den gewünschten MD5-Hash.

da2001

Wenn Du irgendwo Webspace mit PHP zur Verfügung hast, würde ich damit die Daten verarbeiten.
Einfacher Aufruf per cURL und dann nur die Temperatur für das Arduino ausgeben. Wäre für mich als Arduino Anfänger der einfachste Weg :)
Helfe Dir gerne bei der Umsetzung in PHP

COOL

#22
Oct 22, 2012, 02:21 pm Last Edit: Oct 22, 2012, 02:28 pm by COOL Reason: 1
Hallo zusammen,
hat mich ein paar Stunden gekostet, um den ganzen hilfreichen Hinweisen nachzugehen. Teilweise habe ich es nicht verstanden und habe überwiegend Schiffbruch erlitten. Letzt und endlich habe ich es doch ein wenig anders gemacht und habe ERFOLGE gehabt, die leider nicht ständig von Dauer sind.
Was ganz sicher ist, dass man den USER-Namen und das PASSWORT durch einen " : " trennen muss und dies dann einer Base64-Wandlung unterziehen muss !
Es gibt in der Bibliothek eine Base64-Aplikation, jedoch weiss ich diese nicht anzuwenden und habe  "USER-Namen:PASSWORT" hier gewandelt:
http://patshaping.de/projekte/kleinkram/base64.php

Nun zum Script:
Quote
/*
modifizierter WebClient aus Arduino 1.0.1

*/

#include <SPI.h>
#include <Ethernet.h>
//#include <Base64.h>
#define LOGIN ("YWRtaW46YmxhYmxhYmxh.") //Base64 kodiert USERNAME:PASSWORT unter http://patshaping.de/projekte/kleinkram/base64.php
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(99,99,99,99); // Webserver-IP eintragen

//(Port 80 ist für HTTP):
EthernetClient client;

void setup() {
  Serial.begin(9600);
   while (!Serial) {
    ; // warte bis serieller Port verbunden ist
  }

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for(;;)
      ;
  }
  delay(1000);
  Serial.println("verbinde, bitte warten...");
  if (client.connect(server, 80)) {
    Serial.println("verbunden");
//client.print("Authorization: Basic ");
client.print(LOGIN);
   //client.println("GET /search?q=Sensor 6 HTTP/1.0");
    client.println();
  }
  else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("Verbindung getrennt");
    client.stop();
    for(;;)
      ;
  }
}


Das Ergebnis ist verblüffend und zugleich eigenartig. Ohne Änderungen am Script erhalte ich folgende Antworten :
Die beste -
Quote
verbinde, bitte warten...
verbunden
Document follows
Server: AVR_WEB_Switch
Content-Type: text/html

ext/html


<html><head><meta http-equiv="refresh" content="30" text/html; charset=iso-8859-1">
<title>AVR NET IO</title>
<style type="text/css">
.fett {font-weight: bold; margin-top:15px;}
td { cellpadding: 2px; }
body { font-family: arial;  font-size: 1.0 em; color: #000000; background-color: rgb(255, 255, 204)}
h1 {text-align: center; font-weight: bold; color: white; font-size: 1.2 em}
</style>
</head><body><center>
<table style="width: 600px; text-align: left; background-color: rgb(153, 153, 255);" cellpadding="5">
<tr><td><h1>HOME 1 WEBSERVER</h1>
<table style="width: 100%; font-weight: bold;">
<tr><td>Serverzeit: 12:32</td><td style="text-align: right;">Pagecounter: 231</td></tr></table>
</td></tr></table>
<div class="fett">Status PORTA:</div>
<table style="width: 600px; text-align: left; background-color: rgb(255, 255, 153);" border="0">
<tr><td>dig. Eingang</td><td style="width:35px;">auf/zu</td><td align="center">analog. Eingang</td><td>Wert (0-1023)</td></tr>
<tr><td>A0_Fenster_1</td><td style="background-color: rgb(153, 0, 0);"></td><td align="center">AD-A4</td><td>1018</td></tr>
<tr><td>A1_Fenster_2</td><td style="background-color: rgb(153, 0, 0);"></td><td align="center">AD-A5</td><td>1017</td></tr>
<tr><td>A2_</td><td style="background-color: rgb(153, 0, 0);"></td><td align="center">AD-A6</td><td>1018    LDR</td></tr>
<tr><td>A3_</td><td style="background-color: rgb(153, 0, 0);"></td><td align="center">AD-A7</td><td>(8xDS1820)</td></tr>
</table>
<div class="fett">1-Wire-Temperatursensoren:</div>
<table style="width: 600px; text-align: left; background-color: rgb(255, 255, 102);" border="0">
<tr><td>1-Wire</td><td>Ort</td><td align="right">Wert</td><td align="left">Einheit</td><td>Min/Max(Tag)</td></tr>
<tr><td>Sensor 0</td><td>Esszimmer</td><td align="right">15,9</td><td align="left">&deg;C</td><td>15,6 / 16,0</td></tr>
<tr><td>Sensor 1</td><td>Keller</td><td align="right">16,3</td><td align="left">&deg;C</td><td>16,3 / 16,4</td></tr>
<tr><td>Sensor 2</td><td>Kuehlkörper</td><td align="right">33,7</td><td align="left">&deg;C</td><td>33,6 / 33,8</td></tr>
<tr><td>Sensor 3</td><td>Pumpe RL</td><td align="right">15,0</td><td align="left">&deg;C</td><td>14,9 / 15,1</td></tr>
<tr><td>Sensor 4</td><td>Pumpe VL</td><td align="right">15,1</td><td align="left">&deg;C</td><td>15,0 / 15,1</td></tr>
<tr><td>Sensor 5</td><td>Brauchwasser</td><td align="right">15,5</td><td align="left">&deg;C</td><td>15,5 / 15,6</td></tr>
<tr><td>Sensor 6</td><td>Nebengebaeude</td><td align="right">14,1</td><td align="left">&deg;C</td><td>13,9 / 14,1</td></tr>   //Diese Zeile interessiert mich !
<tr><td>Sensor 7</td><td>Solar-Speicher</td><td align="right">45,9</td><td align="left">&deg;C</td><td>11,0 / 48,9</td></tr>
</table>
<div class="fett">Schaltanweisungen:</div>
<table style="width: 600px; text-align: left; background-color: rgb(255, 204, 51);" border="0">
<tr><td><form name="form1" method="post" action=" ">
<table style="width: 100%; text-align: left;" border="0">
<tr><td><input type="checkbox" name="OUT" value="X" > Automatik<hr></td><td>0<hr></td><td>(ein/aus) <hr></td></tr>
<tr><td><input type="checkbox" name="OUT" value="A"> C0_Relais_1</td><td>  Heizung</td><td>ein/aus</td></tr>
<tr><td><input type="checkbox" name="OUT" value="B"> C1_Relais_2</td><td>  Anpassung Fühler-Heizung</td><td>ein/aus</td></tr>
<tr><td><input type="checkbox" name="OUT" value="C"> C2_Relais_3</td><td></td><td></td></tr>
<tr><td><input type="checkbox" name="OUT" value="D"> C3_Relais_4</td><td></td><td></td></tr>
<tr><td><input type="checkbox" name="OUT" value="E"> C4_Relais_5</td><td><input type="checkbox" name="OUT" value="i">- / +<input type="checkbox" name="OUT" value="j"> ab 15 &deg;C Differenz ein</td><td>-> Sensor 3,4</td></tr>
<tr><td><input type="checkbox" name="OUT" value="F"> C5_Relais_6</td><td></td><td></td></tr>
<tr><td><input type="checkbox" name="OUT" value="G"> C6_Relais_7</td><td>  Lüfter</td><td>im Server</td></tr>
<tr><td><input type="checkbox" name="OUT" value="H"> C7_Relais_8</td><td>  Tor</td><td>auf/zu</td></tr>
</table>
<hr><p align="center"><input type="submit" name="SUB" value="Senden"></p></form>
</td></tr></table>
<br><div class="fett">Lokale Wetterinformationen: </div><a href=http://www.wetter24.de/nc/de/home/wetter/weltwetter/ortewetter.html?cityID=49X1610&type=98>-> www.wetter24.de</a>
<br><hr>
<div>PORTB -> ENC28J60<br>PORTD -> LCDisplay</div>
<br>
<div>WEBSERVER Home 1 </div>
</span></body></html>

Verbindung getrennt


Es kann aber auch so aussehen:
Quote
verbinde, bitte warten...
verbunden

Verbindung getrennt



WARUM......??
Wie dem auch sei.

Wie bekomme ich jetzt die Rückmeldung aus der markierten Zeile oben
<tr><td>Sensor 6</td><td>Nebengebaeude</td><td align="right">14,1</td><td align="left">&deg;C</td><td>13,9 / 14,1</td></tr>
Ich möchte gerne die 14,1° später auf meinem Display, bzw seriellem Monitor sehen.

Mit dem Browser sieht es so aus, siehe Bild.
Kann mir jemand mal bitte die Syntax geben, damit ich nur die 14,1° sehe und nicht das ganz Listing
Eventuell so " client.println("GET /search?q=Sensor 6 HTTP/1.0"); " und dann ?

Gruß Gerd


mkl0815

Schau Dir mal http://www.arduino.cc/playground/Code/TextFinder an. Damit kannst Du z.B. nach dem String Nebengebaeude</td><td align="right"> suchen und die danach folgende Float Zahl parsen lassen. Dann hast Du den Wert gleich.
Alternativ kannst Du auch die Ausgabe vom Webserver in einem input-Puffer einlesen und in dem nach dem String "Nebengebaeude" suchen. Wenn Du die Stelle gefunden hast, steht Deine Temperatur mit einem Offset von 35 an der gefundenen Stelle.

COOL

Hallo mkl0815,
der Tip ist nicht schlecht. Wenn ich die Beispiele aufrufe kommen immer Fehlermeldungen, so z.B. beim Sketch "SerialReceive.pde" kommt die Meldung
"Textfinder" does not name a type" und "TextFinder finder( client);" wird hinterlegt

Gruß Gerd

mkl0815

Evtl. muss die Lib noch auf die neue IDE umgestellt werden. Ist ne Weile her, das ich den Textfinder benutzt habe.
Schau Dir mal den "top-Post" von Uwe bezüglich IDE 1.0 an.

Udo Klein

@gerd: die Antwort war schon für Dich bestimmt. Bei Deiner Sorte Probleme mußt Du ***zuerst*** die Debuginstrumentierung in den Griff kriegen, ansonsten kannst Du bis zum St. Nimmerleinstag suchen. Und wie gesagt, ich empfehle Fiddler, den halte ich für bequemer zu bedienen wie Wireshark. Wireshark nimmt man nur dann wenn sonst wirklich fast nichts mehr geht.
Check out my experiments http://blog.blinkenlight.net

COOL

Hallo Udo,
danke für den Hinweis. Leider gibt es Fiddler nicht für Mac-Systeme. Ich gehe mal davon aus, dass du den HTML-Bereich meinst. Ich glaube, dass dieses blöde Verhalten zurückzuführen ist auf das Ethernet-Board, was ja schon zuvor Probleme bereitete. Schätze aber, dass ich durch Neukauf eines neuen Arduino dies aus der Welt räumen kann.
Grössere Probleme habe ich mit dem Auslesen eines Wertes wie zuvor beschrieben.

Gruß Gerd

mkl0815

Aber Wireshark gibt's für den Mac und "tcpdump" is eh drauf.
Ein beherztes "sudo su -" gefolgt von einem "tcpdump -i en0 -nn -v -A host WEBSERVERNAME" und einem Browseraufruf liefert schon jede Menge nützliche Infos.
Wireshark hat dafür die schöne Möglichkeit den TCP-Stram komplett aufzudröseln und die Request und Antwort des Server anzuschauen.

COOL

...habe mir heute ein neuen MEGA2560 bestellt, weil ich unterschiedliche Fehlermeldungen habe, um zumindest ein fehlerhaftes Board auszuschliessen.
Ich werde mir mal die Tools reinziehen, glaube aber nicht, dass ich dadurch einkreisen kann, weil ich unterschiedliche sich wiederholende Ergebnisse habe, ohne etwas zu machen.
Erst einmal DANKE
Kann man auch zum Ziel kommen, wenn man diese Zeile "  client.println("GET /search?q=Sensor 6 HTTP/1.0");  " ergänzt ?

Gruß Gerd

Go Up