Esp32 проблема с Bluetooth

gfo
Offline
Зарегистрирован: 20.03.2021

Добрый день. Есть у меня 1 проект переделываю с ардуины на есп. Комуникация со смартфоном происходит через Bluetooth.

На ЕСП для этих целей пытаюсь использовать библиотеку BluetoothSerial. Суть проблемы: Первый коннект происходит... данные передаются туда сюда.. но как только я отключился от платы повторное подключение уже невозможно до перезагрузки платы. Может кто сталкивался в чем может быть проблема. Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

Проблема в том, что вы не хотите получить помощь и разобраться.

При таком составе вопроса можно только послать человека читать примеры из библиотек БТ.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Проблема в том, что вы не обрабатываете отключение на ESP. Это же очевидно.

gfo
Offline
Зарегистрирован: 20.03.2021

Поверьте я прочитал все примеры, более того я их все перепробовал, перелопатил кучу форумов в том числе и англоязычных. ... я даже запустил SPP на родном фреймворке ESP-IDF. И представляете он там корректно работает и даже конект реконнект срабатывает как надо. А вот библиотека BluetoothSerial.h под ардуиновским фреймворком отрабатывает не корректно. Задавание вопросов на форму - последняя инстанция в моей практике, за частую именно из за таких товарищей как вы. Не хотите - не помогайте... просто проходите мимо. Я надеялся здесь встретить такого человека который уже наступил на подобные грабли и успешно через них переступил. Для такого человека инфы в вопросе более чем достаточно. Спасибо что обратили внимание. 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Я первую инстанцию пропустил, похоже. Проблемный код был уже? Ванга давно на форуме не показывается

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если достаточно, то тогда ОК. Подожду телепата, который в курсе, что там наваяли.

gfo
Offline
Зарегистрирован: 20.03.2021
#include <Arduino.h>
#include "BluetoothSerial.h"

BluetoothSerial myBT;
void setup() {
    myBT.begin("testbt");
    Serial.begin(9600);
}

void loop() {
  if (myBT.available()) {
    Serial.write(myBT.read());
  }
}

​Вот классический пример из интернетов... как юзать библиотеку. 
Поделитесь секретом? Как я должен обрабатывать отключение в данном случае? Вот в таком виде биндинг происходит. поступившие данные в  консольку сыпятся. Но если на телефоне сделать дизконнект, то повторный коннект уже не происходит.</span>
Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Для альтернативно одаренных разжую. Во первых, для решения СВОЕЙ проблемы выкладывать левый код - верх идиотизма. Во вторых, из этого идиотизма можно было извлечь пользу, поскольку приведенный левый код содержит решение вашей проблемы, но вы не в состоянии его узреть. Теперь начинает проясняться?

gfo
Offline
Зарегистрирован: 20.03.2021

Я конечно извиняюсь... СЕР. Но с чего вы решили что это левый код... Вот он написан у меня на экране.. откомпилирован и залит в камень... протестирован еще раз перед тем как задавать вопрос ВАМ многоуважаемому стандартно одаренному. Я просто постарался проявить в Вам уважение и не нагружая лишним информационным мусором воссоздал только ту часть проекта которая вызвала у меня трудности. Теперь я надеюсь вы снизойдете до обычних "длблть" и попробуете все же им помочь, или и далее будете колотить понты ничего из себя не представляя по факту? Заранее большое человеческое спасибо.

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Классический пример из интернетов... 

Хорошо, пусть будет по вашему. Вам ответили уже в #2. У вас в сетапе идет коннект, а в лупе статус коннекта нигде не проверяется и не реконнектится при отвале. А нужно чтобы if(!блютуз.connected()) блютуз.сonnect(); 

gfo
Offline
Зарегистрирован: 20.03.2021

О хоспадэ... он слейв... он ждет коннекта... он самостоятельно никуда не конектится... вы действительно немного пропустили...  Телефон мабила из мастер... он инициирует соединение...  платка всего лишь ждет пока к ней ктото приконектится. 

Еще идеи будут?

 

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

gfo пишет:
Телефон мабила из мастер... он инициирует соединение...  платка всего лишь ждет пока к ней ктото приконектится. 

