Проблема с подключением наушников ESP32 A2DP

#bluetooth #esp32 #a2dp

#bluetooth #esp32 #a2dp

Вопрос:

Я довольно новичок в работе с Bluetooth и стеком ESP32 Bluetooth, поэтому простите меня, если я не использую правильную терминологию.

Я могу добиться идеальной работы примера разработки ESP-IDF «A2DP_Source», только если сначала включить режим сопряжения наушников. После сопряжения и сохранения соединения в Bluetooth он снова подключится к наушникам без проблем, но затем не уведомляет приложение через функции обратного вызова о том, что оно подключилось. Затем приложение продолжает поиск устройства Bluetooth и аудиопотоков время от времени или не выполняет их вообще.

Я пробовал несколько динамиков и наушников, все с одинаковыми результатами.

Я также вижу список подключенных устройств, и устройство там есть.

Есть ли в стеке Bluetooth функция обратного вызова, которую необходимо инициализировать, чтобы уведомить приложение о том, что Bluetooth подключен к ранее сопряженному устройству, а не просто к устройству в режиме сопряжения?

В настоящее время настроены три функции обратного вызова, которые запускаются при подключении через режим сопряжения, но не запускаются при подключении Bluetooth в режиме без сопряжения.

 ...
/* register GAP callback function */
        esp_bt_gap_register_callback(bt_app_gap_cb);
        
         /* initialize AVRCP controller */
        esp_avrc_ct_init();
        esp_avrc_ct_register_callback(bt_app_rc_ct_cb);
        
        /* initialize A2DP source */
        esp_a2d_register_callback(amp;bt_app_a2d_cb);
        esp_a2d_source_register_data_callback(bt_app_a2d_data_cb);
      ...
  

Будем признательны за любую помощь или указания. Спасибо.

Ответ №1:

Вы имели в виду, что ESP32 A2DP не может подключить устройство без нажатия кнопки сопряжения?

Похоже, что в примере «A2DP_Source» подключенное устройство не подключается. Он просто пытается обнаружить устройство с определенным именем («ESP_SPEAKER» в исходном коде), вызывая функцию esp_bt_gap_start_discovery. Если устройство найдено, вызывается bt_app_gap_cb, а затем начнется подключение к одноранговому узлу через esp_a2d_source_connect.

Поэтому я предлагаю исправить код, чтобы подключать одноранговый узел вместо вызова esp_bt_gap_start_discovery, если есть какое-либо подключенное устройство. Вы можете использовать функцию esp_bt_gap_get_bond_device_list и узнать адрес подключенного устройства, который требуется для esp_a2d_source_connect.

Ссылка на API доступна в https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/bluetooth/esp_gap_bt.html и https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/bluetooth/esp_a2dp.html.

Ответ №2:

Продолжая работать над этой проблемой, я обнаружил, что проблема заключалась в использовании C для вызова собственного кода C. У меня недостаточно опыта в программировании, чтобы понять, «почему» это не сработало, но как только я вернул весь код обратно на «C», он начал работать без проблем. Надеюсь, это поможет кому-то еще, кто может совершить ту же ошибку.