ESP-ADF wifi_service模块总体概览

ESP-ADF wifi_service模块总体概览

版本信息: v2.7-65-gcf908721

模块定位与功能

在ESP-ADF中的位置

ESP-ADF (Espressif Audio Development Framework) 是乐鑫为音频应用提供的开发框架,wifi_service模块是这个框架中负责WiFi连接管理和配置的核心组件。它处于ESP-ADF系统架构中的中间层,连接底层ESP-IDF的WiFi功能和上层应用:

应用层 (App)
音频Pipeline等
外设服务层 (periph_service)
wifi_service模块
我们关注的模块
ESP-IDF WiFi功能 (系统层)
硬件 (WiFi芯片)

核心功能

wifi_service模块提供以下核心功能:

  1. WiFi连接管理:统一管理WiFi连接、断开、重连等操作
  2. 多种配网方式:支持多种WiFi配置方式,包括ESP Touch、Airkiss和BLE配网
  3. SSID管理:存储和管理多个WiFi网络信息
  4. 状态监控:追踪WiFi连接状态变化并通知应用
  5. 基于periph_service:作为外设服务的一种实现,具有统一的服务接口

设计理念

wifi_service的设计遵循以下核心理念:

  1. 抽象与解耦:将WiFi配置与连接管理分离,降低系统耦合度
  2. 统一接口:通过服务接口统一管理WiFi操作
  3. 多配网支持:支持多种配网方式,适应不同应用场景
  4. 可靠性:内置重试机制,提高连接可靠性
  5. 易用性:简化WiFi连接和配置流程

子模块结构与依赖关系

wifi_service模块由多个子模块组成,它们之间存在明确的依赖关系:

子模块组成

periph_service
(基础服务框架)
wifi_service
(WiFi服务核心)
wifi_ssid_manager
(SSID管理)
esp_wifi_setting
(WiFi配置接口)
smart_config
(ESP Touch配网)
airkiss_config
(微信配网)
blufi_config
(蓝牙配网)

依赖关系说明

  1. periph_service:基础服务框架,提供统一的服务接口和生命周期管理
  2. wifi_service:核心模块,基于periph_service,管理WiFi连接和状态
  3. wifi_ssid_manager:管理WiFi SSID信息,提供存储和优先级选择
  4. esp_wifi_setting:WiFi配置抽象接口,定义统一的配网方法
  5. 具体配网实现:基于esp_wifi_setting接口的不同配网实现:
    • smart_config:通过ESP Touch协议配网
    • airkiss_config:通过微信Airkiss协议配网
    • blufi_config:通过蓝牙BLE配网

这种分层设计使得系统结构清晰,各个模块职责单一,同时提供了良好的扩展性,可以方便地添加新的配网方式。

核心工作流程

服务初始化与销毁流程

销毁流程
销毁WiFi服务
(wifi_service_destroy)
断开WiFi连接
(wifi_service_disconnect)
资源自动清理
(任务、队列、计时器等)
初始化流程
创建WiFi服务实例
(wifi_service_create)
配置WiFi服务参数
(wifi_service_config_t)
注册配网方式
(wifi_service_register_setting_handle)
设置连接信息
(wifi_service_set_sta_info)
连接WiFi
(wifi_service_connect)

WiFi配网流程

配网流程
启动配网
(wifi_service_setting_start)
注册配网方式
(如smart_config、airkiss等)
用户通过App/小程序
发送配网信息
配网模块接收信息
并解析SSID和密码
通知WiFi服务
(esp_wifi_setting_info_notify)
WiFi服务更新连接信息
并保存到SSID管理器
连接到配置的WiFi
(自动连接)
完成配网或超时
(SETTING_FINISHED/TIMEOUT)

WiFi连接状态转换

初始化
wifi_service_connect
连接成功(获取IP)
连接失败
连接丢失/主动断开
自动重连/手动连接
wifi_service_destroy
wifi_service_setting_start
配网成功后
UNKNOWN
CONNECTING
CONNECTED
DISCONNECTED
SETTING
开始配网
配网成功
配网失败
配网超时
连接配置的WiFi
停留在断开状态
停留在断开状态
SETTING_START
SETTING_FINISHED
SETTING_FAILED
SETTING_TIMEOUT

连接与重连机制

