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.
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 ![]()
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(;
;
}
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 -
verbinde, bitte warten...
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}
verbunden
Document follows
Server: AVR_WEB_Switch
Content-Type: text/html
ext/html
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 -> LCDisplayWEBSERVER Home 1Verbindung 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

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 ![]()
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.
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.
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 ![]()
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
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 URL-Encoding – Wikipedia
Statt
client.println("GET /search?q=Sensor 6 HTTP/1.0");
also
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.
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)
/*
Web clientThis 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 ")){
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(;
;
}
}
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 ?
Zwei Bitten.
Mario.
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.
/*
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
