連接到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);
}
編譯燒錄運行,可以看到: