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

Я не использую метод sendPostRequest, когда тетсил WebSocket, так что проблема точно не в нём.
И я считаю неадекватными всего двух человек: flexprint и челмедведосвина.

Конечно, понимаю, что утечка памяти есть, но вижу по циклу, что она не критична, потому что каждые 5 секунд в serial выводится free heap.

Пример:
Free heap: 126 200 bytes -> Free heap: 126 185 bytes.

А при инициализации Bluetooth сразу же появляется ошибка HTTPS, следовательно, утечка памяти тут вообще ни при чём.
Надеюсь, теперь всё понятно. Нужно было сразу расписать для адекватного большинства — это мой прокол, но я посчитал, что слов “Проблема точно не в этом” будет достаточно.

В каком плане я молчу про WebSocket? Я упомянул его выше.

В своём проекте я без проблем использую WebSocket (ws) + HTTP + Bluetooth + кучу других библиотек — всё работает стабильно, хватает и flash, и оперативной памяти. Но как только я решил перейти с HTTP на HTTPS, или хотя бы с ws на wss для WebSocket, сразу столкнулся с проблемами.

На ESP8266 подобные проекты реализуются без проблем) но там, очевидно, нет bluetoth

:joy: :joy:

Однако там не встретишь подобного “общения”.
Опять же, адекватность — понятие субъективное, и для каждого она своя.

Так у меня реализация именно wss. И в плане именно wss надо дорабатывать.

Очевидно, что не достаточно, потому что вы просто не в состоянии оценить, в чем проблема. Это вообще не обсуждается, иначе вы бы не задавали вопрос, а решили его сами. Ваши предположения, что тут важно, а что нет - вообще не имеют веса и не учитываются в обсуждении.

Форум - самый неэффективный способ дебага программ, и к нему прибегают только те, кто совершенно не волокет в вопросе.
Так что не удивляйтесь, почему к вам такое отношение и тут, и на том форуме.

К тому же, как я уже написал - адекватный программист, которые понимает - просто исправил бы проблему с утечкой, вместо того чтоб с пеной у рта доказывать, что дело не в этом. А вы не исправили… Почему? - потому что не можете, очевидно же.

1 лайк

Поскольку в ЕСП32 один радиомодуль, я вообще не играю в БТ одновременно с ВиФи. Это всегда будет глючно. А участники в курсе, что я неплохо знаю ЕСП32.

Но решил посоветоваться с “гуру”. :wink:
Вот промт:

у контроллера ESP32 один радиомодуль и совмещение работы с BLE И WiFi вызывает трудности. При этом при использовании wifi client secure вообще возникают ошибки на этапе инициализации. Ты слышал о чем-то подобном? Пояснить и помочь можешь?

Вот ответ:

Да, у ESP32 есть один радиомодуль, который используется как для WiFi, так и для BLE. Совмещение этих двух функций может вызывать проблемы, особенно при использовании в режиме клиента WiFi с TLS (WiFiClientSecure) и одновременной работы с BLE. Это связано с ограничением ресурсов и особенностями работы стеков BLE и WiFi в ESP32.

Проблемы при одновременном использовании WiFi и BLE

  1. Ограничение радиомодуля: Поскольку используется один радиомодуль, BLE и WiFi делят его, что может вызывать конфликты и потерю соединения.
  2. Утечка памяти: Одновременная работа двух стеков может вызвать проблемы с нехваткой памяти, особенно при использовании WiFiClientSecure, который требует значительных ресурсов для шифрования.
  3. Тайминги: BLE требует стабильного времени для передачи данных, что может конфликтовать с WiFi, если они работают одновременно.
  4. Конфликт конфигурации: WiFi и BLE могут требовать разных настроек радиочастотного модуля.

Ошибки на этапе инициализации WiFiClientSecure

Если ошибки возникают при использовании WiFiClientSecure вместе с BLE, это может быть связано с несколькими факторами:

  • Недостаточно памяти: Библиотека TLS требует большого объема памяти, что усложняет совместное использование с BLE.
  • Задержки в обработке задач: BLE и WiFi имеют свои задачи в RTOS, и если BLE занимает слишком много времени, это может нарушить работу WiFi.
  • Конфликт настроек радиомодуля: BLE и WiFi используют разные частоты и могут конфликтовать.

Рекомендации по устранению проблем

  1. Выберите правильный режим работы BLE: Используйте BLE в режиме передачи данных с минимальным потреблением, если это возможно.
  2. Оптимизируйте память:
    • Убедитесь, что у вас достаточно памяти для TLS. Попробуйте уменьшить размер буфера для TLS, используя WiFiClientSecure::setBufferSizes():
      WiFiClientSecure client;
      client.setBufferSizes(512, 512); // RX и TX буферы по 512 байт
      
    • Отключите неиспользуемые библиотеки или оптимизируйте стек BLE.
  3. Настройте приоритеты задач:
    • Используйте esp_task_wdt для предотвращения блокировки задач.
    • Переместите задачи BLE или WiFi в отдельные ядра процессора, если это возможно.
  4. Ограничьте совместное использование WiFi и BLE:
    • Переключайте радиомодуль между BLE и WiFi в зависимости от текущих задач.
    • Используйте функцию esp_bt_controller_disable() и esp_bt_controller_enable() для временного отключения BLE при использовании WiFi.
  5. Обновите SDK и библиотеки:
    • Используйте последнюю версию ESP-IDF или Arduino Core, так как в последних версиях могут быть исправлены проблемы с одновременной работой WiFi и BLE.

