ESP32配网完成后,能否保持Provisioning Manager蓝牙栈持续运行?
在ESP32配网后保持Provisioning Manager蓝牙栈持续运行的实现方案
完全可以实现配网后让BLE栈无限期运行,核心是修改Provisioning Manager的初始化配置和配网完成后的回调逻辑,以下是具体实现步骤和代码示例:
核心原理
乐鑫官方文档提到的配网后关闭BLE仅为示例默认行为,用户可通过配置Provisioning Manager的参数,禁止自动关闭BLE栈,同时调整配网完成后的清理逻辑,保留蓝牙栈资源供后续使用。
实现步骤
1. 修改Provisioning Manager初始化配置
在初始化Provisioning Manager时,将BLE配置中的disable_after_prov设为false,这是阻止配网后自动关闭BLE的关键:
#include "esp_provisioning/esp_prov_mgr.h" #include "esp_provisioning/esp_prov_scheme_ble.h" void app_main(void) { // 初始化WiFi和NVS等基础组件 // ... // 配置Provisioning Manager esp_prov_mgr_config_t prov_config = { .scheme = esp_prov_scheme_ble, .scheme_event_handler = NULL, .ble = { .device_name = "ESP32-PROV", // 自定义配网设备名称 .disable_after_prov = false // 核心配置:配网后不关闭BLE } }; ESP_ERROR_CHECK(esp_prov_mgr_init(prov_config)); // 启动配网流程 bool is_provisioned = false; ESP_ERROR_CHECK(esp_prov_mgr_is_provisioned(&is_provisioned)); if (!is_provisioned) { ESP_ERROR_CHECK(esp_prov_mgr_start_provisioning(prov_config.scheme, NULL, provisioning_success_cb, NULL)); } else { // 已配网,直接启动WiFi和自定义BLE服务 // ... } }
2. 调整配网成功回调逻辑
默认示例中配网成功后会调用esp_prov_mgr_deinit()销毁整个Provisioning Manager(包括关闭BLE栈),我们需要替换为仅停止配网服务,保留BLE栈:
static void provisioning_success_cb(void *priv_data, void *usr_data) { ESP_LOGI(TAG, "配网成功,保留BLE栈运行"); // 停止配网服务,但不销毁BLE栈 ESP_ERROR_CHECK(esp_prov_mgr_stop_provisioning()); // 可选:移除配网相关的BLE服务,避免与自定义BLE服务冲突 ESP_ERROR_CHECK(esp_prov_mgr_remove_prov_services()); // 初始化并启动自定义BLE服务/特征,继续使用BLE功能 init_custom_ble_services(); // 替换为你的自定义BLE初始化函数 }
3. 自定义BLE功能的后续使用
配网完成后,BLE栈仍处于运行状态,你可以像普通BLE应用一样,添加自定义服务、处理连接事件、读写特征值等。例如一个简单的自定义BLE服务初始化示例:
void init_custom_ble_services(void) { // 初始化BLE GATT服务器 esp_ble_gatts_app_register(APP_ID); // 添加自定义服务和特征(示例代码,需根据需求完善) // ... ESP_LOGI(TAG, "自定义BLE服务初始化完成"); }
注意事项
- 确保使用的ESP-IDF版本支持
disable_after_prov配置字段(v4.3及以上版本已支持) - 保留BLE栈会占用一定内存,需确保设备有足够的堆内存余量
- 若不需要保留配网相关的BLE服务,建议调用
esp_prov_mgr_remove_prov_services()清理,避免干扰后续BLE操作
内容的提问来源于stack exchange,提问作者quixo3
相关产品推荐
相关产品推荐

