ESPIDF开发ESP32学习笔记【WiFi实现】
生活随笔
收集整理的這篇文章主要介紹了
ESPIDF开发ESP32学习笔记【WiFi实现】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WiFi外設配置
ESP32/8266的Wi-Fi庫支持配置及監控Wi-Fi連網功能
相關內容參考樂鑫的ESP32/8266文檔https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.1/api-reference/network/esp_wifi.html
基本模式
基站模式(又稱STA模式或Client模式):將ESP連接到附近的AP,此時相當于ESP在蹭網
AP模式(又稱Soft-AP模式或Server模式):將ESP設置為AP,可供周圍設備連接,此時相當于ESP開熱點
AP-STA共存模式:ESP32既是接入點,同時又作為基站連接到另外一個接入點,此時相當于ESP連著隔壁wifi開熱點給自家用
同時支持以上模式的安全模式(WPA、WPA2、WEP等),可以理解成安全蹭網
基本功能
庫函數
特征:大部分API都有對應的set和get兩個方向,需要回傳數據時使用get*,初始設置時使用set*
AP模式初始化
void wifi_init_softap(void) {ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_ap();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,&wifi_event_handler,NULL,NULL));wifi_config_t wifi_config = {.ap = {.ssid = EXAMPLE_ESP_WIFI_SSID,.ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),.channel = EXAMPLE_ESP_WIFI_CHANNEL,.password = EXAMPLE_ESP_WIFI_PASS,.max_connection = EXAMPLE_MAX_STA_CONN,.authmode = WIFI_AUTH_WPA_WPA2_PSK},};if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0){wifi_config.ap.authmode = WIFI_AUTH_OPEN;}ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL); }其中主要用到了wifi_config_t這個結構體,它的內容如下所示
typedef struct {uint8_t ssid[32];//SSIDuint8_t password[64];//密碼uint8_t ssid_len;//SSID長度,若設為0則會自動查找到終止字符;否則會在規定長度處截斷uint8_t channel;//AP的通道wifi_auth_mode_t authmode;//授權模式uint8_t ssid_hidden;//是否廣播SSID,默認為0-廣播;設為1則不廣播uint8_t max_connection;//能連接的最大節點數量,默認為4,最大為4uint16_t beacon_interval;//信標間隔,默認100ms,應設置在100-60000ms內 } wifi_ap_config_t;STA模式初始化
void wifi_init_sta(void) {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_event_handler_instance_t instance_any_id;esp_event_handler_instance_t instance_got_ip;ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL,&instance_any_id));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_handler,NULL,&instance_got_ip));wifi_config_t wifi_config = {.sta = {.ssid = EXAMPLE_ESP_WIFI_SSID,.password = EXAMPLE_ESP_WIFI_PASS,/* Setting a password implies station will connect to all security modes including WEP/WPA.* However these modes are deprecated and not advisable to be used. Incase your Access point* doesn't support WPA2, these mode can be enabled by commenting below line */.threshold.authmode = WIFI_AUTH_WPA2_PSK,.pmf_cfg = {.capable = true,.required = false},},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );ESP_ERROR_CHECK(esp_wifi_start() );ESP_LOGI(TAG, "wifi_init_sta finished.");/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,pdFALSE,pdFALSE,portMAX_DELAY);/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually* happened. */if (bits & WIFI_CONNECTED_BIT) {ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);} else if (bits & WIFI_FAIL_BIT) {ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);} else {ESP_LOGE(TAG, "UNEXPECTED EVENT");}/* The event will not be processed after unregister */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); }其中主要用到了wifi_sta_config_t這個結構體,它的內容如下所示
typedef struct {uint8_t ssid[32];//SSIDuint8_t password[64];//密碼bool bssid_set;//是否設置目標AP的MAC地址,一般設為0;只有用戶需要查看AP的MAC地址時才設為1uint8_t bssid[6];//目標AP的MAC地址uint8_t channel;//目標AP的通道,如果未知設為0;范圍是1-13 } wifi_sta_config_t;AP-STA共存模式
esp_err_t event_handler(void *ctx, system_event_t *event) {switch (event->event_id){case SYSTEM_EVENT_STA_START:ESP_LOGI(TAG, "Connecting to AP");esp_wifi_connect();break;case SYSTEM_EVENT_STA_GOT_IP:ESP_LOGI(TAG, "Connected");break;case SYSTEM_EVENT_STA_DISCONNECTED://ESP_LOGI(TAG, "Wifi disconnected, try to connect again...");esp_wifi_connect();break;default:break;}return ESP_OK; }void ESP_net_init(void) {ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK( esp_wifi_init(&cfg) );ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_APSTA) );wifi_config_t sta_config = {.sta = {.ssid = TARGET_ESP_WIFI_SSID,.password = TARGET_ESP_WIFI_PASS,.bssid_set = false}};wifi_config_t ap_config = {.ap = {.ssid = AP_ESP_WIFI_SSID,.password = AP_ESP_WIFI_PASS,.ssid_len = 0,.max_connection = AP_MAX_STA_CONN,.authmode = WIFI_AUTH_WPA_PSK}};ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config));esp_err_t tmp=esp_wifi_set_config(WIFI_IF_AP, &ap_config);ESP_ERROR_CHECK(esp_wifi_start());esp_wifi_connect(); }void app_main(void) {//init NVSesp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);//init wifi ap and stationESP_net_init(); }在這里使用了狀態機(SM)的編程思路,【開始連接】-【連接完畢】-【丟失連接】幾個狀態切換中都會調用event_handler()進行處理并打印相關信息
基本初始化方法
//設置線程 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//進行默認初始化//設置wifi_config結構體來配置具體的wifi模式 wifi_config_t sta_wifi_config = {.sta = {.ssid = SSID,.password = PASSWORD,.threshold.authmode = WIFI_AUTH_WPA2_PSK,.pmf_cfg = {//這里可省略.capable = true,.required = false},},}; wifi_config_t ap_wifi_config = {.ap = {.ssid = SSID,.ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),.channel = WIFI_CHANNEL,.password = PASSWORD,.max_connection = MAX_STA_CONN,//這里可省略.authmode = WIFI_AUTH_WPA_WPA2_PSK},};if (strlen(PASSWORD) == 0)//檢查密碼是否為空 {wifi_config.ap.authmode = WIFI_AUTH_OPEN; }//檢查錯誤并使能設置 ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); esp_err_t tmp=esp_wifi_set_config(WIFI_IF_AP, &ap_config);esp_wifi_connect();//連接wifi/* 中間可加入ESP_LOGI()輸出debg消息 */總結
以上是生活随笔為你收集整理的ESPIDF开发ESP32学习笔记【WiFi实现】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WiFi_WiFi6和WiFi5区别
- 下一篇: tomcat默认端口号(三个tomcat