wifi connect without requiring reboot

This commit is contained in:
Robert McMahon 2025-12-22 11:55:20 -08:00
parent 099c28f9c7
commit b4b40de64d
1 changed files with 42 additions and 2 deletions

View File

@ -298,7 +298,10 @@ static struct {
struct arg_end *end; struct arg_end *end;
} connect_args; } connect_args;
// ... [Keep existing includes and declarations] ...
static int wifi_do_connect(int argc, char **argv) { static int wifi_do_connect(int argc, char **argv) {
// Initialize argtable members
connect_args.ssid = arg_str1(NULL, NULL, "<ssid>", "SSID"); connect_args.ssid = arg_str1(NULL, NULL, "<ssid>", "SSID");
connect_args.password = arg_str0(NULL, NULL, "<pass>", "Password"); connect_args.password = arg_str0(NULL, NULL, "<pass>", "Password");
connect_args.bssid = arg_str0("b", "bssid", "<xx:xx...>", "Lock BSSID"); connect_args.bssid = arg_str0("b", "bssid", "<xx:xx...>", "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 *pass = (connect_args.password->count > 0) ? connect_args.password->sval[0] : "";
const char *bssid = (connect_args.bssid->count > 0) ? connect_args.bssid->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"); 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_credentials(ssid, pass, bssid);
wifi_cfg_set_dhcp(true); wifi_cfg_set_dhcp(true);
printf("Credentials saved. Rebooting to apply...\n"); // 3. Apply to Runtime Driver (Hot Reload)
esp_restart(); 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; return 0;
} }