diff --git a/components/app_console/cmd_wifi.c b/components/app_console/cmd_wifi.c index 2badf91..b35a7b2 100644 --- a/components/app_console/cmd_wifi.c +++ b/components/app_console/cmd_wifi.c @@ -298,7 +298,10 @@ static struct { struct arg_end *end; } connect_args; +// ... [Keep existing includes and declarations] ... + static int wifi_do_connect(int argc, char **argv) { + // Initialize argtable members connect_args.ssid = arg_str1(NULL, NULL, "", "SSID"); connect_args.password = arg_str0(NULL, NULL, "", "Password"); connect_args.bssid = arg_str0("b", "bssid", "", "Lock BSSID"); @@ -320,13 +323,50 @@ static int wifi_do_connect(int argc, char **argv) { const char *pass = (connect_args.password->count > 0) ? connect_args.password->sval[0] : ""; const char *bssid = (connect_args.bssid->count > 0) ? connect_args.bssid->sval[0] : ""; + // 1. Ensure we are in Station Mode + wifi_ctl_mode_t current_mode = wifi_ctl_get_mode(); + if (current_mode != WIFI_CTL_MODE_STA) { + printf("Switching to Station Mode first...\n"); + wifi_ctl_switch_to_sta(WIFI_BW_HT20); + } + printf("Connecting to '%s' (BSSID: %s)...\n", ssid, bssid[0] ? bssid : "Any"); + // 2. Save to NVS (Persistent) wifi_cfg_set_credentials(ssid, pass, bssid); wifi_cfg_set_dhcp(true); - printf("Credentials saved. Rebooting to apply...\n"); - esp_restart(); + // 3. Apply to Runtime Driver (Hot Reload) + wifi_config_t wifi_config = {0}; + strlcpy((char *)wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid)); + strlcpy((char *)wifi_config.sta.password, pass, sizeof(wifi_config.sta.password)); + + // Default security settings + wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; + wifi_config.sta.pmf_cfg.capable = true; + wifi_config.sta.pmf_cfg.required = false; + + // Handle BSSID Locking + if (bssid[0]) { + unsigned int mac[6]; + if (sscanf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", + &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { + for(int i=0; i<6; i++) wifi_config.sta.bssid[i] = (uint8_t)mac[i]; + wifi_config.sta.bssid_set = true; + } else { + printf("Warning: Invalid BSSID format ignored.\n"); + } + } + + // Force Disconnect -> Set Config -> Reconnect + esp_wifi_disconnect(); + esp_err_t err = esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + if (err == ESP_OK) { + esp_wifi_connect(); + printf("Connection initiated (Check 'wifi status').\n"); + } else { + printf("Failed to apply configuration: %s\n", esp_err_to_name(err)); + } return 0; }