Wie bestimmten Wert von einer Webseite auslesen und darstellen ?

Hallo Holger,
wie mein Browser die Webseite aufruft, weis ich. Es kann doch aber wirklich nicht schwierig sein, hier eine "Clientantwort" mit einzubinden, ohne sich mit Theorien zu beschäftigen. Ich bin leider zu blöd, um das alleine zu stemmen.

Gruß Gerd

http://php.net/manual/de/features.http-auth.php

da steht, was du als header senden musst.

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

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.

Problem gelöst:

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

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

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 " mitgibts

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

echo "username:geheim" | md5sum

Das liefert dann den gewünschten MD5-Hash.

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 :slight_smile:
Helfe Dir gerne bei der Umsetzung in PHP

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:

/*
modifizierter WebClient aus Arduino 1.0.1

*/

#include <SPI.h>
#include <Ethernet.h>
//#include <Base64.h>
#define LOGIN ("YWRtaW46YmxhYmxhYmxh.") //Base64 kodiert USERNAME:PASSWORT unter Base64 Codier-/Decodier-Tool
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(;:wink:
;
}
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(;:wink:
;
}
}

Das Ergebnis ist verblüffend und zugleich eigenartig. Ohne Änderungen am Script erhalte ich folgende Antworten :
Die beste -

verbinde, bitte warten...
verbunden
Document follows
Server: AVR_WEB_Switch
Content-Type: text/html
ext/html

AVR NET IO .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}

HOME 1 WEBSERVER

Serverzeit: 12:32 Pagecounter: 231
Status PORTA:
dig. Eingang auf/zu analog. Eingang Wert (0-1023)
A0_Fenster_1 AD-A4 1018
A1_Fenster_2 AD-A5 1017
A2_ AD-A6 1018 LDR
A3_ AD-A7 (8xDS1820)
1-Wire-Temperatursensoren:
//Diese Zeile interessiert mich !
1-Wire Ort Wert Einheit Min/Max(Tag)
Sensor 0 Esszimmer 15,9 °C 15,6 / 16,0
Sensor 1 Keller 16,3 °C 16,3 / 16,4
Sensor 2 Kuehlkörper 33,7 °C 33,6 / 33,8
Sensor 3 Pumpe RL 15,0 °C 14,9 / 15,1
Sensor 4 Pumpe VL 15,1 °C 15,0 / 15,1
Sensor 5 Brauchwasser 15,5 °C 15,5 / 15,6
Sensor 6 Nebengebaeude 14,1 °C 13,9 / 14,1
Sensor 7 Solar-Speicher 45,9 °C 11,0 / 48,9
Schaltanweisungen:
Automatik
0
(ein/aus)
C0_Relais_1 Heizung ein/aus
C1_Relais_2 Anpassung Fühler-Heizung ein/aus
C2_Relais_3
C3_Relais_4
C4_Relais_5 - / + ab 15 °C Differenz ein -> Sensor 3,4
C5_Relais_6
C6_Relais_7 Lüfter im Server
C7_Relais_8 Tor auf/zu

Lokale Wetterinformationen:
-> www.wetter24.de
PORTB -> ENC28J60 PORTD -> LCDisplay
WEBSERVER Home 1

Verbindung getrennt

Es kann aber auch so aussehen:

verbinde, bitte warten...
verbunden
Verbindung getrennt

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

Wie bekomme ich jetzt die Rückmeldung aus der markierten Zeile oben

Sensor 6Nebengebaeude14,1°C13,9 / 14,1 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

Bildschirmfoto 2012-10-22 um 14.09.33.png

Schau Dir mal Arduino Playground - TextFinder an. Damit kannst Du z.B. nach dem String Nebengebaeude 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.

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

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.

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

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

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.

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

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.

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

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 :wink: