Arduino Ethernet - Web Request; bekomme das nicht in Funktion ausgelagert :/

Hallo,

ich habe einen Arduino Ethernet, der eine Web-URL aufrufen soll.
Wenn ich das Standard-Web-Request-Example mit meinen Daten fülle, funktioniert der Aufruf - ich sehe den “OK”-Test der Website im seriellen Output.

Im Beispiel wird die Website aber nur einmal aufgerufen, der dazugehörige Request steht unter setup();.

Ich bin also hergegangen, und habe den betreffenden Code von setup(); an die oberste Stelle der loop(); verschoben. Und jetzt funktioniert’s nicht mehr.

/*
  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
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen
 
 */

#include <SPI.h>
#include <Ethernet.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 };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.3bm.de";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,2,177);

// 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;

void setup() {
 // Open serial communications and wait for port to open:
  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:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);

}

void loop()
{
  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 /attiny/index.php?test=do HTTP/1.1");
    client.println("Host: www.3bm.de");
    client.println("Connection: close");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }  
  
  
  delay(10000);
  
  
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

Der Output des seriellen Monitors sieht so aus:

connecting...
connected
Hconnecting...
connection failed
Tconnecting...
connection failed
Tconnecting...
connection failed
Pconnecting...
connection failed
/connecting...
connection failed
1connecting...
connection failed
.connecting...
connection failed
1connecting...
connection failed
 connecting...
connection failed
2connecting...
connection failed
0connecting...
connection failed
0connecting...
connection failed
 connecting...
connection failed
Oconnecting...
connection failed
Kconnecting...
connection failed

Ich rufe folgende Seite mit dem Ardu auf:
http://www.3bm.de/attiny/index.php?test=do

Es sollte eigentlich folgender Text in der seriellen Konsole erscheinen:
Test = do - alles OK!

Im seriellen Output ist jeweils vor “connecting…” ein Buchstabe zu sehn. Wenn ich das so zusammensetze, wird dort buchstabenweise der Website-Output der obigen Seite OHNE GET-Parameter ausgespuckt:

Empfangene Daten:

Anzahl Datenelemente: 1
Node-ID:
Data:

Datentyp:
Wert:

Wenn ich das Beispiel mit den periodischen WebRequests anpasse, funktioniert das im übrigen genausowenig.

Jemand ne Idee, woran das liegen könnte?

Hallo,

ich habe noch etwas rumexperimentiert und eine “Lösung” gefunden:

// https://gist.github.com/SergXIIIth/1628715

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

byte mac[] = { 
  0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(192,168,0,140);
char server[] = "www.3bm.de";

EthernetClient client;

void connect(String payload){
  if (client.connect(server, 80)) {
    Serial.print("Make a HTTP request to ");
    Serial.print(server);

    client.println("GET /attiny/index.php?data="+payload+"&key=xxxx HTTP/1.0");
    client.println("HOST: 3bm.de");
    client.println();

    Serial.println();
    Serial.println("ok");
  }
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
  
   while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("Trennen.");
    Serial.println("----------------------");
    client.stop();
  }
}

void setup() {
  Serial.begin(9600);

  Serial.print("Setup LAN ... ");
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Ethernet.begin(mac);
  Serial.println("ok");
}

void loop(){
  String data = "1;TEMP1:88.00";
  connect(data);
  
  delay(10000);
}

Ich habe also eine Funktion, an die ich einen String übergebe - dieser wird per GET auf einer Website aufgerufen, die die Daten in eine Datenbank klopft.

Nun habe ich ein “Problem”: Ein Aufruf der Website dauert etwa 10-12 Sekunden (mein 10Sec Delay ist da schon abgezogen). Das ist zu lange, und ich weiß leider nicht so recht, warum es so lange dauert und wie ich es optimieren kann.
Hatte bereits mal statt einem DNS-Servernamen eine IP angegeben, da gab’s aber keinen Geschwindigkeitsvorteil. Der Webserver reagiert auf alle Fälle schneller.

Ich vermute, der Arduino ist damit beschäftigt, die Daten, die der Webserver zurückliefert in der while-Schleife zu sammeln, um sie auf der Serial auszuspucken:

   while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

“Eigentlich” brauche ich das nicht; eigentlich brauche ich später weder den seriellen Output, noch die Antwort vom Webserver. Wenn ich obigen Code aber auskommentiere, funktioniert auch der GET-Aufruf nicht mehr (sehe das, da die Daten in eine DB geschrieben werden).

Die Zeit ist mir aus folgendem Grund wichtig: Der Ardu empfängt per 433 Info’s von mehreren Sensor-Nodes. Ich vermute mal: Wenn der Ardu damit beschäftigt ist, eine Web-Anfrage zu stellen, verpasst er die Info, die per 433 geschickt wird. Richtig?

Wie löse ich sowas den am geschicktesten? Die 433-Daten eine Zeit lang sammeln (im EEPROM oder der SD-Karte) und sie einmal täglich in die Datenbak per WEbscript schreiben?

Mach aus

  if (client.available()) {

Dochmal

  while (client.available()) {

Um alle Daten zu lesen.

Hallo gloob,

nach dem Posten hier habe ich das genauso durchgeführt; ist auch im zweiten Post schon so angepasst. Kann ich vielleicht die Zeit irgendwie verkürzen, indem ich NUR die GET-Anfrage setze und die Antwort der Website nicht abfange?

Wenn ich den Code für den Output der Website auskommentiere, kommt aber nix mehr an. Ich vermute also, NUR GET abzusetzen, reicht nicht?