mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ESP8266 - Weiterer HTTP Request nach 'user_tcp_recv_cb'?


Autor: Max M. (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ist es beim ESP8266 möglich, nach dem user_tcp_recv callback einen 
weiteren HTTP Request zum gleichen Ziel durchzuführen oder muss man erst 
in den user_tcp_discon callback laufen und eine erneute TCP Verbindung 
aufbauen? Bei mir läufts aktuell so:

Im user_tcp_connect callback rufe ich die Funktion für den ersten 
Request auf:
LOCAL void ICACHE_FLASH_ATTR
user_tcp_connect_cb(void *arg)
{
    struct espconn *pespconn = arg;

    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
    espconn_regist_disconcb(pespconn, user_tcp_discon_cb);

    user_send_get_requests(pespconn);
}

Nach der user_send_get_requests function springt der Controller eben 
in den user_tcp_recv callback. Von dort rufe ich dann eine Funktion 
auf, die einen weiteren Request durchführt:
LOCAL void ICACHE_FLASH_ATTR
user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
{
    struct espconn *pespconn = (struct espconn *)arg;
    //unwichtiger Code entfernt
    user_send_request_temp(pespconn, returnObject[n].ID)
}

Ich bekomme auf der seriellen Leitung keinen Error, also nehme ich mal 
an, dass arg wirklich vom Typ espconn ist? In der Funktion sieht es 
dann so aus:

LOCAL void ICACHE_FLASH_ATTR
user_send_request_temp(struct espconn *pespconn, char *reqID){
        //unwichtiger Code entfernt
  os_sprintf(pbuf,requestText,NET_DOMAIN);
  espconn_sent(pespconn, pbuf,os_strlen(pbuf));
  os_free(pbuf);
}

Ich lasse mir den Request Text seriell ausgeben und der passt soweit, 
trotzdem reagiert meine Website nicht darauf (wenn ich den Request 
manuell durchführe, klappt alles. Bzw. der erste Request funktioniert 
auch). Daher mein Verdacht, dass entweder der Parameter arg nicht vom 
Typ espconn ist bzw. es eine andere Instanz ist oder das man keine 2 
Requests durchführen kann ohne die Verbindung wieder zu schließen.

Okay, beim ersten Request bekomme ich das zurück:
HTTP/1.1 200 OK
Date: Sun, 04 Sep 2016 09:11:44 GMT
Server: Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 mod_auth_passthrough/2.1 mod_wsgi/3.3 Python/2.7.1
X-Powered-By: PHP/5.3.8
Connection: close
Content-Type: text/html

Anscheinend ist also die Verbindung bereits geschlossen. Wie öffne ich 
die wieder?

Jede Tipp / Verbesserungsvorschlag ist willkommen!

Grüße

: Bearbeitet durch User
Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das man einen weiteren HTTP Request absetzen möchte kann man dem Server 
über "Connection: keep-alive" mitteilen.

Der Server kann IIRC aber trotzdem die Verbindung dicht machen und einen 
neuen Verbindungsaufbau erzwingen. Klassisches HTTP macht nur einen 
Request pro Verbindung.

Autor: Max M. (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp, Jim.

Ich hab das nun mal so versucht (nach: 
http://bbs.espressif.com/viewtopic.php?t=1439#p4858
LOCAL void ICACHE_FLASH_ATTR
user_tcp_connect_cb(void *arg)
{
    struct espconn *pespconn = arg;

    os_printf("connect succeed !!! \r\n");

    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
    espconn_regist_disconcb(pespconn, user_tcp_discon_cb);


  espconn_set_opt(pespconn, ESPCONN_KEEPALIVE);

  uint32 keepalive = 2;
  espconn_set_keepalive(pespconn, ESPCONN_KEEPIDLE, &keepalive);
  keepalive = 2;
  espconn_set_keepalive(pespconn, ESPCONN_KEEPINTVL, &keepalive);
  keepalive = 3;
  espconn_set_keepalive(pespconn, ESPCONN_KEEPCNT, &keepalive);

    user_send_get_requests(pespconn); //Funktion für den ersten Request
}

Ändert aber leider nichts :(

Ich hab mir mal die Stati der Verbindung ausgeben lassen. Vor dem Senden 
des 2. Requests ist die Verbindung im Status ESPCONN_READ, nach 
Aufrufen der espconn_sent - Funktion im Status ESPCONN_WRITE. Also 
nicht disconnected. Trotzdem funktioniert der Request nicht...

: Bearbeitet durch User
Autor: Max M. (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder hast du das so gemeint?
GET /SQL.php?request=getReq / HTTP/1.1\r\nUser-Agent: curl/7.37.0\r\nHost: %s\r\nKeep-alive: timeout=15, max=100\r\nConnection: Keep-Alive\r\nAccept: */*\r\n\r\n

Funktioniert leider trotzdem nicht. Bedeutet das, dass mein Server die 
Verbindung schließt?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.