1. AP(接入点)模式:
可以理解为一个无法访问外网的局域网WIFI路由器节点,可以接受各类设备的连接请求,并且可以与连接的设备进行TCP,UDP连接,实现数据流。
实现步骤:
- 初始化flash(我也不太明白,可能是flash中有关于wifi的配置吧)
- 初始化LwIP
- 创建系统事件任务并初始化应用程序事件的回调函数
- 创建具有TCP / IP堆栈的默认网络接口实例绑定AP
- 初始化WIFI
- 配置WIFI
- 启动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
实现步骤:
- 初始化flash(我也不太明白,可能是flash中有关于wifi的配置吧)
- 初始化LwIP
- 创建系统事件任务并初始化应用程序事件的回调函数
- 创建具有TCP / IP堆栈的默认网络接口实例绑定AP
- 初始化WIFI
- 配置WIFI
- 启动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());
}