222 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "wifi.h"
 | ||
| 
 | ||
| #include <stdbool.h>
 | ||
| #include <stdint.h>
 | ||
| 
 | ||
| #include <nvs_flash.h>
 | ||
| #include <esp_wifi.h>
 | ||
| #include <esp_event.h>
 | ||
| 
 | ||
| #include "config.h"
 | ||
| #include "logger.h"
 | ||
| 
 | ||
| #define MAX_RETRY_ATTEMPTS 20
 | ||
| // static int s_ap_creds_num = 0;
 | ||
| static int s_retry_num = 0;
 | ||
| 
 | ||
| EventGroupHandle_t s_wifi_event_group;
 | ||
| esp_event_handler_instance_t instance_any_id;
 | ||
| esp_event_handler_instance_t instance_got_ip;
 | ||
| 
 | ||
| static void event_handler(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_WIFI_READY:
 | ||
| 				LOG_I("wifi: WiFi ready");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_SCAN_DONE:
 | ||
| 				LOG_I("wifi: Finished scanning AP");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_START:
 | ||
| 				LOG_I("wifi: Station start");
 | ||
| 				esp_wifi_connect();
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_STOP:
 | ||
| 				LOG_I("wifi: Station stop");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_CONNECTED:
 | ||
| 				LOG_I("wifi: Station connected to AP");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_DISCONNECTED:
 | ||
| 				LOG_W("wifi: Station disconnected from AP");
 | ||
| 				if (s_retry_num < MAX_RETRY_ATTEMPTS)
 | ||
| 				{
 | ||
| 					s_retry_num++;
 | ||
| 					LOG_I("wifi: retry num %d", s_retry_num);
 | ||
| 					esp_wifi_connect();
 | ||
| 				}
 | ||
| 				else
 | ||
| 				{
 | ||
| 					xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
 | ||
| 				}
 | ||
| 				break;
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_AUTHMODE_CHANGE:
 | ||
| 				LOG_I("wifi: the auth mode of AP connected by device's station changed");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_WPS_ER_SUCCESS:
 | ||
| 				LOG_I("wifi: Station wps succeeds in enrollee mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_WPS_ER_FAILED:
 | ||
| 				LOG_E("wifi: Station wps fails in enrollee mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_WPS_ER_TIMEOUT:
 | ||
| 				LOG_E("wifi: Station wps timeout in enrollee mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_WPS_ER_PIN:
 | ||
| 				LOG_I("wifi: Station wps pin code in enrollee mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP:
 | ||
| 				LOG_I("wifi: Station wps overlap in enrollee mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_START:
 | ||
| 				LOG_I("wifi: Soft-AP start");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_STOP:
 | ||
| 				LOG_I("wifi: Soft-AP stop");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_STACONNECTED:
 | ||
| 				LOG_I("wifi: a station connected to Soft-AP");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_STADISCONNECTED:
 | ||
| 				LOG_W("wifi: a station disconnected from Soft-AP");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_PROBEREQRECVED:
 | ||
| 				LOG_I("wifi: Receive probe request packet in soft-AP interface");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_FTM_REPORT:
 | ||
| 				LOG_I("wifi: Receive report of FTM procedure");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_BSS_RSSI_LOW:
 | ||
| 				LOG_I("wifi: AP's RSSI crossed configured threshold");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ACTION_TX_STATUS:
 | ||
| 				LOG_I("wifi: Status indication of Action Tx operation");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ROC_DONE:
 | ||
| 				LOG_I("wifi: Remain-on-Channel operation complete");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_STA_BEACON_TIMEOUT:
 | ||
| 				LOG_E("wifi: Station beacon timeout");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_CONNECTIONLESS_MODULE_WAKE_INTERVAL_START:
 | ||
| 				LOG_I("wifi: Connectionless module wake interval start");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_WPS_RG_SUCCESS:
 | ||
| 				LOG_I("wifi: Soft-AP wps succeeds in registrar mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_WPS_RG_FAILED:
 | ||
| 				LOG_E("wifi: Soft-AP wps fails in registrar mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_WPS_RG_TIMEOUT:
 | ||
| 				LOG_E("wifi: Soft-AP wps timeout in registrar mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_WPS_RG_PIN:
 | ||
| 				LOG_I("wifi: Soft-AP wps pin code in registrar mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_AP_WPS_RG_PBC_OVERLAP:
 | ||
| 				LOG_I("wifi: Soft-AP wps overlap in registrar mode");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ITWT_SETUP:
 | ||
| 				LOG_I("wifi: iTWT setup");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ITWT_TEARDOWN:
 | ||
| 				LOG_I("wifi: iTWT teardown");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ITWT_PROBE:
 | ||
| 				LOG_I("wifi: iTWT probe");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_ITWT_SUSPEND:
 | ||
| 				LOG_I("wifi: iTWT suspend");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NAN_STARTED:
 | ||
| 				LOG_I("wifi: NAN Discovery has started");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NAN_STOPPED:
 | ||
| 				LOG_I("wifi: NAN Discovery has stopped");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NAN_SVC_MATCH:
 | ||
| 				LOG_I("wifi: NAN Service Discovery match found");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NAN_REPLIED:
 | ||
| 				LOG_I("wifi: Replied to a NAN peer with Service Discovery match");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NAN_RECEIVE:
 | ||
| 				LOG_I("wifi: Received a Follow-up message");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NDP_INDICATION:
 | ||
| 				LOG_I("wifi: Received NDP Request from a NAN Peer");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NDP_CONFIRM:
 | ||
| 				LOG_I("wifi: NDP Confirm Indication");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_NDP_TERMINATED:
 | ||
| 				LOG_I("wifi: NAN Datapath terminated indication");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_HOME_CHANNEL_CHANGE:
 | ||
| 				LOG_I("wifi: WiFi home channel change,doesn't occur when scanning");
 | ||
| 				break;
 | ||
| 			case WIFI_EVENT_MAX:
 | ||
| 				LOG_I("wifi: Invalid WiFi event ID");
 | ||
| 				break;
 | ||
| 		}
 | ||
| 	}
 | ||
| 	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;
 | ||
| 		LOG_I("wifi: got ip: " IPSTR "", IP2STR(&event->ip_info.ip));
 | ||
| 		s_retry_num = 0;
 | ||
| 		xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void wifiInit()
 | ||
| {
 | ||
| 	// init network interface
 | ||
| 	ESP_ERROR_CHECK(esp_netif_init());
 | ||
| 
 | ||
| 	// create event group
 | ||
| 	s_wifi_event_group = xEventGroupCreate();
 | ||
| 	assert(s_wifi_event_group);
 | ||
| 	ESP_ERROR_CHECK(esp_event_loop_create_default());
 | ||
| 
 | ||
| 	// init wifi as default station
 | ||
| 	esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
 | ||
| 	assert(sta_netif);
 | ||
| 	wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
 | ||
| 	ESP_ERROR_CHECK(esp_wifi_init(&cfg));
 | ||
| 
 | ||
| 	// register events
 | ||
| 	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));
 | ||
| 
 | ||
| 	LOG_I("wifi: wifi_init_sta finished.");
 | ||
| }
 | ||
| 
 | ||
| void wifi_connect()
 | ||
| {
 | ||
| 	// set wifi connection config
 | ||
| 	wifi_config_t wifi_config = {
 | ||
| 		.sta = {
 | ||
| 			.ssid = WIFI_SSID,
 | ||
| 			.password = WIFI_PASS,
 | ||
| 			/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (pasword len => 8).
 | ||
| 				* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value
 | ||
| 				* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to
 | ||
| 				* WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK standards.
 | ||
| 				*/
 | ||
| 			.threshold.authmode = WIFI_AUTH,
 | ||
| 			.sae_pwe_h2e = WPA3_SAE_PWE_HUNT_AND_PECK,
 | ||
| 			.sae_h2e_identifier = "",
 | ||
| 		},
 | ||
| 	};
 | ||
| 	ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
 | ||
| 	ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
 | ||
| 	ESP_ERROR_CHECK(esp_wifi_start());
 | ||
| }
 |