ESP32+idf开发之WIFI通信入门(2)station网络连接
1、新建工程项目ctrl+shift+p,选择new project,输入项目名,选择合适项目路径,选择对应的开发板,此处选择自定义,target选择ESP32 moudule,点击选择模板。
2、选择idf的模板example,选择其中空白的样例工程,点击创建项目用此模板,并在新的窗口打开,旧窗口就可以关闭了。
3、在vscode中项目路径下找到main.c文件,输入以下代码实现以下功能:
(1)能连接到你的热点(用户名ssid,密码password);
(2)能够实现断线重连;
(3)信号量完成事件处理函数和主任务的同步,当连接成功后,主任务能够输出“connected to ap!”
#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_netif.h>
#include <esp_wifi.h>
#include <esp_event.h>
#include <nvs_flash.h>
static char *TAG = "wifi station";
SemaphoreHandle_t sem;
// 状态机事件处理:static void event_handler(void * arg, esp_event_base_t event_base,
// int32_t event_id, void * event_data)
static void 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 ||
event_id == WIFI_EVENT_STA_DISCONNECTED))
{
ESP_LOGI(TAG, "begin to connect the AP");
esp_wifi_connect();
}
else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
{
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
xSemaphoreGive(sem);
}
}
void app_main(void)
{
sem = xSemaphoreCreateBinary();
// nvs初始化:nvs_flash_init()
ESP_ERROR_CHECK(nvs_flash_init());
// 事件循环初始化:sp_event_loop_create_default();
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 事件处理函数注册
// esp_err_t esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,
// esp_event_handler_t event_handler, void * event_handler_arg)
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, event_handler, NULL));
// 初始化阶段:esp_netif_init();sp_netif_create_default_wifi_sta();esp_wifi_init();
ESP_ERROR_CHECK(esp_netif_init());
esp_netif_create_default_wifi_sta();
wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&wifi_cfg));
// 配置阶段:esp_wifi_set_mode();esp_wifi_set_config();
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
wifi_config_t cfg = {
.sta = {
//用户名和密码根据实际情况修改
.ssid = "ssid",
.password = "password",
}};
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &cfg));
// 启动阶段:esp_wifi_start()
ESP_ERROR_CHECK(esp_wifi_start());
while (1)
{
if (xSemaphoreTake(sem, portMAX_DELAY) == pdPASS)
{
ESP_LOGI(TAG, "connected to ap!");
}
}
}
4、编译(build)、烧写(flash)和监控(monitor),成功连接ap,断开后不断重连并打印begin to connect the AP,直到再次连接成功。