Frage

Ich bin eine Arduino Bibliothek schriftlich http Anfrage auf Web zu veröffentlichen.

Ich bin mit der String-Klasse von http://arduino.cc/en/Tutorial/TextString

Mein Code verhält sich seltsam, wenn ich beziehe mich auf meine definierte String-Objekte nach einem Funktionsaufruf.

Hier tatsächlich Ich versuche, den Körper meiner GET-Anfrage zu erhalten und das Entfernen den HTTP-Header aus der http-GET-Anforderung Antwort.

Es folgt die Beschreibung:

Methodenaufruf:

  String body;  
  if(pinger.Get(host,path,&body))
  {
    Serial.println("Modified String Outside :");
    Serial.println(body);
    Serial.println();
    Serial.println("Modified String Outside Address");
    Serial.println((int)&body);
  }

Output

Modified String Outside :
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
Content-Length: 113
Date: Wed, 13 Jan 2010 14:36:28 GMT

<html>
<head>
<title>Ashish Sharma
</title>
</head>
<body>
Wed Jan 13 20:06:28 IST 2010
</body>
</html>


Modified String Outside Address
2273

Methode Beschreibung:

bool Pinger::Get(String host, String path, String *response) {
    bool connection = false;
    bool status = false;

    String post1 = "GET ";
    post1 = post1.append(path);
    post1 = post1.append(" HTTP/1.1");

    String host1 = "Host: ";
    host1 = host1.append(host);

    for (int i = 0; i < 10; i++) {
        if (client.connect()) {
            client.println(post1);
            client.println(host1);
            client.println();
            connection = true;
            break;
        }
    }

    int nlCnt = 0;
    while (connection) {
        if (client.available()) {
            int c = client.read();
            response->append((char) c);
            if (c == 0x000A && nlCnt == 0) {
                nlCnt++;
                if (response->contains("200")) {
                        status = true;
                        continue;
                    } else {
                        client.stop();
                        client.flush();
                        break;
                    }   
            }
        }
        if (!client.connected()) {
            client.stop();
            connection = false;
        }
    }           
    response = &response->substring(response->indexOf("\n\r\n"),response->length());    
    Serial.println("Modified String: ");
    Serial.println(*response);  

    Serial.println();
    Serial.print("Modified String Address: ");
    Serial.println((int)&response);
    return status;
}

Ausgabe:

Modified String: 
Ø
<html>
<head>
<title>Ashish Sharma
</title>
</head>
<body>
Wed Jan 13 20:06:28 IST 2010
</body>
</html>

Modified String Address: 2259

Wie aus dem Beispiel Objekt der String Referenz zu sehen ist mir die richtige Zeichenfolge in der Get-Methode geben, aber die Referenz des Strings Inhalte ändern, wenn die Get-Methode zurückgibt.

War es hilfreich?

Lösung

Wenn ich das richtig verstanden Code, werden Sie wahrscheinlich wollen, so etwas tun:

*response = response->substring(response->indexOf("\n\r\n"),response->length());

statt

response = &response->substring(response->indexOf("\n\r\n"),response->length());

Auch gibt es wahrscheinlich keine Notwendigkeit, in einem Zeiger (Referenz wahrscheinlich den Code sieht viel schöner machen würde) zu übergeben.

Andere Tipps

Zunächst einmal, Sie sind modyfying die Adresse der Zeichenfolge, nicht die Zeichenfolge selbst. Aber die Adresse der Zeichenfolge an die Funktion übergeben wurde nach Wert und damit kopiert. es innerhalb der Funktion ändern wird es nicht auf der Außenseite ändern.

Zweitens dieser Code hier ist schlecht:

response = &response->substring(response->indexOf("\n\r\n"),response->length());

Weil es einen Zeiger auf ein temporäres Objekt erzeugt - was bedeutet: a. Baumeln Zeiger, da das temporäre Objekt zerstört wird, nachdem der Ausdruck ausgewertet wurde

Was Sie wirklich will, ist das Objekt über einen Verweis (String& response) und ändern Sie es, nicht sein Zeiger:

response = response->substring(response->indexOf("\n\r\n"),response->length());

Das sollte funktionieren, zur Verfügung gestellt die String Klasse, die Sie richtig verwenden Überlastungen das Verhalten des Zuweisungsoperators =.

Die Zeile

 Serial.println((int)&response);

in Ihrer Funktion ist falsch Antwort ist bereits ein Zeiger (String * response), mit & Antwort, die Sie den Zeiger auf den Zeiger bekommen.
Ändern Sie ihn auf

Serial.println((int)response);

und Sie sollten die gleiche Adresse erhalten, wie mit

 Serial.println((int)&body);

, wo Körper ein String und & Körper ist der Zeiger auf den String

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top