ESP32扫描环境中的所有WiFi并且通过串口选择需要连接的WiFi

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_system.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"
//#include "uart0.h"

// #include "esp_spi_flash.h"
/* Set the SSID and Password via project configuration, or can set directly here */
#define DEFAULT_SSID CONFIG_EXAMPLE_WIFI_SSID
#define DEFAULT_PWD CONFIG_EXAMPLE_WIFI_PASSWORD

#if CONFIG_EXAMPLE_WIFI_ALL_CHANNEL_SCAN
#define DEFAULT_SCAN_METHOD WIFI_ALL_CHANNEL_SCAN
#elif CONFIG_EXAMPLE_WIFI_FAST_SCAN
#define DEFAULT_SCAN_METHOD WIFI_FAST_SCAN
#else
#define DEFAULT_SCAN_METHOD WIFI_FAST_SCAN
#endif /*CONFIG_EXAMPLE_SCAN_METHOD*/

#if CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SIGNAL
#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL
#elif CONFIG_EXAMPLE_WIFI_CONNECT_AP_BY_SECURITY
#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SECURITY
#else
#define DEFAULT_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL
#endif /*CONFIG_EXAMPLE_SORT_METHOD*/

#if CONFIG_EXAMPLE_FAST_SCAN_THRESHOLD
#define DEFAULT_RSSI CONFIG_EXAMPLE_FAST_SCAN_MINIMUM_SIGNAL
#if CONFIG_EXAMPLE_FAST_SCAN_WEAKEST_AUTHMODE_OPEN
#define DEFAULT_AUTHMODE WIFI_AUTH_OPEN
#elif CONFIG_EXAMPLE_FAST_SCAN_WEAKEST_AUTHMODE_WEP
#define DEFAULT_AUTHMODE WIFI_AUTH_WEP
#elif CONFIG_EXAMPLE_FAST_SCAN_WEAKEST_AUTHMODE_WPA
#define DEFAULT_AUTHMODE WIFI_AUTH_WPA_PSK
#elif CONFIG_EXAMPLE_FAST_SCAN_WEAKEST_AUTHMODE_WPA2
#define DEFAULT_AUTHMODE WIFI_AUTH_WPA2_PSK
#else
#define DEFAULT_AUTHMODE WIFI_AUTH_OPEN
#endif
#else
#define DEFAULT_RSSI -127
#define DEFAULT_AUTHMODE WIFI_AUTH_OPEN
#endif /*CONFIG_EXAMPLE_FAST_SCAN_THRESHOLD*/


const int SCAN_DONE_BIT = BIT0;

static const char *TAG = "scan";

static void event_handler(void* arg, esp_event_base_t event_base,
                                int32_t event_id, void* event_data)
{
	static uint8_t i=0;
	if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
		//if(i++==2)  esp_wifi_connect();
	} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
		printf("wifi disconnected\n****************\n       *        \n   !!!     \n***************\n");
		// esp_wifi_connect();
	} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_SCAN_DONE) {
		printf("scan done!\n****************\n       *        \n***************\n");
		printf("i value is %d\n",i);	
		if(i++==2) esp_wifi_connect();
	} 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;
	ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
	}
}

/* Initialize Wi-Fi as sta and set scan method */
void uart_config(void)
{
	//串口配置结构体
	uart_config_t uart0_config, uart1_config,uart2_config;
 
	//串口参数配置->uart0
	uart0_config.baud_rate = 115200;					//波特率
	uart0_config.data_bits = UART_DATA_8_BITS;			//数据位
	uart0_config.parity = UART_PARITY_DISABLE;			//校验位
	uart0_config.stop_bits = UART_STOP_BITS_1;			//停止位
	uart0_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;	//硬件流控
	uart_param_config(UART_NUM_0, &uart0_config);		//设置串口
	//IO映射-> T:IO1  R:IO3
	// uart_set_pin(UART_NUM_0, TXD0_PIN, RXD0_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
	// 注册串口服务即使能+设置缓存区大小
	uart_driver_install(UART_NUM_0, 1024 * 2, 1024 * 2, 0, NULL, 0);
}


