连接到WiFi
一、初始化wifi连接
在user_init()
里设置WiFi 连接的参数,然后开始WiFi连接
wifi_set_opmode(STATION_MODE); /* 设置为STATION模式 */
struct station_config config; /* 新建WiFi连接初始化结构体 */
sprintf(config.ssid, "WiFi-William"); /* 设置WiFi名称 */
sprintf(config.password, "pswdwilliam"); /* 设置WiFi密码 */
wifi_station_set_config(&config); /* 设置WiFi station接口配置,并保存到 flash */
wifi_station_connect(); /* 连接路由器 */
编译烧录运行,可以看到,连接成功,并且获取到了IP地址
二、WiFi连接事件
新建app_wifi.c
文件,然后将WiFi初始化放入wifi_sta_init()
函数,在user_init()
函数中调用即可,并且在其中注册一个WiFi连接事件回调函数,新建一个wifi连接任务和WiFi连接消息队列,在WiFi连接任务里等待WiFi连接消息队列的消息,代码如下:
#include "esp_common.h"
#include "freertos/queue.h"
/* 定义wifi连接标志 */
uint8_t WiFi_CONNECTED = 0x01;
uint8_t WiFi_FAIL = 0x02;
/* 定义一个WiFi连接消息队列句柄 */
xQueueHandle WiFi_Queue;
void wifi_handle_event_cb(System_Event_t *event)
{
static uint32_t retry_num = 0;
/* 打印WiFi连接事件id */
os_printf("[WiFi] event id : 0x%u \n", event->event_id);
switch (event->event_id) {
/* wifi连接成功 */
case EVENT_STAMODE_CONNECTED:
printf("connect to ssid %s, channel %d\n",event->event_info.connected.ssid,event->event_info.connected.channel);
retry_num = 0;
xQueueSend(WiFi_Queue, &WiFi_CONNECTED, 10);
break;
/* wifi连接断开 */
case EVENT_STAMODE_DISCONNECTED:
printf("disconnect from ssid %s, reason %d\n",event->event_info.disconnected.ssid,event->event_info.disconnected.reason);
if(retry_num > 15)
xQueueSend(WiFi_Queue, &WiFi_FAIL, 10);
printf("retry to connect to the AP %d times. \n",retry_num);
break;
/* 获取到IP地址 */
case EVENT_STAMODE_GOT_IP:
printf("got ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR "\n",
IP2STR(&event->event_info.got_ip.ip),
IP2STR(&event->event_info.got_ip.mask),
IP2STR(&event->event_info.got_ip.gw));
break;
/* 获取IP地址超时 */
case EVENT_STAMODE_DHCP_TIMEOUT:
printf("got ip timeout. \n");
break;
default:
break;
}
}
/* wifi连接任务函数 */
static void wifi_task(void *pvParameters)
{
uint8_t wifi_flag = 0;
xQueueReceive(WiFi_Queue, &wifi_flag, portMAX_DELAY);
if(wifi_flag == WiFi_CONNECTED){
printf("WiFi connected success.\n");
}
else if(wifi_flag == WiFi_FAIL){
printf("WiFi connected failure.\n");
}
vTaskDelete(NULL);
}
void wifi_sta_init(void)
{
wifi_set_opmode(STATION_MODE); /* 设置为STATION模式 */
struct station_config config; /* 新建WiFi连接初始化结构体 */
sprintf(config.ssid, "WiFi-William"); /* 设置WiFi名称 */
sprintf(config.password, "pswdwilliam"); /* 设置WiFi密码 */
wifi_station_set_config(&config); /* 设置WiFi station接口配置,并保存到 flash */
wifi_station_connect(); /* 连接到路由器 */
/* 注册WiFi连接事件回调函数 */
wifi_set_event_handler_cb(wifi_handle_event_cb);
/* 创建WiFi连接消息队列 ,参数分别为:1、队列长度,2、消息字节长度 */
WiFi_Queue = xQueueCreate(3, 1);
/* 创建WiFi连接任务 */
xTaskCreate(wifi_task, "wifi task", 256, NULL, 4, NULL);
}
编译烧录运行,可以看到: