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


von Max M. (maxmicr)


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:
1
LOCAL void ICACHE_FLASH_ATTR
2
user_tcp_connect_cb(void *arg)
3
{
4
    struct espconn *pespconn = arg;
5
6
    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
7
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
8
    espconn_regist_disconcb(pespconn, user_tcp_discon_cb);
9
10
    user_send_get_requests(pespconn);
11
}

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:
1
LOCAL void ICACHE_FLASH_ATTR
2
user_tcp_recv_cb(void *arg, char *pusrdata, unsigned short length)
3
{
4
    struct espconn *pespconn = (struct espconn *)arg;
5
    //unwichtiger Code entfernt
6
    user_send_request_temp(pespconn, returnObject[n].ID)
7
}

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:

1
LOCAL void ICACHE_FLASH_ATTR
2
user_send_request_temp(struct espconn *pespconn, char *reqID){
3
        //unwichtiger Code entfernt
4
  os_sprintf(pbuf,requestText,NET_DOMAIN);
5
  espconn_sent(pespconn, pbuf,os_strlen(pbuf));
6
  os_free(pbuf);
7
}

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:
1
HTTP/1.1 200 OK
2
Date: Sun, 04 Sep 2016 09:11:44 GMT
3
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
4
X-Powered-By: PHP/5.3.8
5
Connection: close
6
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
von Jim M. (turboj)


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.

von Max M. (maxmicr)


Lesenswert?

Danke für den Tipp, Jim.

Ich hab das nun mal so versucht (nach: 
http://bbs.espressif.com/viewtopic.php?t=1439#p4858
1
LOCAL void ICACHE_FLASH_ATTR
2
user_tcp_connect_cb(void *arg)
3
{
4
    struct espconn *pespconn = arg;
5
6
    os_printf("connect succeed !!! \r\n");
7
8
    espconn_regist_recvcb(pespconn, user_tcp_recv_cb);
9
    espconn_regist_sentcb(pespconn, user_tcp_sent_cb);
10
    espconn_regist_disconcb(pespconn, user_tcp_discon_cb);
11
12
13
  espconn_set_opt(pespconn, ESPCONN_KEEPALIVE);
14
15
  uint32 keepalive = 2;
16
  espconn_set_keepalive(pespconn, ESPCONN_KEEPIDLE, &keepalive);
17
  keepalive = 2;
18
  espconn_set_keepalive(pespconn, ESPCONN_KEEPINTVL, &keepalive);
19
  keepalive = 3;
20
  espconn_set_keepalive(pespconn, ESPCONN_KEEPCNT, &keepalive);
21
22
    user_send_get_requests(pespconn); //Funktion für den ersten Request
23
}

Ä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
von Max M. (maxmicr)


Lesenswert?

Oder hast du das so gemeint?
1
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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.