Pages: 1 2 3 [4]   Go Down
Author Topic: Redfly - PHP Request starten  (Read 3947 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es gibt keine trivialen Fragen - nur triviale Lösungen smiley-grin
Code:
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:
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"));
« Last Edit: May 13, 2012, 01:02:44 pm by Marcus W » Logged


Germany
Offline Offline
Full Member
***
Karma: 8
Posts: 117
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
RedFly.socketSendPGM(http, PSTR("GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n"));

Code:
RedFly.socketSend(http, "GET /php/db2.php?wert="+ wertbuffer +" HTTP/1.1\r\nHost: "HOSTNAME"\r\n\r\n");
benutzt?
« Last Edit: May 13, 2012, 01:52:44 pm by Marcus W » Logged


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leider Funktioniert die Variante auch nicht, das Umwandeln in ein String /Char Funktioniert, jedoch sagt er mir dennoch folgenden Fehler:
Code:
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:
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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke mkl für deine Antwort,
aber magst du mir das Ganze einmal erklären.
Ich habe es einmal versucht:

Code:
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
« Last Edit: May 18, 2012, 09:41:04 am by Ballibum » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
char wertbuffer[100];
Das definiert einfach einen 100 Byte großen Puffer, der den String aufnehmen soll. Also ein char[100] Array.
Code:
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:
RedFly.socketSend(http, (char*) &wertbuffer); //Balli: Senden des entsprechenden Get-Befehls
Sollte auch als
Code:
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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: 1 2 3 [4]   Go Up
Jump to: