Hallo
Ich betreibe AsyncWebServer mit ArduinoJSON auf einem ESP8266. Bei
meiner Meinung nach eher leichtgewichtigen GET Requests bekomme ich
OutOfMemory-Fehler sobald die Requests zu schnell hintereinander kommen.
Ich starte mit etwa 15000 bytes freiem Speicher. Wenn zwischen den
Requests genug Zeit vergeht, erholt sich der Speicher sofort wieder, so
dass ich nicht von einem Leak ausgehe.
Da er scheinbar bei jedem Request ca. 3k verbraucht, geht er dann aber
recht schnell in die Knie.
Das Reponse-json hat folgende Form:
1 | {
|
2 | "datetime": "2022-11-18T20:16:59"
|
3 | }
|
Wird wohl nicht den Ausschlag geben. Eher noch die HTTP-Header, die auf
etwas über 400 byte kommen.
Die Requests könnte ich clientseitig drosseln, fänd das aber nicht so
dolle. Gibt es irgendeine Möglichkeit stattdessen den Server zu
drosseln?
1 | AsyncWebServer server(80);
|
2 |
|
3 | void Server_init()
|
4 | {
|
5 | //...
|
6 |
|
7 | server.on(
|
8 | "/api/gtime",
|
9 | HTTP_GET,
|
10 | [](AsyncWebServerRequest *request)
|
11 | {
|
12 | debug("requesting time...");
|
13 | debug("Free memory: " + String(system_get_free_heap_size()) + " bytes");
|
14 | String datetime = Clock_getDateTimeString();
|
15 | StaticJsonDocument<50> jsonResponse;
|
16 | jsonResponse["datetime"] = datetime;
|
17 | jsonDataSuccess(request, 200, jsonResponse);
|
18 | });
|
19 |
|
20 | server.begin();
|
21 | }
|
22 |
|
23 | void jsonDataSuccess(AsyncWebServerRequest *request, int httpCode, StaticJsonDocument jsonResponse)
|
24 | {
|
25 | AsyncResponseStream *response = request->beginResponseStream("application/json");
|
26 | response->setCode(httpCode);
|
27 | serializeJson(jsonResponse, *response);
|
28 |
|
29 | request->send(response);
|
30 | }
|