Ну какая хрен разница, мастер он или слейв. Если мастер отпал не факт, что слейв сам должен сбросить соединение и приготовиться к новому. Курите библиотеку в части connect/disconnect, pair/unpair. Модуль сам не будет отвал соединения обрабатывать

gfo
Offline
Зарегистрирован: 20.03.2021

В том то и дело что должен обрабатывать но не обрабатывает так как положено. событие в колбек приходит... но но чето в это библиотеке не так и модуль подмораживает. Собсно об этом и интересовался когда задавал вопрос. Я ж говорю, я даже воссоздал 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.

думал мож кто знает как его фиксить в текущей версии.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

gfo пишет:

В том то и дело что должен обрабатывать но не обрабатывает так как положено. событие в колбек приходит... но но чето в это библиотеке не так и модуль подмораживает. Собсно об этом и интересовался когда задавал вопрос. Я ж говорю, я даже воссоздал 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.

думал мож кто знает как его фиксить в текущей версии.

Ну хз, у меня таких проблем не возникало

gfo
Offline
Зарегистрирован: 20.03.2021

А вот и решение. В фреймворке  framework-arduinoespressif32 3.10005.210308  версия 1.0.5 раком скомпилированы библиотеки для работы с блютузом. Временное решение  - замена бинарника libbt.a находящегося в \.platformio\packages\framework-arduinoespressif32\tools\sdk\lib на почти аналогичный взятый вот от сюдова   После подмены либы все заводится и работает как часы. В том числе и вершина идиотизма в виде кода предоставленого мною несколькими постами выше. Мне то уже не интересно а вот господа "умники" может почерпнут для себя полезную информацию да и альтернативно одаренным вроде меня будет проще если решение будет описано в кирилической кодировке.

Уважайте людей ))) даже если они дебилыблять.... Спасибо всем. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

апчистил.  теперь можно на меня гневацца. 

gfo
Offline
Зарегистрирован: 20.03.2021

Спасибо. Уже все на всех погневались))))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

апчистил.  теперь можно на меня гневацца. 

Педант, однако :)

Alex_B
Offline
Зарегистрирован: 01.01.2022

Напоролся на эту же проблему. Хотя уже и время прошло прилично с момента публикации и 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.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Alex_B пишет:

Напоролся на эту же проблему. Хотя уже и время прошло прилично с момента публикации и 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

Alex_B
Offline
Зарегистрирован: 01.01.2022

Благодарю, буду пробовать.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да хрен ли там пробовать...

Где код, который виснет. Тебе проблему нужно решать или ерундой позаниматься ? 

Как понял, что ESP виснет ?

Простой вопрос - адверт возобновляешь после подключения ? 

Alex_B
Offline
Зарегистрирован: 01.01.2022

Спасибо за подсказку!

Конечно адверт после подключения (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();
    };

Поскольку у меня в характеристику можно писать, то восстановление адвертайзинга после подключения первого клиента позволит подключаться и другим. Что может повлечь неудобства - нужно будет обрабатывать очередь из сообщений от разных клиентов.
В общем подумаю над этим. Главное - всё заработало и можно теперь двигаться далее.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я в декабре пробовал с callback - её помогло, после отключения клиента, новый подключиться может через раз :(
Не помогает даже принудительная перезагрузка МК.
После праздников буду пробовать ble.restart

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Alex_B пишет:

Спасибо за подсказку!

Конечно адверт после подключения (onСisconnect) не обрабатывал. Поскольку в сктчах этого нигде не встречал.
Но не всё так просто, нужно его включить.
И тогда и девайс в эфире и мультиконнект работает, как и положено на BLE 5.+

Подскажу еще раз... Для твоей логики, авдерт нужно поднимать ПОСЛЕ ОТКЛЮЧЕНИЯ клиента, тогда не нужно будет админить очереди (да и фигли там админить - максимум 7 труб), тебе мультиконнект не нужен. 

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      //...
    };
    void onDisconnect(BLEServer* pServer) {
      //...
      вот тут стартуем адверт
    }
};

 

Alex_B
Offline
Зарегистрирован: 01.01.2022

Да, так и сделаю.