Szyfrowane połączenie między serwerem a urządzeniem na ESP

Awatar użytkownika
klew
Posty: 657
Rejestracja: czw cze 27, 2019 12:16 pm

czw mar 05, 2020 1:55 pm

Niedawno do biblioteki w wersji "develop" zostały dodane szyfrowanie połączenia do serwera dla płytek ESP8266.
W związku z tym kilka osób zgłaszało różne problemy, które okazały się wynikać z braku pamięci RAM na ESP8266.
Szyfrowanie jest obecnie włączone domyślnie i jeśli ktoś chce, można je wyłączyć poleceniem

Kod: Zaznacz cały

  wifi.enableSSL(false);    // wifi to nazwa zmiennej od Supla::ESPWifi
U mnie na Wemos d1 r1 tak wygląda ilość wolnej pamięci na jakimś prostym programie:
1. bez szyfrowania - ilość wolej pamięci 40 kB
2. z szyfrowaniem, bez zmiany rozmairu ramek ssl - 13 kB

Samo włączenie SSL powoduje zjedzenie okoo 6 kB RAM-u. Następnie każda instancja "client secure" zjada około 22 kB.
Z tego powodu praktycznie nie da się utworzyć dwóch instacji "client secure" (np. do airly, do linków bezpośrednich itp.)
Włączanie innych ciekawych rozszerzeń do aplikacji (np. GUI, wifi manager, itd) też zjada pamięć, więc miejcie to na uwadze w swoich programach.
Najprostszy workaround polega na wyłączeniu szyfrowania SSL.

Jest też druga opcja, którą aktualnie sprawdzam. Polega ona na zmieniszeniu rozmiaru ramek używanych przez SSL. Niestety bibliteka SSL używana na serwerach Supli nie wspiera negocjacji rozmiaru ramki, więc nie da się tego bezpiecznie zrobić tylko po stronie urządzenia, choć u siebie zmniejszyłem ramki i jak na razie wszystko działa (oczywiście do czasu aż serwer nie wyśle na raz większej porcji danych).
Tak wygląda ilość wolnej pamięci w tym przypadku:
3. z szyfrowaniem, z redukcją ramek do 512 bajtów - 29 kB

Dam znać jeśli problem zostanie jakoś sensownie rozwiązany.
daniel
Posty: 31
Rejestracja: czw lut 15, 2018 7:29 am

sob mar 21, 2020 9:56 am

klew pisze:
czw mar 05, 2020 1:55 pm
choć u siebie zmniejszyłem ramki i jak na razie wszystko działa
Ja też od kilku dni testuję redukcję ramek

Kod: Zaznacz cały

static_cast<WiFiClientSecure*>(client)->setBufferSizes(512, 512); // EXPERIMENTAL
i nie zaobserwowałem jeszcze nic niepokojącego.
ODPOWIEDZ