wifi_sta

YIN 发布于 2025-05-15 148 次阅读


使用的库

  • "esp_wifi.h"
  • "esp_log.h"
  • "esp_err.h"

初始化(假设你已经完成nvs_flash初始化)

Wifi事件与资源配置及启动

  • 启动TCP协议栈 esp_netif_init()
  • 创建默认事件循环 esp_event_loop_create_default()
  • 注册事件处理程序 esp_event_handler_instance_register()
    创建事件循环 -> 注册事件处理程序 -> 发布事件到事件循环
  • 创建网络接口对象、应用默认配置、注册部分事件回调 esp_netif_create_default_wifi_sta()
    调用之前需要完成默认事件循环创建
  • 初始化Wifi配置 esp_wifi_init()
    默认情况可传入接收WIFI_INIT_CONFIG_DEFAULT()的变量,无需自行配置
  • 设置Wifi模式为Station esp_wifi_set_mode(WIFI_MODE_STA)
  • 创建 wifi_config_t 类型变量并将网络配置(用户名、密码、认证方式)写入
  • 设置上述网络配置 esp_wifi_set_config()
    对于Station模式,wifi_interface_t传入ESP_IF_WIFI_STA
  • (可选)esp_netif_set_hostname() 更改客户端名称
    esp_netif_t 传入 esp_netif_create_default_wifi_sta() 返回的接口对象
  • 启动 esp_wifi_start()

示例

C
static wifi_config_t WifiCfg;
static esp_netif_t* StaNetif = NULL;

void wifiSetConfig() 
{
    esp_netif_set_hostname(StaNetif, (const char*)device_name); /*TODO 填写客户端名称*/
    WifiCfg.sta.threshold.authmode = wifi_authmode;             /*TODO 填写Wifi认证方式*/
    strcpy((char*)WifiCfg.sta.ssid,(const char*)wifi_ssid);     /*TODO 填写SSID*/
    strcpy((char*)WifiCfg.sta.password,(const char*)wifi_password); /*TODO 填写密码*/
    ESP_LOGI(__func__,"SSID: %s, Password: %s",wifi_ssid, wifi_password);
    esp_wifi_set_config(ESP_IF_WIFI_STA, &WifiCfg);
}

void wifiInit()
{
  ESP_ERROR_CHECK(esp_netif_init());
  ESP_ERROR_CHECK(esp_event_loop_create_default());
  /*注册Wifi相关事务回调*/
  ESP_ERROR_CHECK(esp_event_handler_instance_register(
      WIFI_EVENT, 
      ESP_EVENT_ANY_ID, 
      &wifi_event_handler, /*TODO 实现Wifi事件回调函数*/
      NULL, 
      NULL
  ));
  /*注册IP相关事务回调*/
  ESP_ERROR_CHECK(esp_event_handler_instance_register(
      IP_EVENT, 
      IP_EVENT_STA_GOT_IP, 
      &wifi_event_handler, 
      NULL, 
      NULL
  ));
  StaNetif = esp_netif_create_default_wifi_sta();
  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));
  /*Wifi配置等函数打包 */
  wifiSetConfig();
  ESP_ERROR_CHECK(esp_wifi_start());
}

Wifi事件处理函数实现

事件处理函数需要传入一些参数

  1. void *arg
  2. esp_event_base_t event_base 指定事件基础类型,如IP_EVENT/WIFI_EVENT
  3. int32_t event_id 指定事件类型
  4. void *event_data 事件额外的数据

即:

C
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
    int32_t event_id, void *event_data);

需要处理的Wifi事件

  • Wifi Station启动完成 WIFI_EVENT_STA_START
    可以在此之后调用esp_wifi_connect()进行连接

可选的Wifi事件

  • Wifi Station停止完成 WIFI_EVENT_STA_STOP
  • 接入站点 WIFI_EVENT_STA_CONNECTED
  • 断开连接 WIFI_EVENT_STA_DISCONNECTED

需要处理的IP事件

  • 获取到IP地址 IP_EVENT_STA_GOT_IP
    可以启动诸如Http Server等需要联网的功能

简单示例(不安全)

C
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
    int32_t event_id, void *event_data) 
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        /*TODO 获取IP地址! 可以在此实现一些联网程序的初始化*/
    }
}

断开连接

使用 esp_wifi_disconnect() 断开与当前AP的连接
该操作不会清除Wifi相关事务,只是断开连接

更改Wifi配置

  • 断开连接
  • 重新配置
  • 启动连接

扫描

  • 断开连接
    为了防止Wifi连接等事务影响扫描,建议先断开连接
  • 启动扫描 esp_wifi_scan_start()
  • 获取结果 esp_wifi_scan_get_ap_records()
  • 恢复连接

esp_wifi_scan_get_ap_records() 传出两个参数

  • uint16_t *number 扫描到的AP数量
  • wifi_ap_record_t *ap_records 扫描结果

示例

C
void wifiScan(wifi_ap_record_t* ret, uint16_t* number) 
{
    ESP_ERROR_CHECK(esp_wifi_disconnect());
    ESP_ERROR_CHECK(esp_wifi_scan_start(NULL, true)); /* 阻塞态运行 */
    ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(number, ret));
    ESP_ERROR_CHECK(esp_wifi_connect());
}

void your_program()/*这是示例程序,请更改为你自己的程序*/
{
    wifi_ap_record_t* ScanRecord = NULL;
    uint16_t ScanNum = 0;
    wifiScan (ScanRecord, &ScanNum);

    ScanRecord[0].rssi; /* 信号强度 */
    ScanRecord[0].ssid;  /* SSID */
    ScanRecord[0].authmode /* 认证方式 */
}
此作者没有提供个人介绍。
最后更新于 2025-05-16