ESP32: HTTPS + Bluetooth - нехватка оперативной памяти

Всем привет. Спасибо за ваше время.

Я столкнулся с проблемой. У меня есть готовый работающий проект: 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 работает коректно.

Думаете, ошибка выделения памяти обязательно связана с ее нехваткой?

Какие у вас будут предположения?

Предлагаете на хрустальном шаре погадать?

А скоко там свободной памяьи рисуется с https only?

И? Что Вы сделали, чтобы её решить? Вставили везде, где можно и нельзя контроль памяти? Хотя бы напечатали сколько её там у Вас осталось? Вы даже в том куске кода, что выложили не выдаёте никакого сообщения насчёт выделения памяти. Кто это будет делать?

Free heap: 134956 bytes

Из 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 лайк

Похоже, что там адская жопа. Тобозо пишет, что одновременно инстансы хттпс и бт не использует. Я ему верю - пересекались как-то по теме usb host on esp32.

Спасибо, почитаю)

char* sendPostRequest(const char* url, const char* prefix, const char* payload)

Вот тут попробуйте сделать функцию void, а возвращать значение через адрес передаваемой переменной. Не надо будет выделать память для ответа.

после каждого malloc должен быть вызов free(), иначе память утечет - это во-первых.
во- вторых, не все камни умеют в динамическое распределение памяти, при работе с контроллерами лучше статически адресовать все что надо.
коллеги добавят, должно быть еще чето…

проблема явно не в той функции sendPostRequest,проверено)

я увидел маллок без освобождения памяти, в одной секции кода, в стальное не вникал.

Если бы Вы знали в чём проблема, этого поста бы не было вовсе.

Если бы Вы умели проверять – тоже.

Я Вам подробно рассказал, что нужно сделать,

но Вы почему-то посчитали это злостью и предпочли в ответ быкануть.

Хозяин – барин, не хотите --не делайте. Там можете до морковкина заговения гадать что там за беда, разве что случайно повезёт.