/** * Start scan WiFi networks available * @param async run in async mode * @param show_hidden show hidden networks * @return Number of discovered networks */ int8_t WiFiScanClass::scanNetworks(bool async, bool show_hidden) { if(WiFiScanClass::_scanStarted) { return WIFI_SCAN_RUNNING; } WiFiScanClass::_scanAsync = async; WiFi.enableSTA(true); scanDelete(); wifi_scan_config_t config; config.ssid = 0; config.bssid = 0; config.channel = 0; config.show_hidden = show_hidden; if(esp_wifi_scan_start(&config, WiFiScanClass::_scanAsync) == ESP_OK) { WiFiScanClass::_scanComplete = false; WiFiScanClass::_scanStarted = true; if(WiFiScanClass::_scanAsync) { return WIFI_SCAN_RUNNING; } while(!(WiFiScanClass::_scanComplete)) { delay(10); } return WiFiScanClass::_scanCount; } else { return WIFI_SCAN_FAILED; } }
static void esp_now_scan_peers_start (void) { DEBUG("%s\n", __func__); wifi_scan_config_t scan_cfg = { .ssid = NULL, .bssid = NULL, .channel = esp_now_params.channel, .show_hidden = true, .scan_type = WIFI_SCAN_TYPE_ACTIVE, .scan_time.active.min = 0, .scan_time.active.max = 120 /* TODO tune value */ }; esp_wifi_scan_start(&scan_cfg, false); } #define ESP_NOW_EVENT_SCAN_PEERS 1 static kernel_pid_t esp_now_event_handler_pid; char esp_now_event_handler_stack [THREAD_STACKSIZE_DEFAULT]; static void *esp_now_event_handler (void *arg) { msg_t event; while (1) { msg_receive(&event); switch (event.content.value) { case ESP_NOW_EVENT_SCAN_PEERS: esp_now_scan_peers_start (); break; } } return NULL; }
static void scan_task(void *pvParameters) { while(1) { xEventGroupWaitBits(wifi_event_group, SCAN_DONE_BIT, false, true, portMAX_DELAY); ESP_LOGI(TAG, "WIFI scan doen"); xEventGroupClearBits(wifi_event_group, SCAN_DONE_BIT); uint16_t apCount = 0; esp_wifi_scan_get_ap_num(&apCount); 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"); // scan again vTaskDelay(2000 / portTICK_PERIOD_MS); //The true parameter cause the function to block until the scan is done. ESP_ERROR_CHECK(esp_wifi_scan_start(&scanConf, true)); } }
int app_main(void) { nvs_flash_init(); tcpip_adapter_init(); initialise_wifi(); xTaskCreate(&scan_task, "scan_task", 2048, NULL, 15, NULL); ESP_ERROR_CHECK(esp_wifi_scan_start(&scanConf, true)); //The true parameter cause the function to block until //the scan is done. return 0; }
/** * Start scan WiFi networks available * @param async run in async mode * @param show_hidden show hidden networks * @return Number of discovered networks */ int8_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, uint32_t max_ms_per_chan) { if(WiFiScanClass::_scanStarted) { return WIFI_SCAN_RUNNING; } WiFiScanClass::_scanAsync = async; WiFi.enableSTA(true); scanDelete(); wifi_scan_config_t config; config.ssid = 0; config.bssid = 0; config.channel = 0; config.show_hidden = show_hidden; if(passive){ config.scan_type = WIFI_SCAN_TYPE_PASSIVE; config.scan_time.passive = max_ms_per_chan; } else { config.scan_type = WIFI_SCAN_TYPE_ACTIVE; config.scan_time.active.min = 100; config.scan_time.active.max = max_ms_per_chan; } if(esp_wifi_scan_start(&config, false) == ESP_OK) { WiFiScanClass::_scanComplete = false; WiFiScanClass::_scanStarted = true; if(WiFiScanClass::_scanAsync) { return WIFI_SCAN_RUNNING; } while(!(WiFiScanClass::_scanComplete)) { delay(10); } return WiFiScanClass::_scanCount; } else { return WIFI_SCAN_FAILED; } }