Ajax Request auswerten.

Hallo Forum,
ja mich gibt es auch noch und leider habe ich in der Zwischenzeit nicht viel mit Arduino machen können. Doch jetzt darf ich wieder Fragen stellen…

Also ich habe mein Arduino mit einem Ethernet-Shield bestückt. Wenn ich die IP (in meinem Fall mit jQuery und Ajax aufrufe) “anrufe” bekomme ich ein XML Aufruf mit der Statusmeldung wieder. Gelingt prima. Doch nun möchte ich gerne Befehle mit senden-das gelingt im Prinzip auch, aber eben nicht richtig.
Mein IP-Aufruf schaut wie folgt aus:
192.168.1.177/oder eben um Befehle mit zu senden192.168.1.177/?status=S
Der dazugehörige Arduinocode schaut wie folgt aus:

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();   [b]//Was genau ist c von meinem Aufruf?????[/b]
        if (c =='S')                                                       
          {
            Serial.print("Incomming Data: ");
            Serial.println(c);                                       [b] //nur das letzte Zeichen?????[/b]
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/xml");
            client.println("Connection: close");
            client.println("Access-Control-Allow-Origin: *");
            client.println();
            client.println("<?xml version='1.0'?>");
            client.println("<status>");
                client.print("ok");   //Übermittlung erfolgreich
            client.print("</status>");
          };
        if (c == '\n' && currentLineIsBlank) {   [b]//Wenn ich die zweite "IP" Aufrufe springt mir der Arduino dennoch in diese Schleife, warum??????Wenn ich nur die erste Aufrufe, landet Arduino nur in der Schleife so soll es sein[/b]
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/xml");
          client.println("Connection: close");
          client.println("Access-Control-Allow-Origin: *");
          client.println();
          client.println("<?xml version='1.0'?>");
          client.println("<terrarium>");
            client.print("<uhrzeit>");
              client.print("<stunden>");
                client.print(stunden);
              client.print("</stunden>");
              client.print("<minuten>");
                client.print(minuten);
              client.print("</minuten>");
              client.print("<sekunden>");
                client.print(sekunden);
              client.print("</sekunden>");  
            client.println("</uhrzeit>");
          client.println("</terrarium>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");

Die genauen Fragen habe ich in den Quellcode integriert. Eventuell kann mir von euch jemand helfen.
vielen Dank
Balli

Hi,

die Doku Ethernet - Arduino Reference verrät dir was der client.read() Aufruf macht.
Kurz gesagt arbeitet dein "copy/paste" Programm so, dass ein TCP-Stream byte für byte ausgewertet wird.
Sobald neue Zeile (\n, \r, ...) gefunden wird, schreibst du in diesen Stream deine Antwort rein.

Hoffe das beantwortet deine offenen Fragen.

Grüße
Nighti

Okay, danke großartig. Gibt es eventuell schon eine Bibliothek die Request nach den übergebenen Parametern auswertet? So das ich aus xxxx.xxxx.xxx.xxx/?pin=12&status=1
Die Werte 12 und 1 einfach abfragen kann?Oder muss ich dazu meinen InputStream händisch auswerten?

mfg
Balli
p.s. ich habe nach so einer Bobliothek schon gesucht und nichts gefunden

hi,

schau hier, die erste antwort. da hängt ein sketch von mir dran, wo ich mit jquery und ajax die mitgegebenen variablen verarbeizt. ist zwar ein POST- und nicht ein GET-request, aber das prinzip ist das gleiche.

gruß stefan

Hi,
danke für den Sketch, der ist echt toll, aber leider (wahrscheinlich) nicht das was ich brauche. Einfach, weil das ohne Internetverbindung laufen muss. Deswegen habe ich gedacht ich entwickle einfach eine WebApp(so sollte sie auch auf kommenden Smartphones laufen) die ich mir in den Cache packe und gut ist. Das bedeutet das jQuery und Co eben nicht via Internet geladen werden können und den Arduino kann ich damit nicht belasten. Deswegen würde ich gerne einfach den Input-auswerten. Oder ich packe die Bibliotheken auf eine sd-Karte. Mh, alles nicht so einfachG.
Ich glaube nur mich zu erinnern, dass mein SD-Card-Shield sich mit einem anderem Shield nicht vertragen hat.
Ich probiere das morgen alles mal aus.

mfg
Balli

Hi, also ich habe mir deinen Code noch einmal genau angeschaut und ich denke so mache ich das auch. Mit den Bibliotheken muss ich mir natürlich etwas ausdenken.
Kannst du mir eventuell einmal diesen Codeschnipsel erklären?

if (type == WebServer::POST)
  {
    bool repeat;
    char name[16], value[16];
    do
    {
      repeat = server.readPOSTparam(name, 16, value, 16);
      if (strcmp(name, "licht") == 0)
      {
        neu = true;
        licht = strtoul(value, NULL, 10);
      }
    } while (repeat);
    
    server.httpSeeOther(PREFIX);
    return;
  }

Vorallem, wie kann ich das erweitern dass ich dann zwei Parameter habe?

mit freundlichem Gruß
Balli

Versuch mal damit:

Es tut mir leid, das ich vermeintlich leichte Fragen stellen muss, aber so wirklich simpel erscheint mir Arduino einfach nicht.

Ich möchte gerne das Beispiel von Stefan (Eisebaer) nachbauen, doch wie kann ich die Webseite dynamisch generieren, ich kriege das einfach nicht gebacken.Statisch läuft es perfekt, ist aber nicht mein Ziel.

Hier einmal mein Code in gekürzter Fassung:

if (type == WebServer::GET) {
    P(message) = 
      "<!DOCTYPE html><html>\n"
      "<head>\n"
      "
      "</head>\n"
      "<body>\n"
        "<div data-role='header' data-position='inline'><h1>TerraControl</h1></div>\n"
          "<div class='ui-body ui-body-a'>\n"
            [color=red]"Uhrzeit: "+stunden+":"+minuten+":"+sekunden+"\n" [/color]    //hier möchte ich gerne die Arduino-Uhrzeit ausgegeben haben
            "<label for='slider1'>Slider:</label>\n"
            "<input id='slider1' type='range' min='0' max='3' step='1' value='2' />\n"
          "</div>\n"
        "</body>\n"
      "</html>\n";
server.printP(message);

vielen Dank für eure tolle Hilfe

Ballibum:
Es tut mir leid, das ich vermeintlich leichte Fragen stellen muss, aber so wirklich simpel erscheint mir Arduino einfach nicht.

Manche Leute können mit einem Messer wundervolle Figuren schnitzen und andere nur damit schneiden :wink:

Kann dir nur raten mehr Basiswissen anzueignen und nicht jeden Code einfach Copy/Pasten.
Du versuchst dynamische Elemente in statischen Speicher abzulegen. Mach es zuerst ohne P(), F(), - Makros.
Ansonsten ist der gepostete Code auch syntaktisch nicht korrekt.

Hi,
ja das mit den Konstanten habe ich noch nicht so drauf. Wann ist welcher String fest und wann nicht. Aber wieso, ist mein Code syntaktisch falsch, der ist aus meiner Sicht richtig. Dass das HTML-Fehlerhaft ist habe ich bereits geschrieben (des Übersicht wegen habe ich eine Menge weggelassen).
mfg
Balli

Alles was nicht kompiliert werden kann ist syntaktisch falsch. Codeteile im Forum zu posten ist gerade für Programmieranfänger
recht gefährlich. Was für dich unwichtig ist, ist dann entscheidend. Deswegen wird immer um den kompletten Code und genaue
Fehlerbeschreibung gebeten.
Um dein Wissen in C zu festigen könnte c ovn a bis z interessant sein.
Es ist alles keine Magie. Genauso wie die drei Speicher beim Aruino(Atmega). Einfach den inneren Schweinehund überwinden und
versuchen das Wissen anzueignen :slight_smile:

hi,

Vorallem, wie kann ich das erweitern dass ich dann zwei Parameter habe?

ich schicke einstweilen nur einen parameter mit, dessen name "licht" ist. aber nehmen wir mal an, ich könnte auch einen parameter "heizung" mitschicken.
in der do....while(repeat)-schleife werden alle parameter abgefragt, solange welche da sind. dann wird der name der parameter verglichen (mit licht bzw. heizung) und dann der wert(value) der parameters in eine zahl umgewandelt (strtoul).

mit copy/paste arbeitet doch (fast) jeder, ich hab' auch nur ein webduino-beispiel abgewandelt.
das war vor einem jahr, und seitdem will ich die seite umbauen, weil es besser geht (z.b. mit rückmeldung), aber weil's ja funktioniert, war ich zu faul dazu.

trotzdem ist es natürlich schon gut, daß man kapiert, was man kopiert, damit man es anpassen kann.

gruß stefan

Ihr habt beide gänzlich recht-ich denke das meiste raffe ich auch. C habe ich leider nie wirklich gelernt und vor allem habe ich echte Probleme zu verstehen, wann etwas verändert werden kann und wann nicht,dazu hat mir mein Arduino-Buch auch noch nicht viel erklärt.
Ich habe gerade versucht client und server zu kombinieren, wollte aber nichtG-aber ich bin da optimistisch, dass das noch was wird. Vielen Dank euch!