Пример переключения между BLE и WiFi

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <esp_bt.h>

void useWiFi() {
    esp_bt_controller_disable(); // Отключаем BLE
    WiFi.begin("SSID", "PASSWORD");
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("WiFi connected.");
}

void useBLE() {
    WiFi.disconnect(true); // Отключаем WiFi
    WiFi.mode(WIFI_OFF);
    esp_bt_controller_enable(ESP_BT_MODE_BLE); // Включаем BLE
    Serial.println("BLE enabled.");
}

void setup() {
    Serial.begin(115200);

    useWiFi();
    // Работайте с WiFi здесь
    delay(5000);

    useBLE();
    // Работайте с BLE здесь
}

Попробуйте эти рекомендации и сообщите, если возникнут дополнительные вопросы.

За ним всегда стоит внимательно проверять, но что-то на вооружение взять можно. ИМХО.

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

1 лайк

Спасибо за обратую связь, но эти способы были проверны в первую очередь)

WiFi (HTTP + WebSocket) и Bluetooth (BLE не тестил) без проблем работают на одной антене в проекте при разбитии на разных ядрах. Проблема в нехватке оперативной памяти для внедрения HTTPS (для TLS).

chatGPT не знает например то, что у объекта класса WiFiClientSecure нет метода setBufferSizes))

Вы можете считать меня плохим программистом и будете правы, конечно же.

Но что проблема не вэтой течке - 100%. Устанить утечку не проблема даже для такого прораммиста как я)

Зебра, уважаемый! Если модуль один, то какая разница на одном или разных ядрах?
Это-то тут причем?
Дельный совет - ищи TLS библиотеку менее прожорливую. В ней все дело. Она держит в памяти всю криптографию, скорее всего для скорости работы. Она вообще в ЕСП32 давно уже плохая с кучей нареканий. И никак её не обновят.


ну и в догонку. Твой маллок конечно на вопрос никакого влияния не имеет. НО это плохая и раздражающая ошибка, То, что ты её не убрал - просто неуважение к аудитории. Отсюда и отношение к тебе. Не стоило так себя вести. ИМХО.

Моё поведение продиктовано некорректным поведением определённых личностей, с моей точки зрения, в текущем посте) С адекватными людьми я веду себя корректно.

“Если модуль один, то какая разница, на одном или разных ядрах?” — я имел в виду, как это реализовано в моём текущем проекте. Это действительно не критично, вы правы.

Совет с поиском библиотек правильный, как раз об этом я говорил выше.

Мы вроде обсуждали WIFI и BLE в моем проекте. Проблем в работе нет. У меня рабочий пульт стоит.

Просто пользователь не может понять, что надо не просто кивать на HTTPS, а полностью проверять код. На мой взгляд просто проявилось при переходе, а ошибка УЖЕ было.

Да, вы правы. Нужно “добивать” wss вмсето HTTPS. Но не факт, что в связке с Bluetooth на esp32 что-то получится, буду пробовать. Если что выйдет, отпишу)

у вас же 8266

На 8266 у меня другой пульт. Кстати, на ней я правил библиотеку <WiFiClientSecure.h>

1 лайк

И постарайтесь избегать в функциях лишних преобразований c_str к Sitring, а потом обратно. В приведенном Вами тексте есть такое, а это сильно “жрет” память. Если уж передаете С строку, то дальше и работайте, как с С строкой.

Принято, спасибо

Я бы перефразировал: старайтесь избегать объектов класса String.

Предыдущий совет несколько путает применением слова c_str. Наверное имелось в виду конверсия ASCIIZ → String и обратно? Потому что String → c_str операция практически бесплатная.

Вот, что у него:
До вызова .begin()

MALLOC_CAP_INTERNAL:
  Total size: 246740 bytes
  Free size: 163092 bytes
  Largest free block: 110580 bytes

MALLOC_CAP_DEFAULT:
  Total size: 232776 bytes
  Free size: 149556 bytes
  Largest free block: 110580 bytes

А это - после:

MALLOC_CAP_INTERNAL:
  Total size: 246740 bytes
  Free size: 71700 bytes
  Largest free block: 55284 bytes

MALLOC_CAP_DEFAULT:
  Total size: 232776 bytes
  Free size: 50212 bytes
  Largest free block: 47092 bytes

Я бы запустил на esp32s3 с нормальным кол-вом памяти, чтобы посмотреть, сколько всего памяти надо для нормальной работы.

Потом полез бы в библиотеку блутуз, смотреть, куда они память сжирают.

Но это уже само по себе странно, что total size меньше 300кб. Это както не нормально.

:smiling_face_with_tear:

я думаю купить камень ESP32-WROVER с PSRAM памятью 2МБ, возможно что и выйдет

Мой текущий камень - ESP32-WROOM32 без PSRAM