String und client.println();

Hallo,
Ich habe ein Problem mit einem String und client.println();
Ich versuche meinen Sketch übersichtlicher zu gestalten und will die Adresse des Server, den Pfad und die zu übermittelnde Daten in einzelne Variablen packen.
Wie realisiere ich das am besten?
Ich habe es mithilfe von Strings versucht:

String sendError_str;
String server_str = “”; //Adresse des Servers
String adress_str = “”; //Pfad auf dem Server
String TXIDA3_str = “”; //TXID A3
String TXIDA4_str = “”; //TXID A4 Die zu übermittelnden Daten
String TXIDA5_str = “”; //TXID A5
sendError_str = “GET http://” + server_str + adress_str + TXIDA3 + " HTTP/1.1";
client.println(sendError_str);

Um weitere Probleme auszuschließen habe ich das ganze als erstes mit dem Webclient example ausprobiert.
Das example läuft ohne Probleme…
Das angehängte Code Beispiel sitzt auf dem Webclient Example drauf.
Das Verbinden mit dem Server klappt problemlos ( client.connect(server, 80) )
Das Übertragen der Daten auf den Server klappt hingegen nicht.
Selbst das Ausgeben von sendError_str auf die Serielle Schnittstelle klappt nicht.

Hättet ihr eine Idee wie man das besser lösen könnte?
Vielen Dank im voraus

Selbst das Ausgeben von sendError_str auf die Serielle Schnittstelle klappt nicht.

In einem kleinen Test-Sketch sollte das klappen.

Wenn es im großen nicht geht, und du einen kleinen Arduino ( atmega328 oder so ) verwendest, ist es ein RAM-Speicherproblem.

char server[] = "127.0.0.1";  // oder was auch immer
...

client.print(F("GET http://"));
client.print(server);
...
client.println(F(" HTTP/1.1"));

Braucht deutlich weniger dynamischen RAM zur Laufzeit.

petit_miner:
Hallo,
Ich habe ein Problem mit einem String und client.println();
Ich versuche meinen Sketch übersichtlicher zu gestalten und will die Adresse des Server, den Pfad und die zu übermittelnde Daten in einzelne Variablen packen.
Wie realisiere ich das am besten?
Ich habe es mithilfe von Strings versucht:

Hättet ihr eine Idee wie man das besser lösen könnte?
Vielen Dank im voraus

Die Klasse String ist auf dem Arduino der ungünstigste Weg mit Zeichenketten umzugehen, da diese den Speicher fragmentieren und Du damit noch viel schneller keinen freien Speicher mehr hast. Der Weg ist die Verwendung von char-Arrays.
Hilfestellung dazu habe ich in Zeichenketten in C zusammen geschrieben.

Gruß Tommy

petit_miner:
Hättet ihr eine Idee wie man das besser lösen könnte?

Hast Du irgendeine Idee davon, was der Unterschied zwischen einer “URL-Adresse” und einem “GET-Request” ist?

Mal ein Beispiel:

Wenn ein Webclient (z.B. ein Webbrowser" oder Dein Arduino) die URL-Adresse “http://forum.arduino.cc/index.php/board,31.0.html” abrufen möchte, dann macht er folgendes:

  • der Client verbindet sich zuerst mit dem Server forum.arduino.cc
  • nach erfolgreich hergestellter Verbindung sendet er den Request:
GET /index.php/board,31.0.html

Oder, wenn Du die HTTP-Versionsnummer des HTTP-Protokolls 1.1vorgeben möchtest, mit dem Du kommunizieren möchtest, vielleicht auch:

GET /index.php/board,31.0.html HTTP/1.1

Der Request enthält am Anfang nie die Zeichenfolge “http://”, sondern die Zeichenfolge "GET ", gefolgt von Pfadname, Dateiname und ggf. Parametern.

Unterschied erkannt?

michael_x:
client.print(F("GET http://"));
client.print(server);
...

Nein, das "http" gefolgt von Doppelpunkt und Doppel-Schrägstrich hat in einem GET-Request nichts verloren. Weder vor noch nach dem GET! Außer man möchte als Antwort vom Server eine Fehlernummer mit einem Statuscode ab 500 aufwärts bekommen statt eine 200(OK)

Ok, Danke für die Antworten :slight_smile:
Mal wieder was dazu gelernt.
Ich schaue mir mal das mit den Zeichenketten in C an :wink: