Wpis z mikrobloga

Siemka, mam duży problem ze swoim ESP8266, chodzi o wypisywanie danych z mikrokontrolera (duża ilość danych) wprost do przeglądarki.
No więc, chciałbym zmodernizować moją funkcję, aby zbierać dane z logów i następnie wysłać je wszystkie do przeglądarki. Najpierw próbowałem funkcji beginResponseStream, ale moja tablica jest zbyt duża, aby można ją było wysłać raz (tablica ma 300 wierszy i każdy wiersz ma 100 wartości typu char). W efekcie tym, do przeglądarki trafia jakieś 50 wierzysz (może to być problem z małą ilością wolnej pamięci heap. Czytałem na wielu stronach internetowych, że najlepszą metodą wysyłania dużych danych jest używanie chunków (kawałków), aby zminimalizować wykorzystanie pamięci heap (której w moim przypadku mam bardzo mało, bo tylko 5-10KB).
W zasadzie to od ok. 7 dni próbuję przepisać swój kod z wykorzystaniem beginChunkedResponse(), ale za każdym razem bez powodzenia. W związku z tym, prosiłbym o pomoc w napisaniu kodu. Najlepszym rozwiązaniem według mnie byłaby możliwość, aby chunki były wysyłane co np. 20 wierszy z tablicy. Jeśli to rozwiązanie ma wady i nie jest wydajne, chętnie posłucham rad, gdyż pierwszy raz używam tej metody.

Mój poprzedni kod wygląda tak:

server.on("/logs1", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncResponseStream *response = request->beginResponseStream("text/plain; charset=UTF-8");
for (int z = 0; z < iloscLogow; z++){
response->print(logs[z]);
response->print("\n");
}
request->send(response);
});

Natomiast metoda ma podstawową postać:

server.on("/ten", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginChunkedResponse("text/html; charset=UTF-8", [](uint8_t *buffer, size_t maxlen, size_t index) -> size_t {

});
request->send(response);
// response->addHeader("Access-Control-Allow-Origin", "*");
// response->addHeader("Access-Control-Allow-Methods", "GET");
// response->addHeader("Access-Control-Allow-Headers", "Content-Type");
// response->addHeader("Access-Control-Max-Age", "86400");
// response->addHeader("Cache-Control", "no-cache");
// response->addHeader("Connection", "keep-alive");
});

#mikrokontrolery #esp8266 #nodemcu #arduino #programowanie #jezykc #c #elektronika @zetisdead
  • 7
@patrolez: A to widziałem też, próbowałem i z tym, ale ciągle mi to nie działa. W samym kodzie mam też problem, bo nie wiem jak mam podzielić te dane na 20 wierszy, i jak w ogóle zwrócić (returnem) jakieś zmienne (nie zwracam tam gotowego stringu, a bodajże size_t, a to dodatkowo są chyba pointery, z którymi nie za bardzo się lubię. Nie wiem jak to zrobić prosto i efektywnie. Jestem
@sorek: Ale to i tak niewiele zmienia, nadal pamięć heap nie jest jakaś kosmiczna, a poza tym ESP8266 mi wystarcza. Potrzebuję tą jedyną kwestię rozwiązań i nic więcej.
Poza tym, mam rozbudowany układ zrobiony pod piny z ESP8266, więc ESP32 nie wchodzi w grę.