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

ESP32-S3-DevKitC-1连接扩展广播设备时connect()调用失败求助

ESP32-S3 BLE连接失败排查方案(扫描正常但connect失败)

问题描述

使用ESP32-S3-DevKitC-1开发板,可通过扩展扫描方法找到目标BLE设备且MAC地址准确,但调用connect()函数始终无法建立连接,此前该函数曾能成功连接。相关代码如下:

bool ConnectToServer(esp_bd_addr_t addr)
{
    BLEClient *pClient = BLEDevice::createClient();      // 创建客户端
    pClient->setClientCallbacks(new MyClientCallback()); // 添加客户端与服务器连接与断开回调功能
    if (pClient->isConnected())
        pClient->disconnect();
    pClient->setMTU(240);

    // std::string strAdd = "30:c0:7e:68:49:1d";
    // std::string strAdd = "30:C0:7E:68:49:1D";

    if (!pClient->connect(BLEAddress(addr))) // 
    {
        log("connect fail!!!\r\n");
        return false;
    }
    log("connect success!!!\r\n");

    pRemoteService = pClient->getService(SERVER_START_UPGRADE_UUID); // 尝试获取设备中的服务
    if (pRemoteService == nullptr)
    {
        log("get server fail !!!\r\n");
        pClient->disconnect();
        return false;
    }
    log("get server success !!! \r\n");

    pRemoteCharacteristic = pRemoteService->getCharacteristic(CHARA_START_UPGRADE_UUID); // 
    if (pRemoteCharacteristic == nullptr)
    {
        log("get characteristic fail !!!\r\n");
        pClient->disconnect();
        return false;
    }

    return true;
}

排查与修复建议

1. 校正MAC地址字节序

ESP32的esp_bd_addr_t采用小端字节序,如果扫描获取的MAC是大端格式(如字符串"30:C0:7E:68:49:1D"),直接赋值会导致地址反转,连接失败。

  • 修复示例:将字符串MAC转为esp_bd_addr_t时按逆序填充:
    std::string macStr = "30:C0:7E:68:49:1D";
    esp_bd_addr_t addr;
    sscanf(macStr.c_str(), "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx", 
           &addr[5], &addr[4], &addr[3], &addr[2], &addr[1], &addr[0]);
    

2. 调整连接流程与参数

  • 延迟设置MTU:pClient->setMTU(240)需在连接成功后调用,未连接时设置会干扰连接流程。
  • 增加连接超时:给connect()指定更长超时时间,避免因信号弱导致超时失败:
    if (!pClient->connect(BLEAddress(addr), false, 5000)) // 5秒超时
    {
        log("connect fail!!!\r\n");
        return false;
    }
    
  • 复用BLEClient实例:每次调用都创建新客户端易引发资源泄漏,建议复用或销毁旧实例后再创建:
    static BLEClient *pClient = nullptr;
    if (pClient == nullptr) {
        pClient = BLEDevice::createClient();
        pClient->setClientCallbacks(new MyClientCallback());
    }
    if (pClient->isConnected()) {
        pClient->disconnect();
        vTaskDelay(pdMS_TO_TICKS(100)); // 断开后延迟再重连
    }
    

3. 获取连接失败具体错误码

在MyClientCallback中重写onConnectFailure方法,打印错误码定位问题:

class MyClientCallback : public BLEClientCallbacks {
    void onConnectFailure(BLEClient* pClient, esp_err_t errorCode) override {
        log("连接失败,错误码:%d\r\n", errorCode);
    }
};

常见错误码对应原因:

  • ESP_ERR_BLE_CONN_FAILED:设备拒绝连接(忙、配对锁定)
  • ESP_ERR_BLE_TIMEOUT:连接超时(信号弱、设备无响应)
  • ESP_ERR_BLE_ADDR_NOT_FOUND:MAC地址格式/字节序错误

4. 检查BLE设备状态

  • 确认目标设备处于可连接状态:部分设备广播时仅允许有限次数连接,或处于配对锁定状态。
  • 测试连接其他BLE设备,排除ESP32硬件或驱动问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:16:32