如何多次初始化blufi(nimble版本)

bokomon
Posts: 3
Joined: Thu Aug 21, 2025 7:36 am

如何多次初始化blufi(nimble版本)

Postby bokomon » Thu Aug 21, 2025 8:09 am

论坛有一个旧帖子https://esp32.com/viewtopic.php?t=21791,我的困惑与他相同,但我是使用的nimble。

使用ESP32C3,IDF版本是5.4.2,移植官方blufi示例代码。想要实现的功能是通过按键进入配网模式,配网成功后就关闭blufi,想更换网络还可以再次按键打开blufi。
增加了联网成功后自动deinit blufi的代码,内容如下:

Code: Select all

static void blufi_deinit(void)
{
    esp_err_t ret;

    ret = esp_blufi_host_deinit();
    if (ret) {
        BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }
#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
    ret = esp_blufi_controller_deinit();
    if (ret) {
        BLUFI_ERROR("%s BLUFI controller deinit failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }
#endif 
    ble_is_connected = 0;
}
调用的函数是我在blufi_init.c(自示例中移植,未修改)里找的。blufi_deinit在IP_EVENT_STA_GOT_IP事件回调里调用。

打开blufi时使用的函数改写自原示例的main函数:

Code: Select all

void blufi_init(void)
{
    esp_err_t ret;

    wifi_init_sta();

#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED
    ret = esp_blufi_controller_init();
    if (ret) {
        BLUFI_ERROR("%s BLUFI controller init failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }
#endif

    ret = esp_blufi_host_and_cb_init(&example_callbacks);
    if (ret) {
        BLUFI_ERROR("%s initialise failed: %s\n", __func__, esp_err_to_name(ret));
        return;
    }

    BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
}
最终结果与旧帖子相同,在第二次打开blufi时会出现“BLUFI already initialized”错误,APP中也无法扫描到设备,应该是blufi没有成功初始化。

我翻找了IDF的原始代码,发现“BLUFI already initialized”的原因是blufi_env.enabled = true,原始代码如下:

Code: Select all

static uint8_t btc_blufi_profile_init(void)
{
    esp_blufi_callbacks_t *store_p = blufi_env.cbs;

    uint8_t rc;
    if (blufi_env.enabled) {
        BLUFI_TRACE_ERROR("BLUFI already initialized");
        return ESP_BLUFI_ERROR;
    }

    memset(&blufi_env, 0x0, sizeof(blufi_env));
    blufi_env.cbs = store_p;        /* if set callback prior, restore the point */
    blufi_env.frag_size = BLUFI_FRAG_DATA_DEFAULT_LEN;
    rc = esp_blufi_init();
    if(rc != 0 ){
       return rc;
    }

    return ESP_BLUFI_SUCCESS;
}
但是在deinit过程中已经调用了函数将其设置为false才对。

Code: Select all

static uint8_t btc_blufi_profile_deinit(void)
{
    if (!blufi_env.enabled) {
        BTC_TRACE_ERROR("BLUFI already de-initialized");
        return ESP_BLUFI_ERROR;
    }

    esp_blufi_deinit();
    return ESP_BLUFI_SUCCESS;
}
void esp_blufi_deinit(void)
{
    blufi_env.enabled = false;
    esp_blufi_cb_param_t param;
    btc_msg_t msg;
    memset (&msg, 0x0, sizeof (msg));
    msg.sig = BTC_SIG_API_CB;
    msg.pid = BTC_PID_BLUFI;
    msg.act = ESP_BLUFI_EVENT_DEINIT_FINISH;
    param.deinit_finish.state = ESP_BLUFI_DEINIT_OK;
    btc_transfer_context(&msg, &param, sizeof(esp_blufi_cb_param_t), NULL, NULL);
}
这就说明我的blufi_deinit函数有问题?但是它并没有报错,调用后蓝牙也确实关闭了。

我又尝试将esp_blufi_deinit加入我的blufi_deinit函数中,确实可以成功多次初始化blufi了,但是每次配网操作都会溢出0.5k左右的内存。

请问有没有老师了解问题的原因和解决办法?
感谢各位阅读。

Who is online

Users browsing this forum: No registered users and 3 guests