@@ -72,22 +72,31 @@ fn connect_wifi_with_config(
72
72
log:: info!( "Retrying..." ) ;
73
73
}
74
74
}
75
-
76
75
log:: info!( "Waiting for DHCP lease..." ) ;
77
76
wifi. wait_netif_up ( ) ?;
78
77
79
78
let ip_info = wifi. wifi ( ) . sta_netif ( ) . get_ip_info ( ) ?;
80
79
log:: info!( "Wifi DHCP info: {:?}" , ip_info) ;
81
-
82
80
if let Some ( account) = bupt_account {
81
+
83
82
for retry in 0 ..10 {
84
83
match bupt:: login ( & account) {
85
84
Ok ( _) => break ,
85
+
86
86
Err ( e) => {
87
- log:: warn!(
87
+ if e. to_string ( ) . contains ( "incorrect password" ) {
88
+ log:: error!( "Failed to login to BUPT-portal: {}, retrying with new password" ,
89
+ e) ;
90
+ bail ! ( "Failed to login to BUPT-portal because of wrong password" ) ;
91
+ //密码错误 重新配网
92
+
93
+ }
94
+ else {
95
+ log:: warn!(
88
96
"Failed to login to BUPT-portal: {}, will retry after 10 seconds..." ,
89
97
e
90
- ) ;
98
+ ) ;
99
+ }
91
100
}
92
101
}
93
102
delay. delay_ms ( 1000 * 10 ) ;
@@ -139,23 +148,51 @@ pub fn generate_random_mac() -> [u8; 6] {
139
148
pub fn connect ( ) -> Result < Box < EspWifi < ' static > > > {
140
149
set_target_level ( "wifi" , log:: LevelFilter :: Warn ) ?;
141
150
set_target_level ( "wifi_init" , log:: LevelFilter :: Warn ) ?;
142
-
143
- #[ cfg( feature = "clean_nvs" ) ]
144
- crate :: nvs:: remove :: < NetConfig > ( ) ?;
145
-
151
+
152
+ let nvs = crate :: nvs:: nvs ( ) ;
146
153
match crate :: nvs:: load :: < NetConfig > ( ) ? {
147
- Some ( config) => {
148
- log:: info!( "Loaded NetConfig: {:?}" , & config) ;
149
- connect_wifi_with_config (
150
- config,
151
- Peripherals :: take ( ) ?. modem ,
152
- EspSystemEventLoop :: take ( ) ?,
153
- )
154
+ Some ( config) => { //有配置
155
+ match bupt:: check ( bupt:: CHECK_URL ) { //判断是否已经登陆过,如果已经登陆进入第一个块
156
+ Ok ( bupt:: BuptNetStatus :: Authenticated ) => {
157
+ let bupt_wifi = EspWifi :: new ( Peripherals :: take ( ) ?. modem , EspSystemEventLoop :: take ( ) ?. clone ( ) , Some ( nvs) ) ?; //bupt—portal wifi配置?
158
+ log:: info!( "BUPT-portal is already authenticated" ) ;
159
+ Ok ( Box :: new ( bupt_wifi) ) //返回bupt-portal实例
160
+ }
161
+
162
+ _ => { //未登录进入第二个块
163
+ log:: info!( "Loaded NetConfig: {:?}" , & config) ;
164
+ let wifi_result = connect_wifi_with_config ( //用已经储存的用户名密码登录,如果密码修改,无法登录,需要重新进行配网
165
+ config,
166
+ Peripherals :: take ( ) ?. modem ,
167
+ EspSystemEventLoop :: take ( ) ?,
168
+ ) ;
169
+ check_error_and_reconnect ( wifi_result)
170
+
171
+ }
172
+ }
154
173
}
155
- None => {
174
+ None => { //没有配置
156
175
let p = provisioning:: Provisioner :: new ( ) ?;
157
176
p. wait ( ) ;
158
177
Ok ( p. wifi )
159
178
}
160
179
}
161
180
}
181
+
182
+ fn check_error_and_reconnect ( result : Result < Box < EspWifi < ' static > > > ) -> Result < Box < EspWifi < ' static > > > {
183
+ match result {
184
+ Ok ( wifi) => Ok ( wifi) ,
185
+ Err ( e) => {
186
+ if e. to_string ( ) . contains ( "Failed to login to BUPT-portal because of wrong password" ) {
187
+ // 密码错误,读取到返回的错误消息中特定报错,当做没有配置,重新进行配网
188
+ log:: info!( "Re-provisioning the network" ) ;
189
+ let new_config = provisioning:: Provisioner :: new ( ) ?;
190
+ new_config. wait ( ) ;
191
+ Ok ( new_config. wifi )
192
+ } else {
193
+ // 其他错误,直接返回原始错误
194
+ Err ( e)
195
+ }
196
+ }
197
+ }
198
+ }
0 commit comments