/****************/
static void fast_scan(void)
{
	uint16_t ap_number=0;
	//uint16_t number = 20;			// 默认扫描列表大小
	// wifi_ap_record_t ap_records[20];	// AP信息结构体大小
	uint8_t* get_cmd;
	uint8_t recv_length=0;
	uint8_t i=0;
	uint8_t ssid[32];

	wifi_ap_record_t *ap_records;
	ESP_ERROR_CHECK(esp_netif_init());  // 创建LwIP核心任务并初始化与LwIP相关的工作
	ESP_ERROR_CHECK(esp_event_loop_create_default());

	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, &event_handler, NULL, NULL)); // esp_wifi/include/esp_wifi_types.h
	ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL)); // esp_netif/include/esp_netif_types.h

	// Initialize default station as network interface instance (esp-netif)
	esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();  // 分配内网ip和掩码
	assert(sta_netif);

	// Initialize and start WiFi
	
	ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));  // 设置接入模式为 sta
	ESP_ERROR_CHECK(esp_wifi_start());

	ESP_ERROR_CHECK(esp_wifi_scan_start(NULL,true));  // 如果要扫描到所有的wifi就必须配置为null
	ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_number));
       

	ap_records=(wifi_ap_record_t *)malloc(ap_number*sizeof(wifi_ap_record_t));

	ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_number,ap_records)); 
	for(;i<ap_number;i++)
	{
		printf("ssid=%s  bssid=%s  primary=%d authmode=%d \n",ap_records[i].ssid,ap_records[i].bssid,ap_records[i].primary,ap_records[i].authmode);
	}
	
	get_cmd=(uint8_t*)malloc(20*sizeof(uint8_t));
	printf("which ssid choose\n");
	while(recv_length==0) 
	{
		recv_length = uart_read_bytes(UART_NUM_0, get_cmd,20, 1000 / portTICK_RATE_MS);
	}
	i=get_cmd[0]-48;  // 字符转数字 
	printf("receive value is %d,strlen is %d\n",get_cmd[i],strlen((const char *)get_cmd));
	
	
	printf("choose ssid is %s\n",ap_records[i].ssid);
	
	recv_length = 0;

	wifi_config_t wifi_config = {
		.sta = {
		    // .ssid = ssid,
		    // .password = DEFAULT_PWD,
		    .scan_method = DEFAULT_SCAN_METHOD,
		    .sort_method = DEFAULT_SORT_METHOD,
		    .threshold.rssi = DEFAULT_RSSI,
		    .threshold.authmode = DEFAULT_AUTHMODE, //ap_records[i].authmode,
		},
	};

	memcpy(wifi_config.sta.ssid,ap_records[i].ssid,strlen((const char *)ap_records[i].ssid));

	printf("wifi_config.sta.ssid %s\n",wifi_config.sta.ssid);
	printf("\nprint password\n");

	while(recv_length==0)
	{
		recv_length = uart_read_bytes(UART_NUM_0, get_cmd, 20, 1000 / portTICK_RATE_MS);
	}
	printf("receive string is %s,strlen is %d\n",get_cmd,strlen((const char *)get_cmd));
	memcpy(wifi_config.sta.password,get_cmd,strlen((const char *)get_cmd));


	printf("wifi_config.sta.password %s\n",wifi_config.sta.password);
	
	recv_length = 0;
	
	ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
	ESP_ERROR_CHECK(esp_wifi_start());
	ESP_ERROR_CHECK(esp_wifi_connect());
	printf("free memary\n");
	free(ap_records);
	free(get_cmd);
}

void app_main(void)
{
    // Initialize NVS
	esp_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 );
	uart_config();
	fast_scan();
	
}
上一篇:ESP-8266读写外部Flash


下一篇:C++栈回溯原理