从零开始学ESP32:个人笔记记录:
芯片型号: ESP32
网络环境支持:LWIP
IDF.PY-SDK: ESP-IDF v4.3
芯片功能: 支持STA/AP网络共存模式:
工程: esp-idf/examples/get-started/hello_world
例程: esp-idf/examples/wifi/getting_started/station/main
基本头文件:
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
Cmakelisys.txt配置
idf_component_register(SRCS "test_wlan.c"
INCLUDE_DIRS "."
INCLUDE_DIRS "$ENV{IDF_PATH}/components/spi_flash/include"
INCLUDE_DIRS "$ENV{IDF_PATH}/components/nvs_flash/include"
)
component.mk配置
COMPONENT_ADD_INCLUDEDIRS := .
基本实现代码和解析:
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
#define EXAMPLE_ESP_MAXIMUM_RETRY 10
#define AP_WIFI_SSID "ESP32-AP-MODU"
#define AP_WIFI_PASS "123456789"
#define STA_WIFI_SSID "my_wifi"
#define STA_WIFI_PASS "123456789"
#define D_BUG(frtc, frtl...) \
do{ ESP_LOGI( __FUNCTION__ , frtc,##frtl); } while(0)
static EventGroupHandle_t s_wifi_event_group;
void W_staDisConnectedEv(void)
{
if(s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY)
{
esp_wifi_connect();
s_retry_num++;
D_BUG("retry to connect to the AP \r\n");
}
else
{
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
D_BUG("connect to the AP fail \r\n");
return ;
}
void W_apStaConnectedEv( void* event_data )
{
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
D_BUG("station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid);
}
void W_apStaDisConnectEv( void* event_data )
{
wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
D_BUG("station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid);
}
void W_ipGotHostAddr( void* event_data )
{
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
D_BUG("got ip:" IPSTR, IP2STR(&event->ip_info.ip) );
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
static void W_eventHandler( void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data )
{
if( event_base == WIFI_EVENT )
{
switch ( event_id )
{
case WIFI_EVENT_STA_START: esp_wifi_connect(); break;
case WIFI_EVENT_STA_STOP: D_BUG("STA stop\r\n"); break;
case WIFI_EVENT_STA_DISCONNECTED: W_staDisConnectedEv(); break;
case WIFI_EVENT_AP_START: D_BUG("AP start\r\n"); break;
case WIFI_EVENT_AP_STOP: D_BUG("AP stop\r\n"); break;
case WIFI_EVENT_AP_STACONNECTED: W_apStaConnectedEv( event_data ); break;
case WIFI_EVENT_AP_STADISCONNECTED: W_apStaDisConnectEv(event_data ); break;
default: break;
}
}
else if( event_base == IP_EVENT )
{
switch ( event_id )
{
case IP_EVENT_STA_GOT_IP: W_ipGotHostAddr(event_data); break;
case IP_EVENT_STA_LOST_IP: D_BUG("AP stop\r\n"); break;
case IP_EVENT_AP_STAIPASSIGNED: D_BUG("AP stop\r\n"); break;
default: break;
}
}
return ;
}
void WLAN_netConfDev(char * ssid_sta , char * pwssd_sta )
{
int STA_MAX_RETRY_NUM = 10;
int AP_WIFI_CHANNEL = 13;
int AP_MAX_STA_CONN = 3;
esp_event_handler_instance_t instance_any_id = {0};
esp_event_handler_instance_t instance_got_ip = {0};
s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&W_eventHandler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK( esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&W_eventHandler,
NULL,
&instance_got_ip) );
wifi_config_t wifi_configSta = {
.sta =
{
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false,
},
},
};
strcpy( (char *) wifi_configSta.sta.ssid , ssid_sta );
strcpy( (char *) wifi_configSta.sta.password , pwssd_sta);
wifi_config_t wifi_configAP = {
.ap =
{
.ssid = AP_WIFI_SSID,
.ssid_len = strlen( AP_WIFI_SSID ),
.channel = AP_WIFI_CHANNEL,
.password = AP_WIFI_PASS,
.max_connection = AP_MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK,
}
};
ESP_ERROR_CHECK(esp_wifi_set_mode( WIFI_MODE_APSTA) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP , &wifi_configAP) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_configSta) );
ESP_ERROR_CHECK(esp_wifi_start() );
D_BUG("wifi_init_sta finished.\r\n");
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT)
{
D_BUG("connected to ap SSID:%s password:%s \r\n",ssid, pwssd);
}
else if (bits & WIFI_FAIL_BIT)
{
D_BUG("Failed to connect to SSID:%s, password:%s \r\n",ssid, pwssd);
}
else
{
D_BUG("UNEXPECTED EVENT \r\n");
}
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID , instance_any_id));
vEventGroupDelete(s_wifi_event_group);
}
int app_main( void )
{
WLAN_netConfDev( STA_WIFI_SSID , STA_WIFI_PASS );
}
额外提及一下设置AP的地址和网关,子网掩码等等信息 参考下面
void W_setApDhcpInfo()
{
tcpip_adapter_ip_info_t apNetConfInfo = {0};
tcpip_adapter_init();
tcpip_adapter_dhcps_stop ( TCPIP_ADAPTER_IF_AP );
IP4_ADDR( &apNetConfInfo.ip , 192 , 168 , 1 , 1);
IP4_ADDR( &apNetConfInfo.gw , 192 , 168 , 1 , 1);
IP4_ADDR( &apNetConfInfo.netmask , 255 , 255 , 255 , 0);
tcpip_adapter_set_ip_info( TCPIP_ADAPTER_IF_AP , &apNetConfInfo );
tcpip_adapter_dhcps_stop( TCPIP_ADAPTER_IF_AP );
}
这个函数可以上面的 AP/STA 模式启动之后执行
成功之后正常情况是:
连接上当前路由的WIFI 并且打印处对应的IP
然后使用手机搜索WIFI的时候会发现多出一个$(AP_WIFI_SSID)名称的热点。
说明:笔记使用-记录(抄袭我就吊你 J J )
关注微信公众号 一起学习 ( 技术Code城 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)