ESP32蓝牙音箱项目蓝牙音频连接状态检测方法咨询
解决方案
你当前使用的SPP回调仅针对蓝牙串口协议生效,蓝牙音频走的是A2DP协议,需要单独注册A2DP连接事件回调才能检测音频连接状态,修改方案如下:
1. 新增全局状态变量与回调函数
首先在代码全局区添加音频连接状态变量,以及A2DP事件回调:
#include "esp_a2dp_api.h" // 引入ESP-IDF A2DP API头文件 bool BTisConnected; // 原有SPP连接状态 bool audioConnected; // 新增音频连接状态 // 原有SPP回调逻辑优化 void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t*param){ if(event == ESP_SPP_SRV_OPEN_EVT){ Serial.println("串口客户端已连接"); BTisConnected = true; } else if(event == ESP_SPP_CLOSE_EVT) { // 仅在关闭事件触发时修改断开状态,避免其他无关事件误判 BTisConnected = false; } } // 新增A2DP音频连接回调 void a2dp_event_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param) { switch (event) { case ESP_A2D_CONNECTION_STATE_EVT: if (param->conn_stat.state == ESP_A2D_CONNECTION_STATE_CONNECTED) { Serial.println("蓝牙音频已连接"); audioConnected = true; } else if (param->conn_stat.state == ESP_A2D_CONNECTION_STATE_DISCONNECTED) { Serial.println("蓝牙音频已断开"); audioConnected = false; } break; default: break; } }
2. 初始化阶段注册A2DP回调
在setup()函数的audio.begin()之后添加回调注册代码:
audio.begin(); esp_a2d_register_callback(a2dp_event_cb); // 新增行,注册音频事件回调 int bck = 26; int ws = 27; int dout = 25; audio.I2S(bck, dout, ws);
3. 修正连接检测逻辑
首先删除BTconnectionCheck()函数中重复注册SPP回调的代码(回调仅需注册一次,放在setup中即可),然后修改连接状态判断规则,可根据需求选择仅判断音频连接、或同时判断两种连接:
void BTconnectionCheck(){ // 删除原有SerialBT.register_callback(callback); 重复注册会导致运行异常 // 只要音频或串口任意一个连接成功就判定为已连接,可根据需求调整判断逻辑 if (BTisConnected == true || audioConnected == true){ bluetoothConnected(); } else { bluetoothSearch(); } }
额外说明
若你使用的btAudio库版本已经封装了连接状态查询方法,也可以直接调用audio.isConnected()之类的封装接口轮询状态,无需手动注册原生回调。
内容的提问来源于stack exchange,提问作者Ben Healey
相关产品推荐
相关产品推荐

