diff --git a/components/wifi-manager/wifi_manager.c b/components/wifi-manager/wifi_manager.c index 11e22c8d..634bbdd6 100644 --- a/components/wifi-manager/wifi_manager.c +++ b/components/wifi-manager/wifi_manager.c @@ -79,10 +79,10 @@ Contains the freeRTOS task and all necessary support #define FREE_AND_NULL(p) if(p!=NULL){ free(p); p=NULL;} /* objects used to manipulate the main queue of events */ QueueHandle_t wifi_manager_queue; - SemaphoreHandle_t wifi_manager_json_mutex = NULL; SemaphoreHandle_t wifi_manager_sta_ip_mutex = NULL; char *wifi_manager_sta_ip = NULL; +bool bHasConnected=false; uint16_t ap_num = MAX_AP_NUM; wifi_ap_record_t *accessp_records=NULL; cJSON * accessp_cjson=NULL; @@ -154,6 +154,43 @@ const int WIFI_MANAGER_SCAN_BIT = BIT7; /* @brief When set, means user requested for a disconnect */ const int WIFI_MANAGER_REQUEST_DISCONNECT_BIT = BIT8; +char * get_disconnect_code_desc(uint8_t reason){ + switch (reason) { + case 1 : return "UNSPECIFIED"; break; + case 2 : return "AUTH_EXPIRE"; break; + case 3 : return "AUTH_LEAVE"; break; + case 4 : return "ASSOC_EXPIRE"; break; + case 5 : return "ASSOC_TOOMANY"; break; + case 6 : return "NOT_AUTHED"; break; + case 7 : return "NOT_ASSOCED"; break; + case 8 : return "ASSOC_LEAVE"; break; + case 9 : return "ASSOC_NOT_AUTHED"; break; + case 10 : return "DISASSOC_PWRCAP_BAD"; break; + case 11 : return "DISASSOC_SUPCHAN_BAD"; break; + case 12 : return ""; break; + case 13 : return "IE_INVALID"; break; + case 14 : return "MIC_FAILURE"; break; + case 15 : return "4WAY_HANDSHAKE_TIMEOUT"; break; + case 16 : return "GROUP_KEY_UPDATE_TIMEOUT"; break; + case 17 : return "IE_IN_4WAY_DIFFERS"; break; + case 18 : return "GROUP_CIPHER_INVALID"; break; + case 19 : return "PAIRWISE_CIPHER_INVALID"; break; + case 20 : return "AKMP_INVALID"; break; + case 21 : return "UNSUPP_RSN_IE_VERSION"; break; + case 22 : return "INVALID_RSN_IE_CAP"; break; + case 23 : return "802_1X_AUTH_FAILED"; break; + case 24 : return "CIPHER_SUITE_REJECTED"; break; + case 200 : return "BEACON_TIMEOUT"; break; + case 201 : return "NO_AP_FOUND"; break; + case 202 : return "AUTH_FAIL"; break; + case 203 : return "ASSOC_FAIL"; break; + case 204 : return "HANDSHAKE_TIMEOUT"; break; + default: return "UNKNOWN"; break; + } + return ""; +} + + bool isGroupBitSet(uint8_t bit){ EventBits_t uxBits= xEventGroupGetBits(wifi_manager_event_group); return (uxBits & bit); @@ -174,7 +211,7 @@ void wifi_manager_disconnect_async(){ void wifi_manager_init_wifi(){ /* event handler and event group for the wifi driver */ wifi_manager_event_group = xEventGroupCreate(); - + bHasConnected=false; // Now Initialize the Wifi Stack tcpip_adapter_init(); wifi_manager_event_group = xEventGroupCreate(); @@ -679,7 +716,7 @@ static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_ // reason of disconnection wifi_event_sta_disconnected_t * s =(wifi_event_sta_disconnected_t*)event_data; char * bssid = get_mac_string(s->bssid); - ESP_LOGI(TAG, "WIFI_EVENT_STA_DISCONNECTED. From BSSID: %s, reason code: %d", STR_OR_BLANK(bssid),s->reason); + ESP_LOGI(TAG, "WIFI_EVENT_STA_DISCONNECTED. From BSSID: %s, reason code: %d (%s)", STR_OR_BLANK(bssid),s->reason, get_disconnect_code_desc(s->reason)); FREE_AND_NULL(bssid); if(last_connected>0) total_connected_time+=((esp_timer_get_time()-last_connected)/(1000*1000)); last_connected = 0; @@ -918,7 +955,6 @@ void wifi_manager_register_handlers(){ ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_STOP, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_CONNECTED, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &event_handler, NULL)); -// ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_LOST_IP, &event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, &event_handler, NULL)); @@ -1190,7 +1226,7 @@ void wifi_manager( void * pvParameters ){ else{ memcpy(&disc_event,(wifi_event_sta_disconnected_t*)msg.param,sizeof(disc_event)); free(msg.param); - ESP_LOGI(TAG, "MESSAGE: EVENT_STA_DISCONNECTED with Reason code: %d", disc_event.reason); + ESP_LOGI(TAG, "MESSAGE: EVENT_STA_DISCONNECTED with Reason code: %d (%s)", disc_event.reason, get_disconnect_code_desc(disc_event.reason)); } /* this even can be posted in numerous different conditions @@ -1291,7 +1327,7 @@ void wifi_manager( void * pvParameters ){ if(retries < WIFI_MANAGER_MAX_RETRY){ ESP_LOGD(TAG, "Issuing ORDER_CONNECT_STA to retry connection."); - retries++; + if(!bHasConnected) retries++; wifi_manager_send_message(ORDER_CONNECT_STA, (void*)CONNECTION_REQUEST_AUTO_RECONNECT); } else{ @@ -1366,6 +1402,7 @@ void wifi_manager( void * pvParameters ){ /* bring down DNS hijack */ ESP_LOGD(TAG,"Stopping dns server."); dns_server_stop(); + bHasConnected=true; /* callback */ if(cb_ptr_arr[msg.code]) (*cb_ptr_arr[msg.code])(NULL);