# 蓝牙配网集成指南

本文档详细说明如何将蓝牙配网功能集成到小智AI项目中。

## 1. 文件说明

### 新增文件

- `main/bluetooth_provisioning.h` - 蓝牙配网类头文件
- `main/bluetooth_provisioning.cc` - 蓝牙配网类实现文件
- `main/bluetooth_provisioning_config.h` - 蓝牙配网配置文件
- `main/bluetooth_provisioning_example.cc` - 使用示例文件

### 修改文件

- `main/CMakeLists.txt` - 添加了蓝牙配网源文件和组件依赖

## 2. 功能特性

### 核心功能

- ✅ 蓝牙BLE广播和连接管理
- ✅ WiFi凭据接收和配置
- ✅ WiFi连接状态监控和报告
- ✅ 事件回调机制
- ✅ 状态管理和错误处理
- ✅ 自动重连和故障恢复

### 安全特性

- 🔒 支持加密通信（可选）
- 🔒 预共享密钥（PSK）认证
- 🔒 WiFi密码安全传输
- 🔒 连接超时保护

### 兼容性

- 📱 兼容ESP-IDF官方配网APP
- 📱 支持自定义配网APP开发
- 🔧 支持ESP32/ESP32-S3/ESP32-C3等芯片

## 3. 集成步骤

### 3.1 配置ESP-IDF

在项目的`sdkconfig`中确保启用以下配置：

```bash
# 蓝牙基础配置
CONFIG_BT_ENABLED=y
CONFIG_BLUEDROID_ENABLED=y
CONFIG_BT_BLUFI_ENABLE=y

# 蓝牙控制器配置
CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
CONFIG_BTDM_CTRL_MODE_BTDM=n

# WiFi配置
CONFIG_ESP32_WIFI_ENABLED=y
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32

# 事件循环配置
CONFIG_ESP_EVENT_LOOP_PROFILING=y

# NVS配置
CONFIG_NVS_ENCRYPTION=n
```

### 3.2 在现有代码中集成

#### 方法1：独立任务集成（推荐）

在`application.cc`中添加蓝牙配网任务：

```cpp
#include "bluetooth_provisioning.h"

// 全局蓝牙配网对象
static BluetoothProvisioning* g_bt_provisioning = nullptr;

// 蓝牙配网事件回调
void bluetooth_provisioning_callback(BluetoothProvisioningEvent event, void* data) {
    switch (event) {
    case BluetoothProvisioningEvent::WIFI_CONNECTED:
        ESP_LOGI("APP", "WiFi配网成功");
        // 在这里添加配网成功后的处理逻辑
        break;
    case BluetoothProvisioningEvent::WIFI_FAILED:
        ESP_LOGE("APP", "WiFi配网失败");
        // 在这里添加配网失败后的处理逻辑
        break;
    // 处理其他事件...
    }
}

// 蓝牙配网任务
void bluetooth_provisioning_task(void* pvParameters) {
    g_bt_provisioning = new BluetoothProvisioning();
    g_bt_provisioning->SetCallback(bluetooth_provisioning_callback);
    
    if (g_bt_provisioning->Initialize()) {
        g_bt_provisioning->StartProvisioning("Airhub_Ble");
        
        while (true) {
            // 监控配网状态
            vTaskDelay(pdMS_TO_TICKS(5000));
        }
    }
    
    vTaskDelete(nullptr);
}

// 在Application::Initialize()中启动配网任务
void Application::Initialize() {
    // 现有初始化代码...
    
    // 创建蓝牙配网任务
    xTaskCreate(bluetooth_provisioning_task, "bt_prov", 8192, nullptr, 5, nullptr);
}
```

#### 方法2：直接集成到Application类

在`application.h`中添加：

```cpp
#include "bluetooth_provisioning.h"

class Application {
private:
    BluetoothProvisioning* bluetooth_provisioning_;
    
public:
    void StartBluetoothProvisioning();
    void StopBluetoothProvisioning();
    bool IsWiFiConnected();
};
```

在`application.cc`中实现：

```cpp
void Application::StartBluetoothProvisioning() {
    if (!bluetooth_provisioning_) {
        bluetooth_provisioning_ = new BluetoothProvisioning();
        bluetooth_provisioning_->SetCallback([this](BluetoothProvisioningEvent event, void* data) {
            // 处理配网事件
        });
    }
    
    if (bluetooth_provisioning_->Initialize()) {
        bluetooth_provisioning_->StartProvisioning("小智AI");
    }
}
```

### 3.3 配置参数调整

根据项目需求，修改`bluetooth_provisioning_config.h`中的配置参数：

```cpp
// 修改设备名称
#define BT_PROVISIONING_DEFAULT_DEVICE_NAME "你的设备名称"

// 调整超时时间
#define BT_PROVISIONING_WIFI_TIMEOUT_MS (60 * 1000)  // 60秒

// 启用/禁用安全模式
#define BT_PROVISIONING_SECURITY_ENABLED 1

// 配网成功后自动停止
#define BT_PROVISIONING_AUTO_STOP_ON_SUCCESS 1
```

## 4. 使用方法

### 4.1 基本使用流程

1. **创建对象**：`BluetoothProvisioning* prov = new BluetoothProvisioning();`
2. **设置回调**：`prov->SetCallback(callback_function);`
3. **初始化**：`prov->Initialize();`
4. **启动配网**：`prov->StartProvisioning("设备名称");`
5. **监控状态**：通过回调函数处理各种事件
6. **停止配网**：`prov->StopProvisioning();`（可选）
7. **清理资源**：`prov->Deinitialize(); delete prov;`

### 4.2 状态监控

```cpp
// 获取当前状态
BluetoothProvisioningState state = prov->GetState();

// 检查客户端连接状态
bool connected = prov->IsClientConnected();

// 获取WiFi凭据
WiFiCredentials credentials = prov->GetWiFiCredentials();
```

### 4.3 事件处理

```cpp
void provisioning_callback(BluetoothProvisioningEvent event, void* data) {
    switch (event) {
    case BluetoothProvisioningEvent::STATE_CHANGED:
        // 状态变化
        break;
    case BluetoothProvisioningEvent::CLIENT_CONNECTED:
        // 客户端连接
        break;
    case BluetoothProvisioningEvent::WIFI_CREDENTIALS:
        // 收到WiFi凭据
        WiFiCredentials* creds = (WiFiCredentials*)data;
        break;
    case BluetoothProvisioningEvent::WIFI_CONNECTED:
        // WiFi连接成功
        esp_ip4_addr_t* ip = (esp_ip4_addr_t*)data;
        break;
    case BluetoothProvisioningEvent::WIFI_FAILED:
        // WiFi连接失败
        uint8_t* reason = (uint8_t*)data;
        break;
    }
}
```

## 5. 客户端APP开发

### 5.1 使用ESP-IDF官方APP

1. 下载ESP-IDF官方配网APP
2. 扫描蓝牙设备，找到你的设备
3. 连接设备并输入WiFi凭据
4. 等待配网完成

### 5.2 自定义APP开发

参考ESP-IDF的BLUFI协议文档：
- [BLUFI协议说明](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/blufi.html)
- [BLUFI示例代码](https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/blufi)

## 6. 故障排除

### 6.1 常见问题

**问题1：蓝牙初始化失败**
- 检查`sdkconfig`中蓝牙相关配置是否正确
- 确保有足够的内存空间
- 检查是否与其他蓝牙功能冲突

**问题2：WiFi连接失败**
- 检查WiFi凭据是否正确
- 确认WiFi信号强度
- 检查路由器兼容性

**问题3：客户端无法发现设备**
- 确认蓝牙广播是否正常启动
- 检查设备名称是否正确
- 确认客户端APP版本兼容性

### 6.2 调试方法

1. **启用详细日志**：
   ```cpp
   #define BT_PROVISIONING_VERBOSE_LOG 1
   ```

2. **使用ESP-IDF监控工具**：
   ```bash
   idf.py monitor
   ```

3. **检查内存使用**：
   ```cpp
   ESP_LOGI(TAG, "Free heap: %d", esp_get_free_heap_size());
   ```

## 7. 性能优化

### 7.1 内存优化

- 配网成功后及时释放蓝牙资源
- 调整任务栈大小
- 使用内存池管理

### 7.2 功耗优化

- 配网完成后关闭蓝牙
- 调整广播间隔
- 使用低功耗模式

### 7.3 连接优化

- 优化广播参数
- 调整连接间隔
- 实现快速重连机制

## 8. 安全考虑

### 8.1 数据安全

- 启用加密通信
- 使用强密码策略
- 定期更换PSK

### 8.2 访问控制

- 实现设备认证
- 限制配网时间窗口
- 添加访问日志

### 8.3 隐私保护

- 不记录敏感信息
- 及时清除临时数据
- 遵循数据保护法规

## 9. 扩展功能

### 9.1 自定义数据传输

```cpp
// 发送自定义数据
void send_custom_data(const uint8_t* data, size_t len) {
    esp_blufi_send_custom_data(data, len);
}

// 接收自定义数据
void handle_custom_data(const uint8_t* data, size_t len) {
    // 处理自定义数据
}
```

### 9.2 多设备管理

- 支持同时配网多个设备
- 实现设备分组管理
- 添加设备状态同步

### 9.3 云端集成

- 配网信息云端备份
- 远程配网管理
- 设备状态监控

## 10. 版本更新

### 当前版本：v1.0.0

**功能特性：**
- 基础蓝牙配网功能
- WiFi连接管理
- 事件回调机制
- 状态管理
- 错误处理

**后续计划：**
- v1.1.0：添加安全认证
- v1.2.0：支持多设备配网
- v1.3.0：云端集成功能

---

## 联系支持

如果在集成过程中遇到问题，请：

1. 查看本文档的故障排除章节
2. 检查ESP-IDF官方文档
3. 提交Issue到项目仓库
4. 联系技术支持团队

**祝您集成顺利！** 🎉