Wi-Fi 连接与配置模式¶
设备有两条途径获取网络密码:通过网页安装器经由数据线(Improv 协议),以及通过 Android 和 iOS 上的 iDryer 手机应用经由空中传输(ESPTouch v2 协议)。此后密码保存在 NVS 中,重启后依然保留。
负责这件事的是 EspTouchProvisioner(platform/arduino/)。产品侧无需调用任何东西,Link 会自行启动并驱动它;回调只用于在屏幕上显示配置进度。
协议版本之间并不兼容:应用必须发送 ESPTouch v2。第一版通过帧长度承载数据,而当路由器在 2.4 GHz 与 5 GHz 之间转发广播时,这些长度就会被破坏——共用同一名称的单个 mesh 网络因此时灵时不灵。
理解这套行为只有一个理由:设备应当在能够自行恢复时保持安静,只有在确实无能为力时才叫人。两个方向都容易出错——要么路由器每次打嗝都去打扰主人,要么带着错误密码默默离线挂着。
四个阶段¶
配置器**只存活到第一次成功连接为止**。在 Wi-Fi 尚未建立期间由 Link::loop() 调用它;第一次 WL_CONNECTED 之后,云端状态机接管,配置模式再也不会启动——直到下一次重启。
阶段 1. 启动,内存中已有密码¶
坚持模式,不做诊断。
每隔 kBootRetryMs(6 秒)发起一次新的连接尝试,持续 kConnectFallbackMs(90 秒)。连上了就开始工作;连不上就启动配置模式。
为什么不做诊断:密码并不新,它曾经是有效的。没有必要去分辨是信号弱还是密码被改了——如果在这段时间内没有连接,就叫主人来,他会当场处理。
为什么需要重试:WiFi.begin() 只在 Link::begin() 中调用一次。云端状态机在 WL_CONNECTED 之前并不运行,而 Arduino 的自动重连并不覆盖 reason 202 和 205。没有重试就只有一次尝试,信号弱时设备会带着完全有效的密码进入配置模式。
为什么是 90 秒——从最坏情况倒推,也就是来电后所有设备同时启动的场景:
- 最多 60 秒——路由器启动。Broadband Forum 的行业要求 TR-124 Issue 9 第
GEN.OPS.9条:「The RG MUST complete power up in 60 seconds or less」。需要说明的是,该要求针对网关的完整启动,其中并没有单独规定 SSID 出现的时限。对量产设备的实测显示,从上电到开始广播需要 34–49 秒,因此 60 秒是合理的上界而非平均值; - 加上我们自身的连接——通常 2–5 秒,但当
RSSI在 −85 dBm 左右时会拉长到二十秒。
于是得到 90 秒:路由器六十秒,我们自己三十秒。更短会有在网络即将出现时把主人叫来的风险;明显更长则会让主人长时间盯着一台既没有连接也没有解释的设备。
同时上电的路由器与接入点是并行启动的,而不是先后启动,因此它们的时间不应相加。若采用更严格的标准——「客户端拿到地址并能访问互联网」——数字会来到 90–120 秒:那里还包含 WAN、DHCP 或 PPPoE 以及调制解调器同步。我们不需要等这些——设备只要进入本地网络就够了。
阶段 2. 启动,内存中没有密码¶
立即启动配置模式——没有什么可等的。
阶段 3. 刚刚收到密码¶
智能模式,driveConnect()。
此时密码是**新的,而且可能是错的**——主人可能打错了。因此配置器会区分失败的原因:
- 统计连续的认证失败次数(
kAuthFailLimit,8 次); - 第五次之后扫描空中信号,记住最好的
RSSI; - 如果
RSSI比kWeakRssi(−80 dBm)更差,则取消返回配置模式:同样的reason15 和 202 在密码正确但 auth 帧丢失时同样会出现,而连接可能需要几分钟。那里适用另一个期限——kWeakSignalGiveUpMs(10 分钟); - 在信号良好且连续失败八次的情况下返回配置模式:否则一个打字错误就只能靠重新刷写才能摆脱。
此外还有针对完全静默的看门狗(kWatchdogMs,20 秒):既没有事件也没有连接时,用 esp_wifi_disconnect() 推一下协议栈。
阶段 4. 运行中连接断开¶
配置器不再被调用。连接由云端状态机静默恢复,配置模式不会启动——不去打扰主人。从设备的角度看,「路由器夜间被关掉」和「路由器被换掉了」无法区分,它也不会去猜。
如何告诉设备网络已经更换¶
重启它。
重启后进入阶段 1:旧密码不匹配,90 秒白白过去,配置模式启动——此时可以用手机发送新密码,或者插上数据线。没有任何启发式判断,就是普通的关机再开机。
一个特性:处于配置模式时不会自行接入网络¶
当设备正在侦听空中信号时,它**不会尝试连接**已保存的网络:射频被接收占用,连接尝试会一直暂停,直到收到新密码。
实际后果:如果路由器启动超过 90 秒而设备已经进入配置模式,那么即使网络之后出现,它也不会自行回到网络。要么发送密码,要么重启设备。
这是该模式的特性而非疏漏:无法一边侦听空中信号一边建立连接。
超时¶
| 常量 | 取值 | 作用 |
|---|---|---|
kBootRetryMs |
6 秒 | 阶段 1 的重试间隔 |
kConnectFallbackMs |
90 秒 | 叫主人之前尝试多久 |
kReconnectDelayMs |
700 毫秒 | 断开后到下次尝试的暂停(阶段 3) |
kWatchdogMs |
20 秒 | 协议栈静默多久后被推一下 |
kAuthFailLimit |
8 | 返回配置模式前的连续认证失败次数 |
kWeakRssi |
−80 dBm | 「信号弱」的界限 |
kWeakSignalGiveUpMs |
10 分钟 | 信号弱时坚持多久才放弃 |
kRestartMs |
10 分钟 | 始终收不到密码时重启配置模式 |
主人看到什么¶
进入配置模式会触发 Notice 回调:
Listening——普通配置:内存中没有网络,或者连接此前已经成功过;CheckPassword——网络已配置,但一次也没让设备进入。剩下的唯一解释就是密码错误。
如何呈现由产品决定。在 idryer-touch 中这是一条全屏通知。