以下是使用四博智联ESP32模组实现蓝牙配网的示例代码。我们将展示两种配网方式:一种是基于乐鑫官方的BluFi,另一种是自定义协议开发的实现方式。
1. 基于BluFi的蓝牙配网
BluFi 是乐鑫官方提供的用于 ESP32 系列芯片的蓝牙配网方案。以下是一个简单的 BluFi 配网实现示例代码:
#include "esp_blufi_api.h"
#include "esp_wifi.h"
#include "esp_bt.h"
#include "esp_bt_main.h"
static void blufi_event_handler(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
{
switch (event) {
case ESP_BLUFI_EVENT_INIT_FINISH:
ESP_LOGI("BluFi", "BluFi initialization finished");
esp_blufi_adv_start();
break;
case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
ESP_LOGI("BluFi", "BluFi BLE disconnected");
break;
case ESP_BLUFI_EVENT_RECV_STA_BSSID:
ESP_LOGI("BluFi", "Received STA BSSID");
break;
case ESP_BLUFI_EVENT_RECV_STA_SSID:
ESP_LOGI("BluFi", "Received STA SSID: %s", param->sta_ssid.ssid);
break;
case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
ESP_LOGI("BluFi", "Received STA Password: %s", param->sta_passwd.passwd);
break;
default:
break;
}
}
void app_main(void)
{
esp_err_t ret;
// 初始化NVS
ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 初始化蓝牙
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg));
ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE));
ESP_ERROR_CHECK(esp_bluedroid_init());
ESP_ERROR_CHECK(esp_bluedroid_enable());
// 初始化BluFi
esp_blufi_register_callbacks(&blufi_callbacks);
ESP_ERROR_CHECK(esp_blufi_profile_init());
// 初始化Wi-Fi
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_start());
}
2. 自定义蓝牙配网协议实现
如果需要自定义蓝牙配网协议,可以根据产品需求设计配网流程。以下是一个简单的自定义蓝牙配网示例,使用GATT服务接收Wi-Fi SSID和密码:
#include "esp_bt.h"
#include "esp_bt_main.h"
#include "esp_gatts_api.h"
#include "esp_wifi.h"
#define GATTS_TAG "GATTS_DEMO"
#define PROFILE_NUM 1
#define PROFILE_APP_IDX 0
#define ESP_APP_ID 0x55
static uint8_t ssid[32] = {0};
static uint8_t password[64] = {0};
static void gatts_profile_event_handler(esp_gatts_cb_event_t event,
esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
{
if (event == ESP_GATTS_WRITE_EVT) {
if (param->write.handle == ssid_handle) {
memcpy(ssid, param->write.value, param->write.len);
} else if (param->write.handle == password_handle) {
memcpy(password, param->write.value, param->write.len);
ESP_LOGI(GATTS_TAG, "Received SSID: %s, Password: %s", ssid, password);
wifi_config_t wifi_config = {
.sta = {
.ssid = "",
.password = "",
},
};
memcpy(wifi_config.sta.ssid, ssid, sizeof(ssid));
memcpy(wifi_config.sta.password, password, sizeof(password));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_connect());
}
}
}
void app_main(void)
{
esp_err_t ret;
// 初始化NVS
ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 初始化蓝牙
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg));
ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE));
ESP_ERROR_CHECK(esp_bluedroid_init());
ESP_ERROR_CHECK(esp_bluedroid_enable());
// 初始化GATT服务器
esp_ble_gatts_register_callback(gatts_profile_event_handler);
esp_ble_gatts_app_register(ESP_APP_ID);
// 初始化Wi-Fi
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_start());
}
代码说明
-
BluFi 方案:通过使用乐鑫官方提供的 BluFi 库,简化了蓝牙配网的实现。此方案非常适合那些想快速实现蓝牙配网功能的开发者。
-
自定义方案:开发者可以完全掌控配网流程,通过设计自定义 GATT 服务和特性,接收并处理Wi-Fi SSID和密码。这种方法提供了更高的灵活性,能够根据具体产品的需求进行深度优化。
无论选择哪种方案,四博智联的 ESP32 模组都提供了强大的支持,帮助开发者快速实现智能设备的蓝牙配网功能。如果需要进一步的优化或定制,可以结合具体应用场景对代码进行调整和扩展。