From 00d2a49ca90884814580c6e12b104470e9abed69 Mon Sep 17 00:00:00 2001 From: drath Date: Fri, 19 Jun 2026 00:44:14 +0200 Subject: [PATCH] fixed hidden networks? --- README.md | 6 ++-- network.c | 88 ++++++++++++++++++++++++++++++++++++++++--------------- network.h | 3 +- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index d2f297a..0cdd3f0 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Generic network component for esp-idf v6.0, because copying it over and over was a pain -## TODO -- still doesnt work with hidden ssids, need2fix ### How use @@ -23,8 +21,8 @@ and then in C static const wifi_networks_t known_networks = { .nets = { - {"DAA+", "password"}, - {"DAA", "password"}, + {"DAA+", "password", true}, + {"DAA", "password", false}, }, .num_nets = 2 }; diff --git a/network.c b/network.c index 1859a21..b497a4d 100644 --- a/network.c +++ b/network.c @@ -14,16 +14,20 @@ ESP_EVENT_DEFINE_BASE(SNTP_EVENT); static const char *TAG = "network"; +static const struct wifi_networks_t *wifi_nets; +static int hidden_net_n = -1; + void time_sync_notification_cb(struct timeval *tv) { // NOLINT, it cant ESP_LOGI(TAG, "time synced, unix time is %llu", tv->tv_sec); esp_event_post(SNTP_EVENT, SNTP_EVENT_SYNCED, nullptr, 0, portMAX_DELAY); } - // logs IP, starts sntp static void on_get_ip(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { const ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ESP_LOGI(TAG, "ip getto: " IPSTR, IP2STR(&event->ip_info.ip)); + hidden_net_n = -1; // we're connected, nothing left to be attempting + sntp_set_time_sync_notification_cb(time_sync_notification_cb); sntp_set_sync_interval(SNTP_TIME_SYNC_INTERVAL_MINUTES * 60 * 1000); esp_sntp_setservername(0, SNTP_SERVER); @@ -32,16 +36,55 @@ static void on_get_ip(void *arg, esp_event_base_t event_base, int32_t event_id, esp_sntp_init(); } -// we sometimes call this by hand to init scanning -static void on_wifi_disconnect(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { - ESP_LOGI(TAG, "Wi-Fi disconnected, scanning for networks..."); +static void start_scan(void) { const wifi_scan_config_t scan_cfg = {.show_hidden = true}; esp_wifi_scan_start(&scan_cfg, false); } -// when scanning done, match against known networks and try to connect to it -static void on_scan_done(void *nets, esp_event_base_t event_base, int32_t event_id, void *event_data) { - const struct wifi_networks_t *known_networks = (struct wifi_networks_t *)nets; +// connect to a network 'n' from the list we gave it +static void connect_to_net(int n) { + const struct wifi_network_t *net = &wifi_nets->nets[n]; + + wifi_config_t wifi_cfg = {}; + strncpy((char *)wifi_cfg.sta.ssid, net->ssid, sizeof(wifi_cfg.sta.ssid) - 1); + strncpy((char *)wifi_cfg.sta.password, net->password, sizeof(wifi_cfg.sta.password) - 1); + wifi_cfg.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; + wifi_cfg.sta.scan_method = WIFI_ALL_CHANNEL_SCAN; // check every channel, don't settle for the first probe reply + + ESP_LOGI(TAG, "connecting to %s%s", net->ssid, net->hidden ? " (hidden)" : ""); + esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg); + esp_wifi_connect(); +} + +static void try_next_hidden_network(void) { + for (int i = hidden_net_n + 1; i < wifi_nets->num_nets; i++) { + // we only try hidden networks here, skip otherwise + if (!wifi_nets->nets[i].hidden) + continue; + + // if network from the list is hidden, try to connect to it + hidden_net_n = i; + connect_to_net(i); + return; + } + + ESP_LOGW(TAG, "no hidden networks left to try, rescanning"); + hidden_net_n = -1; + start_scan(); +} + +static void on_wifi_disconnect(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { + if (hidden_net_n >= 0) { + ESP_LOGI(TAG, "connecting to %s failed, trying next hidden network", wifi_nets->nets[hidden_net_n].ssid); + try_next_hidden_network(); + return; + } + + ESP_LOGI(TAG, "Wi-Fi disconnected, scanning for networks..."); + start_scan(); +} + +static void on_scan_done(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { uint16_t ap_count = 0; esp_wifi_scan_get_ap_num(&ap_count); @@ -52,11 +95,11 @@ static void on_scan_done(void *nets, esp_event_base_t event_base, int32_t event_ int best_rssi = INT_MIN; for (int i = 0; i < ap_count; i++) { - for (int k = 0; k < known_networks->num_nets; k++) { + for (int k = 0; k < wifi_nets->num_nets; k++) { if (strcmp((char *)ap_list[i].ssid, - known_networks->nets[k].ssid) == 0) { + wifi_nets->nets[k].ssid) == 0) { if (ap_list[i].rssi > best_rssi) { - best_rssi = (uint8_t)ap_list[i].rssi; + best_rssi = ap_list[i].rssi; best_match = k; } } @@ -64,19 +107,15 @@ static void on_scan_done(void *nets, esp_event_base_t event_base, int32_t event_ } free(ap_list); - if (best_match < 0) { - ESP_LOGW(TAG, "no known networks found"); - on_wifi_disconnect(nullptr, WIFI_EVENT, WIFI_EVENT_SCAN_DONE, nullptr); + hidden_net_n = -1; + + if (best_match >= 0) { + connect_to_net(best_match); return; } - wifi_config_t wifi_cfg = {}; - strncpy((char *)wifi_cfg.sta.ssid, known_networks->nets[best_match].ssid, sizeof(known_networks->nets[0].ssid) - 1); - strncpy((char *)wifi_cfg.sta.password, known_networks->nets[best_match].password, sizeof(known_networks->nets[0].password) - 1); - wifi_cfg.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; - - esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg); - esp_wifi_connect(); + ESP_LOGI(TAG, "no visible known networks found, trying hidden ones"); + try_next_hidden_network(); } void init_ethernet(const char *hostname) { @@ -107,8 +146,9 @@ void init_wifi(const struct wifi_networks_t *nets, const char *hostname) { esp_netif_t *netif = esp_netif_create_default_wifi_sta(); esp_netif_set_hostname(netif, hostname); - // create and register event handlers - esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_SCAN_DONE, on_scan_done, (void *)nets); + wifi_nets = nets; + + esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_SCAN_DONE, &on_scan_done, nullptr); esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &on_wifi_disconnect, nullptr); esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &on_get_ip, nullptr); @@ -116,5 +156,5 @@ void init_wifi(const struct wifi_networks_t *nets, const char *hostname) { esp_wifi_init(&cfg); esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_start(); - on_wifi_disconnect(nullptr, WIFI_EVENT, WIFI_EVENT_SCAN_DONE, nullptr); -} + start_scan(); +} \ No newline at end of file diff --git a/network.h b/network.h index 1c3ea5c..ec5108b 100644 --- a/network.h +++ b/network.h @@ -17,6 +17,7 @@ enum sntp_event_t { struct wifi_network_t { const char ssid[32]; const char password[32]; + bool hidden; }; struct wifi_networks_t { @@ -27,4 +28,4 @@ struct wifi_networks_t { void init_wifi(const struct wifi_networks_t *nets, const char *hostname); void init_ethernet(const char *hostname); -#endif +#endif \ No newline at end of file