ESP8266 RTOS學習之旅(3)— 連接到WiFi

連接到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);
}

編譯燒錄運行,可以看到:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章