有SSID信息
无SSID信息
成功
失败
连接请求
(wifi_service_connect)
检查是否有SSID信息
获取最佳配置
(从SSID管理器)
使用设置的SSID信息
(wifi_service_set_sta_info)
配置WiFi并连接
连接结果
进入CONNECTED状态
重置重试计数
重试次数<最大值?
启动重试计时器
延时后自动重连
进入DISCONNECTED状态
不再自动重连

配网方式对比

ESP-ADF的wifi_service模块支持多种配网方式,每种都有各自的特点和适用场景:

配网方式原理客户端要求安全性优势适用场景
Smart Config
(ESP Touch)
通过特殊编码的数据包
传输WiFi信息
需要ESP Touch App中等
(数据加密)
使用简单
无需设备交互
简单设备
无屏幕设备
Airkiss
(微信配网)
基于Airkiss协议
通过特殊数据包传输
微信小程序中等
(通道加密)
与微信生态集成
用户认知度高
面向中国市场
微信生态产品
BLE配网
(BluFi)
通过蓝牙BLE连接
传输WiFi信息
支持BLE的APP
(蓝牙加密)
传输稳定可靠
支持双向通信
高端设备
需要配置交互

使用场景与示例

典型应用场景

  1. 音频设备初始配网

    • 用户首次使用音频设备时配置WiFi
    • 支持多种配网方式选择
  2. 已知网络快速连接

    • 设备重启后快速连接已知WiFi
    • 多网络环境下自动选择最佳网络
  3. 网络状态监控与恢复

    • 监控WiFi连接状态
    • 断网时自动重连或提示用户

基础使用流程

下图展示了wifi_service模块的基本使用流程:

方式A: 已知SSID
方式B: 配网模式
1. 配置WiFi服务
wifi_service_config_t
2. 创建WiFi服务
wifi_service_create
3. 注册事件处理回调
通过配置中的evt_cb
4. 选择配网方式
设置SSID信息
wifi_service_set_sta_info
连接WiFi
wifi_service_connect
创建配网实例
(如smart_config_create)
注册配网方式
wifi_service_register_setting_handle
启动配网
wifi_service_setting_start
用户通过APP/小程序配网
配网完成后自动连接
处理WiFi事件
CONNECTED/DISCONNECTED等
使用完毕后销毁服务
wifi_service_destroy

代码示例:已知WiFi信息的连接

// 1. 配置WiFi服务
wifi_service_config_t wifi_cfg = {
    .task_stack = 3*1024,
    .task_prio = 6,
    .task_core = 0,
    .extern_stack = true,
    .evt_cb = wifi_service_event_callback,  // 设置事件回调
    .cb_ctx = NULL,
    .setting_timeout_s = 60,
    .max_retry_time = 5,
    .max_ssid_num = 5
};

// 2. 创建WiFi服务
periph_service_handle_t wifi_service = wifi_service_create(&wifi_cfg);
if (wifi_service == NULL) {
    ESP_LOGE(TAG, "创建WiFi服务失败");
    return ESP_FAIL;
}

// 3. 设置WiFi信息
wifi_config_t sta_cfg = {
    .sta = {
        .ssid = "YOUR_WIFI_SSID",
        .password = "YOUR_WIFI_PASSWORD",
    }
};
wifi_service_set_sta_info(wifi_service, &sta_cfg);

// 4. 连接WiFi
ESP_LOGI(TAG, "开始连接WiFi...");
esp_err_t ret = wifi_service_connect(wifi_service);
if (ret != ESP_OK) {
    ESP_LOGE(TAG, "WiFi连接启动失败");
    return ret;
}

// 5. 事件回调处理函数(需在别处定义)
static void wifi_service_event_callback(periph_service_handle_t handle, periph_service_event_t *evt, void *ctx)
{
    wifi_service_event_t event_id = (wifi_service_event_t)evt->type;
    
    switch (event_id) {
        case WIFI_SERV_EVENT_CONNECTING:
            ESP_LOGI(TAG, "正在连接WiFi...");
            break;
        case WIFI_SERV_EVENT_CONNECTED:
            ESP_LOGI(TAG, "WiFi已连接");
            break;
        case WIFI_SERV_EVENT_DISCONNECTED:
            ESP_LOGW(TAG, "WiFi已断开, 原因: %d", 
                wifi_service_disconnect_reason_get(handle));
            break;
        default:
            ESP_LOGD(TAG, "未处理的事件: %d", event_id);
            break;
    }
}

// 6. 使用完毕后销毁服务(应用结束时)
wifi_service_disconnect(wifi_service);
wifi_service_destroy(wifi_service);

代码示例:Smart Config配网

// 1. 创建WiFi服务(同上)
periph_service_handle_t wifi_service = wifi_service_create(&wifi_cfg);

// 2. 创建Smart Config配置实例
smart_config_info_t smart_info = SMART_CONFIG_INFO_DEFAULT();
esp_wifi_setting_handle_t smart_config = smart_config_create(&smart_info);

// 3. 注册Smart Config到WiFi服务
int smart_config_index = 0;
wifi_service_register_setting_handle(wifi_service, smart_config, &smart_config_index);

// 4. 启动Smart Config
ESP_LOGI(TAG, "启动Smart Config配网...");
wifi_service_setting_start(wifi_service, smart_config_index);

// 5. 事件回调处理
static void wifi_service_event_callback(periph_service_handle_t handle, periph_service_event_t *evt, void *ctx)
{
    wifi_service_event_t event_id = (wifi_service_event_t)evt->type;
    
    switch (event_id) {
        case WIFI_SERV_EVENT_SETTING_TIMEOUT:
            ESP_LOGW(TAG, "配网超时");
            break;
        case WIFI_SERV_EVENT_SETTING_FAILED:
            ESP_LOGE(TAG, "配网失败");
            break;
        case WIFI_SERV_EVENT_SETTING_FINISHED:
            ESP_LOGI(TAG, "配网成功完成");
            break;
        // ... 其他事件处理(同上)
    }
}

// 6. 停止配网(可选,如用户主动取消)
wifi_service_setting_stop(wifi_service, smart_config_index);

SSID管理机制

ESP-ADF的wifi_service内置了SSID管理功能,通过wifi_ssid_manager组件实现:

选择最优网络
单个SSID
SSID管理器
wifi_ssid_manager_create
存储SSID信息
wifi_ssid_manager_save
保存到NVS
设备启动
加载SSID信息
从NVS
多个SSID时
执行扫描
基于信号强度
优先级排序
直接使用
返回最佳配置
wifi_ssid_manager_get_best_config

SSID管理特点

  1. 持久存储:使用NVS非易失性存储,设备重启后仍可恢复
  2. 多SSID支持:可存储多个WiFi网络信息
  3. 优先级策略:基于信号强度和历史记录选择最佳网络
  4. 容量限制:可通过配置限制最大存储数量
  5. 操作接口:提供保存、获取、擦除等完整操作

与ESP-IDF WiFi功能的关系

ESP-ADF的wifi_service是对ESP-IDF原生WiFi功能的高级封装:

层级模块主要功能适用场景
应用层用户应用业务逻辑具体产品功能
ADF服务层wifi_service连接管理
配网集成
SSID管理
状态监控
需要统一接口
需要配网功能
需要多网络管理
IDF功能层ESP-IDF WiFi基础WiFi操作
WiFi事件
协议栈
需要直接控制
自定义WiFi行为
特殊WiFi设置
硬件层WiFi芯片无线通信
信号处理
硬件级控制

wifi_service通过以下方式增强了ESP-IDF的WiFi功能:

  1. 简化接口:提供更高级别、更易用的接口
  2. 状态管理:自动处理WiFi状态变化
  3. 集成多种配网:封装多种配网协议为统一接口
  4. 重连管理:内置智能重连策略
  5. SSID管理:提供SSID的存储和优先级管理

总结

ESP-ADF的wifi_service模块是一个功能丰富的WiFi连接管理组件,它在ESP-IDF原生WiFi功能基础上提供了更高级的抽象和功能封装。通过分层设计和模块化组织,它实现了WiFi配置与连接管理的解耦,支持多种配网方式,并提供了完善的SSID管理机制。

wifi_service的核心价值在于:

  1. 简化开发:统一接口降低开发复杂度
  2. 增强功能:支持多种配网方式和SSID管理
  3. 可靠性提升:内置重连机制和状态监控
  4. 良好扩展性:可以方便添加新的配网方式

在实际应用中,开发者可以根据产品需求选择合适的配网方式,利用wifi_service提供的功能快速实现WiFi连接管理,大大提高开发效率。

下一步,我们将深入探讨各个子模块的具体实现和API使用方法,从wifi_service核心模块开始,逐步分析wifi_ssid_manager和不同的配网实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

omnibots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值