Esp32 проблема с Bluetooth
- Войдите на сайт для отправки комментариев
Сб, 20/03/2021 - 10:53
Добрый день. Есть у меня 1 проект переделываю с ардуины на есп. Комуникация со смартфоном происходит через Bluetooth.
На ЕСП для этих целей пытаюсь использовать библиотеку BluetoothSerial. Суть проблемы: Первый коннект происходит... данные передаются туда сюда.. но как только я отключился от платы повторное подключение уже невозможно до перезагрузки платы. Может кто сталкивался в чем может быть проблема. Спасибо.
Проблема в том, что вы не хотите получить помощь и разобраться.
При таком составе вопроса можно только послать человека читать примеры из библиотек БТ.
Проблема в том, что вы не обрабатываете отключение на ESP. Это же очевидно.
Поверьте я прочитал все примеры, более того я их все перепробовал, перелопатил кучу форумов в том числе и англоязычных. ... я даже запустил SPP на родном фреймворке ESP-IDF. И представляете он там корректно работает и даже конект реконнект срабатывает как надо. А вот библиотека BluetoothSerial.h под ардуиновским фреймворком отрабатывает не корректно. Задавание вопросов на форму - последняя инстанция в моей практике, за частую именно из за таких товарищей как вы. Не хотите - не помогайте... просто проходите мимо. Я надеялся здесь встретить такого человека который уже наступил на подобные грабли и успешно через них переступил. Для такого человека инфы в вопросе более чем достаточно. Спасибо что обратили внимание.
Я первую инстанцию пропустил, похоже. Проблемный код был уже? Ванга давно на форуме не показывается
Ну, если достаточно, то тогда ОК. Подожду телепата, который в курсе, что там наваяли.
Для альтернативно одаренных разжую. Во первых, для решения СВОЕЙ проблемы выкладывать левый код - верх идиотизма. Во вторых, из этого идиотизма можно было извлечь пользу, поскольку приведенный левый код содержит решение вашей проблемы, но вы не в состоянии его узреть. Теперь начинает проясняться?
Я конечно извиняюсь... СЕР. Но с чего вы решили что это левый код... Вот он написан у меня на экране.. откомпилирован и залит в камень... протестирован еще раз перед тем как задавать вопрос ВАМ многоуважаемому стандартно одаренному. Я просто постарался проявить в Вам уважение и не нагружая лишним информационным мусором воссоздал только ту часть проекта которая вызвала у меня трудности. Теперь я надеюсь вы снизойдете до обычних "длблть" и попробуете все же им помочь, или и далее будете колотить понты ничего из себя не представляя по факту? Заранее большое человеческое спасибо.
Классический пример из интернетов...
Хорошо, пусть будет по вашему. Вам ответили уже в #2. У вас в сетапе идет коннект, а в лупе статус коннекта нигде не проверяется и не реконнектится при отвале. А нужно чтобы if(!блютуз.connected()) блютуз.сonnect();
О хоспадэ... он слейв... он ждет коннекта... он самостоятельно никуда не конектится... вы действительно немного пропустили... Телефон мабила из мастер... он инициирует соединение... платка всего лишь ждет пока к ней ктото приконектится.
Еще идеи будут?
Ну какая хрен разница, мастер он или слейв. Если мастер отпал не факт, что слейв сам должен сбросить соединение и приготовиться к новому. Курите библиотеку в части connect/disconnect, pair/unpair. Модуль сам не будет отвал соединения обрабатывать
В том то и дело что должен обрабатывать но не обрабатывает так как положено. событие в колбек приходит... но но чето в это библиотеке не так и модуль подмораживает. Собсно об этом и интересовался когда задавал вопрос. Я ж говорю, я даже воссоздал SPP на чистом ЕSP фреймворке по доке от ESPRESSIF... без ардуины... и там он работает корректно. никаких дейсвий после дизконнекта производить не нужно. Модуль сразу готов к новому коннекту. По агрлофорумах встречал эту проблемму и люди пишут что проблема именно в ардуиновском фреймворке. Вот например https://github.com/espressif/arduino-esp32/issues/4915
I look forward to Arduino Core 1.0.6. available through the Board Manager.
думал мож кто знает как его фиксить в текущей версии.
В том то и дело что должен обрабатывать но не обрабатывает так как положено. событие в колбек приходит... но но чето в это библиотеке не так и модуль подмораживает. Собсно об этом и интересовался когда задавал вопрос. Я ж говорю, я даже воссоздал SPP на чистом ЕSP фреймворке по доке от ESPRESSIF... без ардуины... и там он работает корректно. никаких дейсвий после дизконнекта производить не нужно. Модуль сразу готов к новому коннекту. По агрлофорумах встречал эту проблемму и люди пишут что проблема именно в ардуиновском фреймворке. Вот например https://github.com/espressif/arduino-esp32/issues/4915
I look forward to Arduino Core 1.0.6. available through the Board Manager.
думал мож кто знает как его фиксить в текущей версии.
Ну хз, у меня таких проблем не возникало
А вот и решение. В фреймворке framework-arduinoespressif32 3.10005.210308 версия 1.0.5 раком скомпилированы библиотеки для работы с блютузом. Временное решение - замена бинарника libbt.a находящегося в \.platformio\packages\framework-arduinoespressif32\tools\sdk\lib на почти аналогичный взятый вот от сюдова После подмены либы все заводится и работает как часы. В том числе и вершина идиотизма в виде кода предоставленого мною несколькими постами выше. Мне то уже не интересно а вот господа "умники" может почерпнут для себя полезную информацию да и альтернативно одаренным вроде меня будет проще если решение будет описано в кирилической кодировке.
Уважайте людей ))) даже если они дебилыблять.... Спасибо всем.
апчистил. теперь можно на меня гневацца.
Спасибо. Уже все на всех погневались))))
апчистил. теперь можно на меня гневацца.
Педант, однако :)
Напоролся на эту же проблему. Хотя уже и время прошло прилично с момента публикации и IDE ставил недавно (а уж про библиотеку ESP32 и говорить нечего, чуть ли не сегодняшняя), но не работает точно как описано выше - после отключения телефона от ESP на ней просто "виснет" BLE. И в эфир ESP уже не выходит.
Конечно костыли в стиле ESP.restart(); работают, но это как-то уж совсем коряво.
И при этом предложенный способ переустановки библиотеки у меня не срабатывает. Поэтому просьба пояснить чуть подробнее, куда нужно установить предлагаемый libbt.a
У меня такого пути:\.platformio\packages\framework-arduinoespressif32\tools\sdk\lib вообще нет, поэтому даже не понимаю какая у него может быть альтернатива, чтобы у себя на компе найти.
Близкие к указанному выше пути у меня вглядит так /Users/alex/Documents/Arduino/libraries/arduino-esp32-master/tools/sdk/esp32/lib
Или вот так: /Users/alex/Documents/Arduino/hardware/espressif/esp32/tools/sdk/esp32/lib
Везде заменил libbt.a на предложенный, толку NULL.
Поэтому нужны подробности, как удалось победить проблему.
Напоролся на эту же проблему. Хотя уже и время прошло прилично с момента публикации и IDE ставил недавно (а уж про библиотеку ESP32 и говорить нечего, чуть ли не сегодняшняя), но не работает точно как описано выше - после отключения телефона от ESP на ней просто "виснет" BLE. И в эфир ESP уже не выходит.
Конечно костыли в стиле ESP.restart(); работают, но это как-то уж совсем коряво.
И при этом предложенный способ переустановки библиотеки у меня не срабатывает. Поэтому просьба пояснить чуть подробнее, куда нужно установить предлагаемый libbt.a
У меня такого пути:\.platformio\packages\framework-arduinoespressif32\tools\sdk\lib вообще нет, поэтому даже не понимаю какая у него может быть альтернатива, чтобы у себя на компе найти.
Близкие к указанному выше пути у меня вглядит так /Users/alex/Documents/Arduino/libraries/arduino-esp32-master/tools/sdk/esp32/lib
Или вот так: /Users/alex/Documents/Arduino/hardware/espressif/esp32/tools/sdk/esp32/lib
Везде заменил libbt.a на предложенный, толку NULL.
Поэтому нужны подробности, как удалось победить проблему.
если portable версию развернуть правильно, то смотреть внутри аддона, вот к примеру - C:\ARDUINO\arduino-1.8.16\portable\packages\esp32\hardware\esp32\1.0.6\tools\sdk\lib
Благодарю, буду пробовать.
Да хрен ли там пробовать...
Где код, который виснет. Тебе проблему нужно решать или ерундой позаниматься ?
Как понял, что ESP виснет ?
Простой вопрос - адверт возобновляешь после подключения ?
Спасибо за подсказку!
Конечно адверт после подключения (onСisconnect) не обрабатывал. Поскольку в сктчах этого нигде не встречал.
Но не всё так просто, нужно его включить.
И тогда и девайс в эфире и мультиконнект работает, как и положено на BLE 5.+
Вот так должен выглядеть callback на подключение:
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("Client connected");
pServer->getAdvertising()->start();
};
А в составе класса вот полный код:
cclass MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("Client connected");
pServer->getAdvertising()->start();
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("Client disconnected");
};
};
КРУТО!!!
Ещё раз СПАСИБО за подсказку.
Конкретно для моего случая, возможно будет правильнее вариант:
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("Client disconnected");
pServer->getAdvertising()->start();
};
Поскольку у меня в характеристику можно писать, то восстановление адвертайзинга после подключения первого клиента позволит подключаться и другим. Что может повлечь неудобства - нужно будет обрабатывать очередь из сообщений от разных клиентов.
В общем подумаю над этим. Главное - всё заработало и можно теперь двигаться далее.
Я в декабре пробовал с callback - её помогло, после отключения клиента, новый подключиться может через раз :(
Не помогает даже принудительная перезагрузка МК.
После праздников буду пробовать ble.restart
Спасибо за подсказку!
Конечно адверт после подключения (onСisconnect) не обрабатывал. Поскольку в сктчах этого нигде не встречал.
Но не всё так просто, нужно его включить.
И тогда и девайс в эфире и мультиконнект работает, как и положено на BLE 5.+
Подскажу еще раз... Для твоей логики, авдерт нужно поднимать ПОСЛЕ ОТКЛЮЧЕНИЯ клиента, тогда не нужно будет админить очереди (да и фигли там админить - максимум 7 труб), тебе мультиконнект не нужен.
Да, так и сделаю.