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

BluetoothSocket.connect无异常抛出但未成功连接ESP32问题求助

问题排查与解决思路

1 首要代码逻辑错误

你当前代码中最核心的问题是bluetoothAdapter.getRemoteDevice(address)调用后没有将返回的设备对象赋值给device变量,后续device?.createInsecureRfcommSocketToServiceRecord(uuid)属于空安全调用,device为空时后续逻辑不会执行,自然不会发起任何连接请求,所以ESP端没有收到连接记录、代码也不会抛出异常,最终socket为空触发末尾的Fail日志。
对应修复代码片段:

try {
    // 先判断address是否为空,避免未找到对应设备的情况
    if(address.isNullOrEmpty()){
        Log.e("Bluetooth", "未找到名为Test的配对设备")
        return
    }
    // 将获取到的远程设备赋值给device变量
    val device = bluetoothAdapter.getRemoteDevice(address)
    socket = device.createInsecureRfcommSocketToServiceRecord(uuid)
    socket?.connect()
} catch (e : IOException) {
    Log.e("Bluetooth", "Connection failed", e) // 建议打印异常栈便于排查
}

2 UUID不匹配问题

SPP协议通用的标准UUID为00001101-0000-1000-8000-00805F9B34FB,部分ESP32的蓝牙广播配置不规范时,从device.uuids取到的UUID可能不正确,你可以直接硬编码该标准UUID测试:

// 替换原来的uuids?.get(0)?.uuid取值逻辑
val uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")

3 权限与运行环境检查

  • 权限校验:Android 12及以上系统需要动态申请BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,Android 11及以下需要动态申请位置权限、BLUETOOTH、BLUETOOTH_ADMIN权限,权限不全时蓝牙操作会静默失败,不会抛出异常。
  • 线程要求:蓝牙connect()是阻塞操作,不能在主线程执行,需要放到子线程或者协程中运行,主线程执行会被系统直接拦截导致连接不发起。

调试建议

你可以在createInsecureRfcommSocketToServiceRecord和connect调用前加日志,确认这两行代码是否实际执行,就能快速定位是否是device为空导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:36:03