Всем привет. Спасибо за ваше время.
Я столкнулся с проблемой. У меня есть готовый работающий проект: esp32 отправляет HTTP запросы на сервер и связывается по Bluetooth с телефоном. Решил перейти с HTTP на HTTPS протокол и столкнулся с нехваткой памяти даже в пустом проекте (новом), где использую только Bluetooth и HTTPS.
Например, вот код с закомментированной bluetooth инициализацией (Ответ от сервера получен, как положено):
#include <BluetoothSerial.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <WiFi.h>
char* sendPostRequest(const char* url, const char* prefix, const char* payload);
void initHTTPS(const char* url);
void initWebSocket(const char* url);
BluetoothSerial bs;
WiFiClientSecure clientHTTPS;
HTTPClient http;
String ssid = "TP-ssid";
String password = "password";
String msg = "{\"chipId\":\"34545642323523564\"}";
String url = "https://blink-off.space:8443/init-token";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid.c_str(), password.c_str());
for(int i = 0; i < 10 && WiFi.status() != WL_CONNECTED; i++) {
Serial.print(".");
delay(1000);
}
//bs.begin("blName");
initHTTPS(url.c_str());
//bs.begin("blName");
}
void loop() {
Serial.printf("Free heap: %u bytes\n", ESP.getFreeHeap());
String rq = sendPostRequest(url.c_str(), "init", msg.c_str());
Serial.println(rq);
delay(5000);
}
void initHTTPS(const char* url) {
clientHTTPS.setInsecure(); // Отключаем проверку сертификата
//clientHTTPS.setCACert(echo_org_ssl_ca_cert);
if (!http.begin(clientHTTPS, url)) {
// Если инициализация соединения не удалась
//return nullptr;
}
http.addHeader("Content-Type", "application/json");
}
char* sendPostRequest(const char* url, const char* prefix, const char* payload) {
//String payloadString = String(payload);
String encryptedPayload = String(payload);
// Формируем JSON сообщение
char message[256];
snprintf(message, sizeof(message), "{\"%s\" : \"%s\"}", prefix, encryptedPayload.c_str());
int httpResponseCode = http.POST(message);
if (httpResponseCode > 0) {
String response = http.getString();
http.end();
// Выделяем память для ответа и копируем его туда
char* responseCStr = (char*)malloc(response.length() + 1);
if (responseCStr) {
strcpy(responseCStr, response.c_str());
}
return responseCStr;
} else {
http.end();
return nullptr;
}
}
Теперь раскомментируем строчку bs.begin(“blName”);
И видим цикличную ошибку (каждые 5 сек. при попытке отправки запроса):
[ 1823][E][ssl_client.cpp:37] _handle_error(): [start_ssl_client():273]: (-17040) RSA - The public key operation failed : BIGNUM - Memory allocation failed
[ 1837][E][WiFiClientSecure.cpp:144] connect(): start_ssl_client: -17040
Повторюсь, при удалении строчки с bluetooth инициализацией все работает отлично, но в моем основном проекте мне нужен и bluetooth и HTTPS одновременно. HTTP + Bluetooth работает коректно.
v258
20.Январь.2025 18:35:45
2
Думаете, ошибка выделения памяти обязательно связана с ее нехваткой?
Какие у вас будут предположения?
v258
20.Январь.2025 18:49:42
5
Предлагаете на хрустальном шаре погадать?
А скоко там свободной памяьи рисуется с https only?
И? Что Вы сделали, чтобы её решить? Вставили везде, где можно и нельзя контроль памяти? Хотя бы напечатали сколько её там у Вас осталось? Вы даже в том куске кода, что выложили не выдаёте никакого сообщения насчёт выделения памяти. Кто это будет делать?
Из 520 осталось 134… Прилично сожрано.
Нет, предлагаю обсудить варианты
Когда происходит инициализация bluetooth:
.Free heap: 70264 bytes
[ 2699][E][ssl_client.cpp:37] _handle_error(): [start_ssl_client():273]: (-17040) RSA - The public key operation failed : BIGNUM - Memory allocation failed
[ 2713][E][WiFiClientSecure.cpp:144] connect(): start_ssl_client: -17040
Когда https only:
Free heap: 134956 bytes
Ага, это под https только
Ну, уж, нет, спасибо. Обсуждать будем, когда будет что обсуждать. Вставляйте везде контроль, печатайте показывайте нам, тогда обсудим. А мастурбация – дело интимное, ею Вы самостоятельно занимайтесь.
Это не то. Вам надо найти все запросы памяти и у себя и в ибилиотеках и поставить там контрольную печать. Тогда Вы сможете что-то понять. Трындеть … простите … обсуждать варианты без этого – чистая мастурбация.
Пост был с целью найти человека, кто сталкивался с подобной проблемой и знает её решение, возможно)
К чему столько злости, никто не просит конкретно вас отвечать на данный пост и в таком контексте. “Мастурбацией” могу заняться в любой момент, спасибо)
1 лайк
открытые 03:45PM - 10 Dec 18 UTC
закрытые 07:46AM - 15 Aug 19 UTC
Status: Stale
### Hardware:
Board: Lolin D32
Core Installation/update date: commit: 88… 4e417a4943ae64897fc06db47915f24c00b59a 06/dec/2018
IDE name: Arduino IDE
Flash Frequency: 40Mhz
PSRAM enabled: no
Upload Speed: 921600
Computer OS: Windows 10
### Description:
I was testing the HTTPS functionality and it works perfectly. Last week I've added the BLE library, but it cause the failure of HTTPS calls. Actually Bluetooth is just instantiated BLEDevice::init(""); and never used, but it seems enough to make fail https calls. I think that the problem is the huge amount of ram stole by BLE library, but I'm not so confident about that.
This is what I get on serial port and it represent the common behaviour, everything works fine (even if there is that socket error) , you can see the huge (normal) amount of free heap:
```
[HTTPS] sending POST to myUrlAddress ...
Free Heap: 169876
[D][HTTPClient.cpp:265] beginInternal(): host: myHostAddress port: 443 url: myUrl
[E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
[I][ssl_client.cpp:151] start_ssl_client(): WARNING: Use certificates for a more secure communication!
[D][HTTPClient.cpp:977] connect(): connected to myHostAddress:443
[D][HTTPClient.cpp:1102] handleHeaderResponse(): code: 200
[D][HTTPClient.cpp:1105] handleHeaderResponse(): size: 45
[HTTPS] POST... code: 200
[D][HTTPClient.cpp:1239] writeToStreamDataBlock(): connection closed or file end (written: 45).
[D][HTTPClient.cpp:358] disconnect(): tcp stop
===========
{"content":null,"message":null,"result":"OK"}
===========
[HTTPS] end
[D][HTTPClient.cpp:369] disconnect(): tcp is closed
```
This is what I get when BLE is initialized (NOTE low free heap quantity):
```
[HTTPS] sending POST to myUrlAddress ...
Free Heap: 44952
[D][HTTPClient.cpp:265] beginInternal(): host: myHostAddress port: 443 url: myUrl
[E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
[I][ssl_client.cpp:151] start_ssl_client(): WARNING: Use certificates for a more secure communication!
[E][ssl_client.cpp:33] handle_error(): SSL - Memory allocation failed
[E][ssl_client.cpp:35] handle_error(): MbedTLS message code: -32512
[E][WiFiClientSecure.cpp:118] connect(): start_ssl_client: -32512
[D][HTTPClient.cpp:973] connect(): failed connect to myHostAddress:443
[W][HTTPClient.cpp:1262] returnError(): error(-1): connection refused
[HTTPS] POST... failed, error: connection refused
[HTTPS] end
[D][HTTPClient.cpp:369] disconnect(): tcp is closed
```
My questions are:
- are there tricks to save RAM memory taken by ble library?
- how many bytes takes an HTTPS call? Does it depends on message size?
Похоже, что там адская жопа. Тобозо пишет, что одновременно инстансы хттпс и бт не использует. Я ему верю - пересекались как-то по теме usb host on esp32.
char* sendPostRequest(const char* url, const char* prefix, const char* payload)
Вот тут попробуйте сделать функцию void, а возвращать значение через адрес передаваемой переменной. Не надо будет выделать память для ответа.
Zeembro:
malloc
после каждого malloc должен быть вызов free(), иначе память утечет - это во-первых.
во- вторых, не все камни умеют в динамическое распределение памяти, при работе с контроллерами лучше статически адресовать все что надо.
коллеги добавят, должно быть еще чето…
проблема явно не в той функции sendPostRequest,проверено)
я увидел маллок без освобождения памяти, в одной секции кода, в стальное не вникал.
Если бы Вы знали в чём проблема, этого поста бы не было вовсе.
Zeembro:
проверено
Если бы Вы умели проверять – тоже.
Я Вам подробно рассказал, что нужно сделать,
но Вы почему-то посчитали это злостью и предпочли в ответ быкануть.
Хозяин – барин, не хотите --не делайте. Там можете до морковкина заговения гадать что там за беда, разве что случайно повезёт.