You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:27:02