Hallo Zusammen,
ich habe folgenden String:
GET /HalloForum HTTP/1.1
Wie extrahiere ich den Part HalloForum unter der Annahme, das dieser Teil sich vom Inhalt und der Länge stetig ändern kann?
Im Prinzip müsste ich nur die ersten 5 und die letzten 9 Zeichen abschneiden.
Wie geht das?
War zu voreilig. Lösung gefunden:
req.substring(5,req.length() -9)
String Objekte sind i. a. R. eine schlechte Idee bei Arduino uC.
Schreib das lieber gleich auf c strings (char array) um.
wie mache ich das? Bzw. welchen Vorteil habe ich dadurch?
Danke 
char *incomingbuffer="#201M22.19<#202M26.19<#203M0<"; // enthält den Text
pos = strstr(incomingbuffer, "#202M"); // nach #202M wird gesucht
if (pos)
{
float temperatur = atof(pos + 5);
Serial.print("Temperatur=");
Serial.println(temperatur );
}
}
oder so ähnlich
Die Vorteile werden sich dir noch erschliessen.
Da könnte ich zwei Methoden vorschlagen.
Die erste benutzt - wie deine Lösung - feste vorgegebene Längen,
die zweite sucht den ersten '/', geht einen weiter, sucht von dort das nächste " HTTP".
Der gefundene Bereich wird in einen Ergebnispuffer kopiert.
char data[] = "GET /HalloForum HTTP/1.1";
const byte maxLen = 32;
char extracted[maxLen + 1];
void setup() {
Serial.begin(115200);
byte len = min(strlen(data) - 5 - 9, maxLen);
memcpy(extracted, data + 5, len);
extracted[len] = 0;
printExtracted();
extracted[0] = 0; // clear old result
char* anfang = strchr(data, '/');
if (anfang) {
anfang++;
char* dahinter = strstr(anfang, " HTTP");
if (dahinter) {
byte len = min(dahinter - anfang, maxLen);
memcpy(extracted, anfang, len);
extracted[len] = 0;
}
}
printExtracted();
}
void printExtracted() {
Serial.print(F("extracted = '"));
Serial.print(extracted);
Serial.println(F("'"));
}
void loop() {}
extracted = 'HalloForum'
extracted = 'HalloForum'
oder man sucht dann mit pos = strstr(incomingbuffer, "HTTP/1.1");
und haut temporär eine NULL rein, falls man den ursprünglichen string noch mal btaucht, macht man wieder leer rein. So erspart man sich das kopieren
char *incomingbuffer = "GET /HalloForum/abcdef HTTP/1.1";
void setup() {
Serial.begin(115200);
Serial.println(incomingbuffer);
char* pos = strstr(incomingbuffer, "HTTP/1.1");
strcpy(pos - 1, 0);
Serial.println(incomingbuffer);
pos = strstr(incomingbuffer, "GET") + 4;
Serial.println(pos);
}
void loop() {}
Stimmt, das ist eine dritte Methode.
char* pos = strstr(incomingbuffer, "HTTP/1.1");
strcpy(pos - 1, 0);
Verwenden von pos ohne Test ist böse.
char* pos = strstr(incomingbuffer, " HTTP/1.1");
if (pos) {
strcpy(pos, 0);
Dafür braucht man aber nicht strcpy(). Statt dessen kann man Zeichen direkt über den Zeiger setzen.
Da hast du natürlich Recht.
char* pos = strstr(incomingbuffer, " HTTP/1.1");
if (pos) {
*pos = 0;
Manchmal denkt man halt auf Umwegen. Aber man sollte versuchen, diese Umwege so kurz wie möglich zu halten. 