mirror of
https://github.com/alexhopeoconnor/WiFiManager.git
synced 2026-10-21 18:22:37 +10:00
64 lines
3.1 KiB
Markdown
64 lines
3.1 KiB
Markdown
# Field installer provisioning
|
|
|
|
A field-installed controller or sensor often needs more time for setup than a desk-bound demo, but should not host an unattended configuration portal forever. Existing consuming device sketches solve this by choosing a deliberate 15-minute configuration window and exposing clear local feedback while setup is active.
|
|
|
|
## Flow
|
|
|
|
1. Boot with the product's normal configuration.
|
|
2. Try the stored primary/fallback profile set.
|
|
3. If Wi-Fi is unavailable, start the local setup AP and portal.
|
|
4. Keep the portal available for the installation window.
|
|
5. On a successful connection, let the application start services or reboot according to its own policy.
|
|
6. On timeout, return to the product's recovery policy rather than assuming the installer finished.
|
|
|
|
~~~cpp
|
|
constexpr unsigned long kInstallerWindowSeconds = 15 * 60;
|
|
MyProfileStore profileStore;
|
|
|
|
void setup() {
|
|
configureProductPortal();
|
|
wifi.setStationProfileStore(&profileStore);
|
|
wifi.setStationRecoveryInterval(30000);
|
|
wifi.setConfigPortalTimeout(kInstallerWindowSeconds);
|
|
|
|
wifi.setAPCallback([](WiFiManager*) {
|
|
setIndicator(IndicatorState::Setup);
|
|
showInstallerInstructions();
|
|
});
|
|
|
|
wifi.setConfigPortalTimeoutCallback([] {
|
|
setIndicator(IndicatorState::Offline);
|
|
recordSetupTimeout();
|
|
});
|
|
|
|
wifi.startStationConnection(deviceSetupName(), deviceSetupPassword());
|
|
}
|
|
|
|
void loop() {
|
|
wifi.process();
|
|
// Do not start or recreate an application server while the portal owns its port.
|
|
}
|
|
~~~
|
|
|
|
The timeout is a product decision. A short interval is appropriate for a user-facing appliance; a longer maintenance window may be justified for a device installed in a cabinet or plant room. Set 0 only when an always-open setup portal is an explicit operational choice.
|
|
|
|
## What to show an installer
|
|
|
|
Keep feedback independent of a browser redirect:
|
|
|
|
- the setup SSID and any required password;
|
|
- the device's portal address and non-default port, if configured;
|
|
- a distinct setup indicator while the portal is active;
|
|
- a distinct failure/offline indication after timeout;
|
|
- confirmation only after Wi-Fi has actually connected.
|
|
|
|
Use getConfigPortalActive(), didConfigPortalConnectSucceed(), and getConfigPortalConnectMessage() for this state. See [Observability](../OBSERVABILITY.md).
|
|
|
|
## Product boundary
|
|
|
|
WiFiManager supplies the local portal and timer. The product decides what happens after timeout: keep retrying profiles, sleep, wait for a physical action, or operate in an offline mode. If startStationConnection() returns false because no usable stored profile exists, the portal may be the intended next state rather than a reason to reboot immediately.
|
|
|
|
For a product that deliberately uses one platform-saved network rather than primary/fallback profiles, the smaller legacy equivalent is wifi.autoConnect(deviceSetupName(), deviceSetupPassword()). It has the same local portal fallback, but no application-owned profile store, candidate verification, or fallback network.
|
|
|
|
Continue with [Provisioning lifecycle](../PROVISIONING_LIFECYCLE.md) or [Provisioning state feedback](PROVISIONING_STATE_FEEDBACK.md).
|