fix(network): robust AP->STA connect (nmcli argv, device show state, wifi iface for DNS)
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
const EventEmitter = require('events');
|
||||
const log = require('./logger');
|
||||
const { hasInternet, hasSavedWifiConnection, isWifiStaConnected, scanWifi, startAP, stopAP, connectWifi, AP_IP } = require('./network');
|
||||
const { hasInternet, hasSavedWifiConnection, isWifiStaConnected, scanWifi, startAP, stopAP, connectWifi, getWifiIface, AP_IP } = require('./network');
|
||||
const { DnsHijack } = require('./dns-hijack');
|
||||
const { CaptiveServer } = require('./captive-server');
|
||||
const led = require('./led');
|
||||
@@ -131,9 +131,9 @@ class ProvisionManager extends EventEmitter {
|
||||
this._cachedWifiList = scanWifi();
|
||||
log.info('provision', `扫描到 ${this._cachedWifiList.length} 个网络`);
|
||||
|
||||
// 写 DNS 劫持配置(NM 启动热点时加载)
|
||||
// 写 DNS 劫持配置(NM 启动热点时加载);接口名与热点一致,勿写死 wlan0
|
||||
this._dns = new DnsHijack();
|
||||
this._dns.start('wlan0', AP_IP);
|
||||
this._dns.start(getWifiIface(), AP_IP);
|
||||
|
||||
const ap = startAP(this._clawId);
|
||||
|
||||
@@ -149,6 +149,7 @@ class ProvisionManager extends EventEmitter {
|
||||
log.info('provision', `配网地址: http://10.42.0.1`);
|
||||
} catch (e) {
|
||||
log.error('provision', `AP 启动失败: ${e.message}`);
|
||||
if (this._state !== 'sta') this._state = 'idle';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,24 +162,40 @@ class ProvisionManager extends EventEmitter {
|
||||
log.info('provision', `用户请求连接 WiFi: ${ssid}`);
|
||||
led.blink(); // 正在连接 → 闪烁
|
||||
|
||||
this._stopAPServices();
|
||||
try {
|
||||
this._stopAPServices();
|
||||
|
||||
// 关热点后射频/模式切换需要时间,立刻 connect 在部分板子上会失败
|
||||
await new Promise((r) => setTimeout(r, 2500));
|
||||
// 关热点后射频/模式切换需要时间,立刻 connect 在部分板子上会失败
|
||||
await new Promise((r) => setTimeout(r, 3500));
|
||||
|
||||
const result = connectWifi(ssid, password);
|
||||
const result = connectWifi(ssid, password);
|
||||
|
||||
if (result.success) {
|
||||
this._state = 'sta';
|
||||
log.info('provision', `WiFi 已连接: ${ssid}`);
|
||||
led.on(); // WiFi 灯:连接成功 → 常亮
|
||||
this.emit('network-ready');
|
||||
if (result.success) {
|
||||
this._state = 'sta';
|
||||
log.info('provision', `WiFi 已连接: ${ssid}`);
|
||||
led.on(); // WiFi 灯:连接成功 → 常亮
|
||||
this.emit('network-ready');
|
||||
return result;
|
||||
}
|
||||
|
||||
log.warn('provision', `WiFi 连接失败: ${result.error},重新启动 AP`);
|
||||
this._safeReenterAP();
|
||||
return result;
|
||||
} catch (e) {
|
||||
log.error('provision', `配网过程异常: ${e.message}`);
|
||||
this._safeReenterAP();
|
||||
return { success: false, error: e.message };
|
||||
}
|
||||
}
|
||||
|
||||
log.warn('provision', `WiFi 连接失败: ${result.error},重新启动 AP`);
|
||||
this._enterAP();
|
||||
return result;
|
||||
/** 重新开 AP;失败时勿把 _state 永久卡在 connecting */
|
||||
_safeReenterAP() {
|
||||
try {
|
||||
this._enterAP();
|
||||
} catch (e) {
|
||||
log.error('provision', `重新启动 AP 失败: ${e.message}`);
|
||||
this._state = 'idle';
|
||||
}
|
||||
}
|
||||
|
||||
// ── WiFi 状态监控 ─────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user