Я не использую метод sendPostRequest, когда тетсил WebSocket, так что проблема точно не в нём.
И я считаю неадекватными всего двух человек: flexprint и челмедведосвина.
Конечно, понимаю, что утечка памяти есть, но вижу по циклу, что она не критична, потому что каждые 5 секунд в serial выводится free heap.
А при инициализации Bluetooth сразу же появляется ошибка HTTPS, следовательно, утечка памяти тут вообще ни при чём.
Надеюсь, теперь всё понятно. Нужно было сразу расписать для адекватного большинства — это мой прокол, но я посчитал, что слов “Проблема точно не в этом” будет достаточно.
В каком плане я молчу про WebSocket? Я упомянул его выше.
В своём проекте я без проблем использую WebSocket (ws) + HTTP + Bluetooth + кучу других библиотек — всё работает стабильно, хватает и flash, и оперативной памяти. Но как только я решил перейти с HTTP на HTTPS, или хотя бы с ws на wss для WebSocket, сразу столкнулся с проблемами.
На ESP8266 подобные проекты реализуются без проблем) но там, очевидно, нет bluetoth
Очевидно, что не достаточно, потому что вы просто не в состоянии оценить, в чем проблема. Это вообще не обсуждается, иначе вы бы не задавали вопрос, а решили его сами. Ваши предположения, что тут важно, а что нет - вообще не имеют веса и не учитываются в обсуждении.
Форум - самый неэффективный способ дебага программ, и к нему прибегают только те, кто совершенно не волокет в вопросе.
Так что не удивляйтесь, почему к вам такое отношение и тут, и на том форуме.
К тому же, как я уже написал - адекватный программист, которые понимает - просто исправил бы проблему с утечкой, вместо того чтоб с пеной у рта доказывать, что дело не в этом. А вы не исправили… Почему? - потому что не можете, очевидно же.
Поскольку в ЕСП32 один радиомодуль, я вообще не играю в БТ одновременно с ВиФи. Это всегда будет глючно. А участники в курсе, что я неплохо знаю ЕСП32.
Но решил посоветоваться с “гуру”.
Вот промт:
у контроллера ESP32 один радиомодуль и совмещение работы с BLE И WiFi вызывает трудности. При этом при использовании wifi client secure вообще возникают ошибки на этапе инициализации. Ты слышал о чем-то подобном? Пояснить и помочь можешь?
Вот ответ:
Да, у ESP32 есть один радиомодуль, который используется как для WiFi, так и для BLE. Совмещение этих двух функций может вызывать проблемы, особенно при использовании в режиме клиента WiFi с TLS (WiFiClientSecure) и одновременной работы с BLE. Это связано с ограничением ресурсов и особенностями работы стеков BLE и WiFi в ESP32.
Проблемы при одновременном использовании WiFi и BLE
Ограничение радиомодуля: Поскольку используется один радиомодуль, BLE и WiFi делят его, что может вызывать конфликты и потерю соединения.
Утечка памяти: Одновременная работа двух стеков может вызвать проблемы с нехваткой памяти, особенно при использовании WiFiClientSecure, который требует значительных ресурсов для шифрования.
Тайминги: BLE требует стабильного времени для передачи данных, что может конфликтовать с WiFi, если они работают одновременно.
Конфликт конфигурации: WiFi и BLE могут требовать разных настроек радиочастотного модуля.
Ошибки на этапе инициализации WiFiClientSecure
Если ошибки возникают при использовании WiFiClientSecure вместе с BLE, это может быть связано с несколькими факторами:
Недостаточно памяти: Библиотека TLS требует большого объема памяти, что усложняет совместное использование с BLE.
Задержки в обработке задач: BLE и WiFi имеют свои задачи в RTOS, и если BLE занимает слишком много времени, это может нарушить работу WiFi.
Конфликт настроек радиомодуля: BLE и WiFi используют разные частоты и могут конфликтовать.
Рекомендации по устранению проблем
Выберите правильный режим работы BLE: Используйте BLE в режиме передачи данных с минимальным потреблением, если это возможно.
Оптимизируйте память:
Убедитесь, что у вас достаточно памяти для TLS. Попробуйте уменьшить размер буфера для TLS, используя WiFiClientSecure::setBufferSizes():
WiFiClientSecure client;
client.setBufferSizes(512, 512); // RX и TX буферы по 512 байт
Отключите неиспользуемые библиотеки или оптимизируйте стек BLE.
Настройте приоритеты задач:
Используйте esp_task_wdt для предотвращения блокировки задач.
Переместите задачи BLE или WiFi в отдельные ядра процессора, если это возможно.
Ограничьте совместное использование WiFi и BLE:
Переключайте радиомодуль между BLE и WiFi в зависимости от текущих задач.
Используйте функцию esp_bt_controller_disable() и esp_bt_controller_enable() для временного отключения BLE при использовании WiFi.
Обновите 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 здесь
}
Попробуйте эти рекомендации и сообщите, если возникнут дополнительные вопросы.
За ним всегда стоит внимательно проверять, но что-то на вооружение взять можно. ИМХО.
Спасибо за обратую связь, но эти способы были проверны в первую очередь)
WiFi (HTTP + WebSocket) и Bluetooth (BLE не тестил) без проблем работают на одной антене в проекте при разбитии на разных ядрах. Проблема в нехватке оперативной памяти для внедрения HTTPS (для TLS).
chatGPT не знает например то, что у объекта класса WiFiClientSecure нет метода setBufferSizes))
Зебра, уважаемый! Если модуль один, то какая разница на одном или разных ядрах?
Это-то тут причем?
Дельный совет - ищи TLS библиотеку менее прожорливую. В ней все дело. Она держит в памяти всю криптографию, скорее всего для скорости работы. Она вообще в ЕСП32 давно уже плохая с кучей нареканий. И никак её не обновят.
ну и в догонку. Твой маллок конечно на вопрос никакого влияния не имеет. НО это плохая и раздражающая ошибка, То, что ты её не убрал - просто неуважение к аудитории. Отсюда и отношение к тебе. Не стоило так себя вести. ИМХО.
Моё поведение продиктовано некорректным поведением определённых личностей, с моей точки зрения, в текущем посте) С адекватными людьми я веду себя корректно.
“Если модуль один, то какая разница, на одном или разных ядрах?” — я имел в виду, как это реализовано в моём текущем проекте. Это действительно не критично, вы правы.
Совет с поиском библиотек правильный, как раз об этом я говорил выше.
Мы вроде обсуждали WIFI и BLE в моем проекте. Проблем в работе нет. У меня рабочий пульт стоит.
Просто пользователь не может понять, что надо не просто кивать на HTTPS, а полностью проверять код. На мой взгляд просто проявилось при переходе, а ошибка УЖЕ было.
Да, вы правы. Нужно “добивать” wss вмсето HTTPS. Но не факт, что в связке с Bluetooth на esp32 что-то получится, буду пробовать. Если что выйдет, отпишу)
И постарайтесь избегать в функциях лишних преобразований c_str к Sitring, а потом обратно. В приведенном Вами тексте есть такое, а это сильно “жрет” память. Если уж передаете С строку, то дальше и работайте, как с С строкой.
Я бы перефразировал: старайтесь избегать объектов класса String.
Предыдущий совет несколько путает применением слова c_str. Наверное имелось в виду конверсия ASCIIZ → String и обратно? Потому что String → c_str операция практически бесплатная.