1. AP(接入点)模式:

可以理解为一个无法访问外网的局域网WIFI路由器节点,可以接受各类设备的连接请求,并且可以与连接的设备进行TCP,UDP连接,实现数据流。

实现步骤:

  1. 初始化flash(我也不太明白,可能是flash中有关于wifi的配置吧)
  2. 初始化LwIP
  3. 创建系统事件任务并初始化应用程序事件的回调函数
  4. 创建具有TCP / IP堆栈的默认网络接口实例绑定AP
  5. 初始化WIFI
  6. 配置WIFI
  7. 启动WIFI
#include <stdio.h>
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "esp_event.h"

static void event_hander(void* event_handler_arg,
                                        esp_event_base_t event_base,
                                        int32_t event_id,
                                        void* event_data)
{
	 switch (event_id)
    {
		//AP开始
    case SYSTEM_EVENT_AP_START:
        printf("\nwifi_softap_start\n");
        break;
		//有STA连接上ESP32的AP
    case SYSTEM_EVENT_AP_STACONNECTED:
        printf("\nwifi_softap_connectted\n");
        break;
		//有STA断开ESP32的AP
    case SYSTEM_EVENT_AP_STADISCONNECTED:
        printf("\nwifi_softap_disconnectted\n");
        break;
    default:
        break;
    }
}
void app_main(void) {	

	//初始化NVS(ESP_ERROR_CHECK()检查函数的返回值错误)
	ESP_ERROR_CHECK( nvs_flash_init() );
	//初始化lwip相关
	esp_netif_init();
	//创建系统事件任务并初始化应用程序事件的回调函数
	ESP_ERROR_CHECK(esp_event_loop_create_default());
	//创建具有TCP/IP堆栈的默认网络接口实例
	esp_netif_create_default_wifi_ap();

	//创建wifi初始化参数结构体,获取默认配置
	wifi_init_config_t wifi_init =  WIFI_INIT_CONFIG_DEFAULT();
	//初始wifi资源
	ESP_ERROR_CHECK(esp_wifi_init(&wifi_init));
	//注册wifi事件到默认事件循环
	ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_hander,NULL,NULL));
	//定义wifi配置参数
	wifi_config_t wificonfig = {
		.ap = {
			.ssid = "esp32",
			.ssid_len = 0,//SSID长度
			.max_connection = 1,//能连接的最大节点数
			.password = "12345678",
			.authmode = WIFI_AUTH_WPA_WPA2_PSK,//授权模式
		},
	};

	//设置wifi模式
	ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
	//使能wifi
	ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP,&wificonfig));
	//启动wifi
	ESP_ERROR_CHECK(esp_wifi_start());
}

以下为关于WIFI的事件

SYSTEM_EVENT_WIFI_READY = 0, /*WiFi 准备好*/
SYSTEM_EVENT_SCAN_DONE, /*扫描 AP 完成*/ 
SYSTEM_EVENT_STA_START, /*作为 STA 开始工作*/ 
SYSTEM_EVENT_STA_STOP, /*作为 STA 结束工作*/ 
SYSTEM_EVENT_STA_CONNECTED, /*作为 STA 连接上 AP*/ 
SYSTEM_EVENT_STA_DISCONNECTED, /*作为 STA 断开 AP*/ 
SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /*作为 STA 连接的 AP 改变了*/ 
SYSTEM_EVENT_STA_GOT_IP, /*作为 STA 从 AP 获取了 IP*/ 
SYSTEM_EVENT_STA_LOST_IP, /*作为 STA 丢掉了 IP,也就是错了*/ 
SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /*wps succeeds in enrollee mode */ 
SYSTEM_EVENT_STA_WPS_ER_FAILED, /* wps fails in enrollee mode */ 
SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /* wps timeout in enrollee mode */
 SYSTEM_EVENT_STA_WPS_ER_PIN, /*wps pin code in enrollee mode */ 
 SYSTEM_EVENT_AP_START, /*AP 开始*/ 
SYSTEM_EVENT_AP_STOP, /*AP 结束*/ 
SYSTEM_EVENT_AP_STACONNECTED, /*有 STA 连上 SP32 的 AP*/
SYSTEM_EVENT_AP_STADISCONNECTED, /*有 STA 断开 ESP32 的 AP*/ 
SYSTEM_EVENT_AP_PROBEREQRECVED, /*从 AP 中接收包*/ 
SYSTEM_EVENT_GOT_IP6, /*获取 IPv6*/ 
SYSTEM_EVENT_ETH_START, /*有线开始*/ 
SYSTEM_EVENT_ETH_STOP, /*有线停止*/ 
SYSTEM_EVENT_ETH_CONNECTED, /*有线上线*/ 
SYSTEM_EVENT_ETH_DISCONNECTED, /*有线掉线*/ 
SYSTEM_EVENT_ETH_GOT_IP, /*有线获取了 IP*/

2.STA(基站)模式

将ESP32连接至附近的AP

实现步骤:

  1. 初始化flash(我也不太明白,可能是flash中有关于wifi的配置吧)
  2. 初始化LwIP
  3. 创建系统事件任务并初始化应用程序事件的回调函数
  4. 创建具有TCP / IP堆栈的默认网络接口实例绑定AP
  5. 初始化WIFI
  6. 配置WIFI
  7. 启动WIFI
void event_hander(void* event_handler_arg,
                                        esp_event_base_t event_base,
                                        int32_t event_id,
                                        void* event_data)
{
	ip_event_got_ip_t *ip = event_data;
	if(event_base == WIFI_EVENT){
		 switch (event_id)
    	{
			//STA开始
			case WIFI_EVENT_STA_START:
				//连接AP
				esp_wifi_connect();
				printf("\nwifi_sta_start\n");
				break;
				//连接失败
			case WIFI_EVENT_STA_DISCONNECTED:
				printf("\nwifi_sta_fail\n");
				esp_wifi_connect();
				break;
    	}

	}else if (event_base == IP_EVENT)
	{
		if(event_id == IP_EVENT_STA_GOT_IP){
			//获取当前连接ap的ip地址,并打印出来
			printf("content : "IPSTR"\n" , IP2STR(&ip->ip_info.ip));
		}
	}
	
}
void app_main(void) {	

	//初始化NVS(ESP_ERROR_CHECK()检查函数的返回值错误)
	ESP_ERROR_CHECK( nvs_flash_init() );
	//初始化lwip相关
	esp_netif_init();
	//创建系统事件任务并初始化应用程序事件的回调函数
	ESP_ERROR_CHECK(esp_event_loop_create_default());
	//创建具有TCP/IP堆栈的默认网络接口实例
	esp_netif_create_default_wifi_sta();

	//创建wifi初始化参数结构体,获取默认配置
	wifi_init_config_t wifi_init =  WIFI_INIT_CONFIG_DEFAULT();
	//初始wifi资源
	ESP_ERROR_CHECK(esp_wifi_init(&wifi_init));
	//注册wifi和ip地址事件到默认事件循环
	ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_hander,NULL,NULL));
	ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_hander,NULL,NULL));
	//定义wifi配置参数
	wifi_config_t wificonfig = {
		.ap = {
			.ssid = "dream",
			.password = "88886666",
		},
	};

	//设置wifi模式
	ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
	//使能wifi
	ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA,&wificonfig));
	//启动wifi
	ESP_ERROR_CHECK(esp_wifi_start());
}