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

ESP32蓝牙串口连接失败:手机端Socket关闭问题排查求助

ESP32蓝牙串口连接失败(Socket已关闭)排查与解决方案

常见原因排查

  • UUID不匹配:ESP32蓝牙服务未使用标准SPP(串口协议)UUID,手机APP无法识别服务导致连接失败。
  • 事件回调处理缺失:未正确处理蓝牙连接建立、断开的回调事件,导致Socket资源未释放或服务异常。
  • 供电不稳定:ESP32蓝牙模块工作电流需求较高,USB供电不足或电源波动会引发模块重启,直接导致连接中断。
  • Android权限限制:Android 10及以上系统对蓝牙权限管控严格,APP未获取BLUETOOTH_CONNECT、BLUETOOTH_SCAN权限时,系统会拦截连接请求。
  • 代码异常:蓝牙回调中执行耗时操作、串口波特率不匹配、内存溢出等问题,会引发ESP32重启或蓝牙服务崩溃。

解决方案

  • 使用标准SPP UUID:强制指定蓝牙串口服务的通用UUID 00001101-0000-1000-8000-00805F9B34FB,确保手机APP能识别并建立连接。
  • 完善连接状态管理:在代码中实时检测蓝牙连接状态,断开时主动释放资源并重新初始化蓝牙服务,避免残留Socket导致的连接失败。
  • 优化供电方案:改用5V/2A的电源适配器供电,避免使用笔记本USB口等不稳定电源;必要时在ESP32电源引脚添加100µF滤波电容。
  • 检查APP权限:在手机应用设置中,确认蓝牙串口APP已获取BLUETOOTH_CONNECT、BLUETOOTH_SCAN权限(Android 10+),部分旧版本APP可能还需位置权限。
  • 代码优化要点:
    • 禁止在蓝牙回调函数中执行耗时操作(如大量串口打印),可将数据放入队列,在主循环中处理。
    • 确保ESP32串口与手机APP的波特率一致(推荐115200)。
    • 添加连接状态检测逻辑,断开时自动重启蓝牙服务。

优化后的示例代码

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;
const char* DEVICE_NAME = "ESP32_Serial";
// 标准SPP服务UUID
const uint8_t SPP_UUID[] = {0x00,0x00,0x11,0x01,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB};

void setup() {
  Serial.begin(115200);
  // 初始化蓝牙串口,指定标准UUID
  if (!SerialBT.begin(DEVICE_NAME, true, true, 0, SPP_UUID)) {
    Serial.println("蓝牙初始化失败");
    while(1);
  }
  Serial.println("蓝牙设备已就绪,等待配对");
}

void loop() {
  if (SerialBT.connected()) {
    // 双向数据转发
    if (Serial.available()) {
      SerialBT.write(Serial.read());
    }
    if (SerialBT.available()) {
      Serial.write(SerialBT.read());
    }
  } else {
    // 断开连接后重新初始化
    SerialBT.end();
    delay(1000);
    SerialBT.begin(DEVICE_NAME, true, true, 0, SPP_UUID);
    Serial.println("重新初始化蓝牙服务...");
  }
  delay(10);
}

内容的提问来源于stack exchange,提问作者K_Adeepa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 13:04:50