Go Down

Topic: Redfly - PHP Request starten (Read 4324 times) previous topic - next topic

Ballibum

Hi Forum,
leider muss ich euch mit trivialen Fragen nerven, aber ich finde mich einfach mit den API-Beschreibungen noch nicht so zu recht wie ich mir das selbst wünsche (war leider sehr naiv in der Vorstellung die Programmiersprache ist bestimmt ähnlich einfach wie java und co).
Drum hier meine Frage:

Code: [Select]
RedFly.socketSendPGM(http, PSTR("GET http://"HOSTNAME"/php/db2.php?wert=5050 HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));

Anstelle von 5050 möchte ich jetzt einen Zahlenwert verschicken, der vorher in einer Variablen festgeschrieben wurde.
Wie stelle ich das an mit:
Code: [Select]
RedFly.socketSendPGM(http, PSTR("GET http://"HOSTNAME"/php/db2.php?wert="wert" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));
RedFly.socketSendPGM(http, PSTR("GET http://"HOSTNAME"/php/db2.php?wert="+wert+" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));

und ähnlichen Konstruktionen hatte ich keinen Erfolg.
mfg
balli

Marcus W

#46
May 13, 2012, 07:37 pm Last Edit: May 13, 2012, 08:02 pm by Marcus W Reason: 1
Es gibt keine trivialen Fragen - nur triviale Lösungen :D
Code: [Select]
RedFly.socketSendPGM(http, PSTR("GET /php/db2.php?wert="+wert+" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));
müsste eigentlich funktionieren...

EDIT: natürlich nur, wenn die Variable Wert ein String ist, wenn nicht musst du den integer(?)-wert z.B. mit itoa() oder sprintf in den String einfügen.

EDIT 2: Code nachgereicht - allerdings blind
Code: [Select]

char wertbuffer[5]; // maximal 5 stellen, also 99999
sprintf(wertbuffer, "%d", wert);

RedFly.socketSendPGM(http, PSTR("GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));

Quote
RedFly.socketSendPGM(http, PSTR("GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));

Das funktioniert nicht - PGM/PSTR steht für Daten im Flash. Beim AVR-Mikrocontroller muss man zwischen den Speicherbereichen (Flash/RAM) unterscheiden.

Schaut euch mal das WebClient und WebServer Beispiel an. Diese benutzen die vereinfachten Client/Server Klassen, die sehr ähnlich wie die original Klassen des Arduino Ethernet Shields sind.

Bei Debugausgaben auf der seriellen Schnittstelle (z.B. über Serial.println()) muss das RedFly-Shield immer erst deaktiviert werden. Daher auch die debugout() Funktionen in den Beispielen.

Gruß
Andreas

Marcus W

#48
May 13, 2012, 08:28 pm Last Edit: May 13, 2012, 08:52 pm by Marcus W Reason: 1
Ahhhh! Erleuchtung, danke Andreas. Deshalb also funktioniert die Übergabe der Konstante HOSTNAME, die ja nur Defined wird und mit einer Variable nix gemein hat, und eine normale Variable nicht...

EDIT:
Was passiert also, wenn man statt
Code: [Select]

RedFly.socketSendPGM(http, PSTR("GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));


Code: [Select]

RedFly.socketSend(http, "GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n");

benutzt?

mkl0815


Ahhhh! Erleuchtung, danke Andreas. Deshalb also funktioniert die Übergabe der Konstante HOSTNAME, die ja nur Defined wird und mit einer Variable nix gemein hat, und eine normale Variable nicht...

Weil Werte die mittels "define" definiert werden VOR dem eigentlichen compilieren durch den Präprozessor ersetzt werden. Das ist eine reine Textersetzung, die schon im Quellcode stattfindet. Daher bekommt der Compiler am Ende nur einen einzigen String. 

Ballibum

Leider Funktioniert die Variante auch nicht, das Umwandeln in ein String /Char Funktioniert, jedoch sagt er mir dennoch folgenden Fehler:
Code: [Select]
wlan.cpp: In function 'void loop()':
wlan:107: error: invalid operands of types 'const char [23]' and 'char [5]' to binary 'operator+'


wenn ich dieses tue (beide varianten der gleiche Fehler):
Code: [Select]
cm = microsecondsToCentimeters(duration);
  itoa(cm,buffer,10);
  char wertbuffer[5]; // maximal 5 stellen, also 99999
  sprintf(wertbuffer, "%d", 5);
 
  RedFly.socketSend(http, "GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n");
//RedFly.socketSend(http, "GET /php/db2.php?wert="+ buffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n");

vielen dank für eure Geduld.

Ballibum

Hallo Forum,
leider gottes muss ich euch mit diesem Thema weiter aufn leim gehen. Es gelingt mir einfach nicht dynamischen Inhalt in den Request einzufügen. Beim einfach Redfly Client-Beispiel(ohne Socket) stellt das Board gar keine Verbindung her, wobei in der Analyse nicht einmal das Passwort übergeben wird!daher kann ich mit den Beispielen von Andreas leider nicht viel anfangen.
mfg und abermals tausend Dank
balli

Ballibum

Hi @all,Hi Andreas W.,
leider habe ich bis dato auch mit sämtlichen Versionen des WebClients (den ich in der Example-Version immer noch nicht zum laufen bekomme(das Passwort und die SSID werden nicht übertragen)) getestet und versucht, ich bekomme aber leider keine Daten dynamisch übermittelt.
Kann mir jemand vielleicht ein anderes Beispiel oder Tutorial zeigen?
mfg
Balli

mkl0815

C-Strings kann man nicht so einfach addieren, das ist Dein Problem. Du kannst aber eine Instanz der Klasse "String" verwenden, um die Teile zusammen zu sezten und dann daraus wieder einen C-String machen. Oder, wenn Du eh schon sprintf verwendest, gleich den ganzen String so erzeugen:
Code: [Select]

  char wertbuffer[100]; //Puffer groß genug wählen
  sprintf(wertbuffer, "GET /php/db2.php?wert=%d HTTP/1.1\r\nHost: %s\r\n\r\n", 5, HOSTNAME);
 
  RedFly.socketSend(http, (char*) &wertbuffer);

Achtung, ist ungetestet. Sollte vom Ansatz aber korrekt sein.

Ballibum

#54
May 18, 2012, 04:33 pm Last Edit: May 18, 2012, 04:41 pm by Ballibum Reason: 1
Danke mkl für deine Antwort,
aber magst du mir das Ganze einmal erklären.
Ich habe es einmal versucht:

Code: [Select]
char wertbuffer[100]; //Puffer groß genug wählen -Ball: "Der String der Abschließend gesendet wird"
 sprintf(wertbuffer, "GET /php/db2.php?wert=%d HTTP/1.1\r\nHost: %s\r\n\r\n", 5, HOSTNAME); //Balli:"String wird an Buffer übergeben, das%d dient als Platzhalter und wird durch die 5 ersetzt"
 
 RedFly.socketSend(http, (char*) &wertbuffer); //Balli: Senden des entsprechenden Get-Befehls




mfg
balli

mkl0815

Gibt es denn Fehler vom Compiler, oder funktioniert es einfach nicht?

Code: [Select]
char wertbuffer[100];
Das definiert einfach einen 100 Byte großen Puffer, der den String aufnehmen soll. Also ein char[100] Array.
Code: [Select]
sprintf(wertbuffer, "GET /php/db2.php?wert=%d HTTP/1.1\r\nHost: %s\r\n\r\n", 5, HOSTNAME);

Schreibt den kompletten String in den Puffer, wobei die Platzhalter %d und %s durch die übergebenen Werte ersetzt werden.
Code: [Select]
RedFly.socketSend(http, (char*) &wertbuffer); //Balli: Senden des entsprechenden Get-Befehls
Sollte auch als
Code: [Select]
RedFly.socketSend(http, wertbuffer); //Balli: Senden des entsprechenden Get-Befehls
funktionieren. Das (char*) &wertbuffer hatte ich eher als Verdeutlichung verwendet was gemacht wird. Ich vermute mal, das RedFly.socketSend() einen C-String, also char* als Parameter erwartet. Das "&" Sorgt dafür, das nicht der Wert von "wertbuffer", sondern dessen Adresse im Speicher als Parameter verwendet wird. Also der Zeiger auf das Array. Allerdings ist das vom Typ "char[100]*" nicht vom Typ "char*", daher wird es auf den passenden Typ "gecasted".
Mario.

Ballibum

Hi Mario,
es scheint tadellos zu funktionieren. Nur je nach Geschwindigkeit kommt mein MySQL nicht hinterher (aber das war zu erwarten).
Ich danke euch allen!
Jetzt noch Daten lesen und dann kann ich dazu auch mal nen Tutorial schreiben, dann muss sich nicht jeder diesen Thread durchlesen.

mfg
Balli

Go Up