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

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

Я могу получить пример A2DP_Source разработки ESP-IDF, работающий идеально, только если я сначала включу режим сопряжения наушников. После сопряжения и сохранения связи в 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(&bt_app_a2d_cb);
        esp_a2d_source_register_data_callback(bt_app_a2d_data_cb);
      ...

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


person Jeeper1974    schedule 20.08.2020    source источник


Ответы (2)


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

person Jeeper1974    schedule 27.08.2020

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

Пример 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.

person Natsuki    schedule 09.10.2020