ESP8266学习一---通过ESP8266扫描周边AP信息

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yqj2011/article/details/89844664

    最近刚刚开始ESP-IDF架构的学习,为了了解其架构,我首先选择尝试编写一个扫描AP信息的功能程序。

   一、 由于我接下来准备测试tcp client功能,因此我选择的是tcp client测试用例 作为基本环境。位置为/esp/ESP8266_RTOS_SDK/examples/protocols/sockets/tcp_client,  将这个文件拷贝到~/esp/下面。

  二、先看看这个源码内容,大致如下:

   1. 启动入口函数app_main

   2. app_main里面有nvs_flash_init初始化flash相关, 然后就是initialise_wifi()初始化wifi相关功能,wait_for_ip等待wifi连接,如果连接上AP则进入接下来的工作,创建任务线程tcp_client_task。

   3. 从2中看出我们现在只需要扫描AP信息,与tcp没有什么 关系,因此wait_for_ip和tcp_client_task线程就没必要了,可以先屏蔽掉它。接下来我们看看initialise_wifi做了什么。

   

  这个初始化函数,首先用 xEventGroupCreate创建了一个事件组来监听一系列的事件,事件的处理函数为event_handler。然后就是初始化wifi基本信息esp_wifi_init,通过esp_wifi_set_mode设置wifi 模式(一共有:AP 、STA、AP+STA模式可选),esp_wifi_set_config来配置需要连接的wifi热点,esp_wifi_start来启动wifi。

    4. 创建一个scan扫描结束的事件。i.自定义一个事件位const SCAN_DONE_BIT = BIT2,因为TCP占用了0和1. II. 在事件处理函数event_handler中添加SCAN_DONE_BIT事件处理。

   5. 创建wifi热点扫描任务线程,wifi_scan_task,全局定义扫描配置

wifi_scan_config_t wifi_scan_config = {
        .ssid = NULL,//NULL表示不指定ssid
         .bssid = NULL,//NULL表示不指定
        .channel = 0,//0表示全部通道
        .show_hidden = 1,//扫描显示热点
    };

static void wifi_scan_task(void *pvParameters)
{
	while(1)
	{
		xEventGroupWaitBits(wifi_event_group, SCAN_DONE_BIT, 0, 1, portMAX_DELAY); //线程在此等待wifi热点扫描结束	
		ESP_LOGI(TAG, "WIFI scan done");
		xEventGroupClearBits(wifi_event_group, SCAN_DONE_BIT);


		uint16_t apCount = 0;
		esp_wifi_scan_get_ap_num(&apCount);//获取扫描到的AP总数
		printf("Number of access points found: %d\n", apCount);
		if(apCount == 0)
		{
			ESP_LOGI(TAG, "NOthing AP found");	
			return;
		}

		wifi_ap_record_t *list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * apCount);
		ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&apCount, list));

		int i;

		printf("========================================\n");
		printf("      SSID    |   RSSI    |   AUTH      \n");
		printf("========================================\n");
		for(i = 0; i < apCount; i++)
		{
			char *authmode;	
			switch(list[i].authmode)
			{
				case WIFI_AUTH_OPEN:
					authmode = "WIFI_AUTH_OPEN";
				break;
				case WIFI_AUTH_WEP:
					authmode = "WIFI_AUTH_WEP";
				break;
				case WIFI_AUTH_WPA_PSK:
					authmode = "WIFI_AUTH_WPA_PSK";
				break;
				case WIFI_AUTH_WPA2_PSK:
					authmode = "WIFI_AUTH_WPA2_PSK";
				break;
				case WIFI_AUTH_WPA_WPA2_PSK:
					authmode = "WIFI_AUTH_WPA_WPA2_PSK";
				break;
				default:
					authmode = "Unknown";
				break;
			}
			printf("%26.26s   |  % 4d   | %22.22s\n", list[i].ssid, list[i].rssi, authmode);

		}
		free(list);
		printf("\n\n");

		vTaskDelay(2000 / portTICK_PERIOD_MS);
		ESP_ERROR_CHECK(esp_wifi_scan_start(&wifi_scan_config, 1));重新开始扫描
	}
}

  6. 最后不要忘了在app_main中的最后调用ESP_ERROR_CHECK(esp_wifi_scan_start(&wifi_scan_config, 1))来启动wifi扫描任务启动的条件。

  7.编译和调试 make -j4 flash monitor

 

如果顺利的话烧录之后板子打印如下信息:

 

 

 

展开阅读全文

没有更多推荐了,返回首页