Firmware: WiFi fast-connect cache (skip scan + DHCP on the next wake)
After a successful home-WiFi connection, caches BSSID/channel and IP/netmask/gateway/DNS in NVS. The next wake's first connect attempt uses the cached BSSID/channel (skips the all-channel scan) and applies the cached IP directly once the link comes up (skips DHCP) -- a couple fewer seconds of radio-on time per wake, free every wake since nothing about the network actually needs renegotiating most of the time. Falls back to a normal scan+DHCP attempt, and clears the cache, if: the fast attempt itself fails, or it "succeeds" at the WiFi layer but the full fetch cycle then fails anyway (a stale cached IP/DNS/gateway that associates but can't actually reach the server). Also cleared on (re)provisioning and factory reset, since a new network shouldn't try to reuse the old one's cache. The static-IP path needed care to get right without touching untested territory: esp_netif_set_ip_info() only posts IP_EVENT_STA_GOT_IP (what the existing connect-wait logic blocks on) once the netif is already up, which the internal netif-glue's own WIFI_EVENT_STA_CONNECTED handler guarantees by running first (registered earlier, in esp_netif_create_default_wifi_sta()) -- confirmed against ESP-IDF's own static_ip example and esp_netif_handlers.c source rather than assumed. Falling back after a failed fast attempt also needed an explicit esp_netif_dhcpc_start() first: esp_netif_dhcpc_stop() leaves the netif's DHCP status STOPPED rather than resetting to INIT, and left alone the glue would silently re-post the stale cached IP on the next connect instead of actually running DHCP (esp_netif_action_connected). Version bumped to 1.1.0 (real feature, not just a fix); build-verified clean on both board configs (devkit 8MB, XIAO 4MB), no new warnings.
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
#define FRAME_CFG_SSID_MAX_LEN 32
|
||||
@@ -83,3 +84,38 @@ void ap_identity_get(char *ssid_out, size_t ssid_len, char *pass_out, size_t pas
|
||||
* can provision the device. Does not return.
|
||||
*/
|
||||
void wifi_provisioning_start(void);
|
||||
|
||||
/**
|
||||
* Cached parameters from the most recent successful home-WiFi connection,
|
||||
* letting the next wake's first connect attempt skip the all-channel scan
|
||||
* (known BSSID/channel) and DHCP (known static IP/netmask/gateway/DNS).
|
||||
* Fields are stored exactly as esp-wifi/esp-netif already use them
|
||||
* internally, so they can be fed straight back in with no conversion.
|
||||
*/
|
||||
typedef struct {
|
||||
uint8_t bssid[6];
|
||||
uint8_t channel;
|
||||
uint32_t ip;
|
||||
uint32_t netmask;
|
||||
uint32_t gateway;
|
||||
uint32_t dns; /* 0 = none cached (best-effort; a real DHCP fallback still repopulates this) */
|
||||
} frame_wifi_cache_t;
|
||||
|
||||
/**
|
||||
* Loads the cached fast-connect parameters. Returns false if there's
|
||||
* nothing cached yet, or it was invalidated (see frame_wifi_cache_clear).
|
||||
*/
|
||||
bool frame_wifi_cache_load(frame_wifi_cache_t *out);
|
||||
|
||||
/** Saves fast-connect parameters after a successful home-WiFi connection. */
|
||||
void frame_wifi_cache_save(const frame_wifi_cache_t *cache);
|
||||
|
||||
/**
|
||||
* Clears the fast-connect cache. Called after a cached fast-connect
|
||||
* attempt itself fails (BSSID/channel went stale), after a full fetch
|
||||
* cycle fails despite a successful connection (the cached static IP may
|
||||
* be unreachable even though the link came up), and by
|
||||
* frame_config_save()/frame_config_clear() -- a (re)provisioning event
|
||||
* means whatever was cached may belong to a different network entirely.
|
||||
*/
|
||||
void frame_wifi_cache_clear(void);
|
||||
|
||||
Reference in New Issue
Block a user