优化配网进度实时更新

This commit is contained in:
fengjignqi
2026-07-03 15:48:47 +08:00
parent 5a72fd98af
commit 01e4f0aefa
4 changed files with 77 additions and 226 deletions

View File

@@ -39,13 +39,17 @@ public class EspProvisionManager {
private static final long CONNECT_COOLDOWN = 1200L;
private static final long QUICK_DISCONNECT_WINDOW = 3000L;
private static final long RETRY_DELAY = 1200L;
private static final long PROGRESS_UPDATE_INTERVAL = 500L;
private static final int MAX_CONNECT_RETRY = 2;
private static final int MAX_AUTO_PROGRESS = 99;
private ESPDevice espDevice;
private ProvisionCallback callback;
private boolean connecting;
private boolean connected;
private boolean provisioning;
private int provisionProgress;
private int provisionTargetProgress;
private boolean eventBusRegistered;
private boolean ignoreNextDisconnectEvent;
private boolean expectDisconnected; // 标记是否预期断开(配网成功后)
@@ -95,6 +99,21 @@ public class EspProvisionManager {
}
};
private final Runnable provisionProgressTask = new Runnable() {
@Override
public void run() {
if (!provisioning) {
return;
}
if (provisionProgress < provisionTargetProgress) {
notifyProvisioning(provisionProgress + 1);
}
if (provisionProgress < MAX_AUTO_PROGRESS) {
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
}
}
};
private EspProvisionManager(Context context) {
this.context = context.getApplicationContext();
this.mainHandler = new Handler(Looper.getMainLooper());
@@ -137,6 +156,10 @@ public class EspProvisionManager {
return provisioning;
}
public int getProvisionProgress() {
return provisionProgress;
}
public void connect(String deviceAddress, String deviceName) {
connect(deviceAddress, deviceName, AppConfig.BLUETOOTH_DEVICE_UUID);
}
@@ -277,9 +300,12 @@ public class EspProvisionManager {
}
provisioning = true;
provisionProgress = 0;
provisionTargetProgress = 29;
mainHandler.removeCallbacks(provisionTimeoutTask);
mainHandler.postDelayed(provisionTimeoutTask, ProvisionConfig.PROVISION_TIMEOUT);
notifyProvisioning(0);
startProvisionProgressTask();
espDevice.provision(ssid, password == null ? "" : password, new ProvisionListener() {
@Override
@@ -289,7 +315,7 @@ public class EspProvisionManager {
@Override
public void wifiConfigSent() {
notifyProvisioning(30);
advanceProvisionProgress(30, 59);
}
@Override
@@ -300,7 +326,7 @@ public class EspProvisionManager {
@Override
public void wifiConfigApplied() {
notifyProvisioning(60);
advanceProvisionProgress(60, MAX_AUTO_PROGRESS);
}
@Override
@@ -456,9 +482,12 @@ public class EspProvisionManager {
private void resetState(boolean clearDevice) {
mainHandler.removeCallbacks(connectionTimeoutTask);
mainHandler.removeCallbacks(provisionTimeoutTask);
stopProvisionProgressTask();
connecting = false;
connected = false;
provisioning = false;
provisionProgress = 0;
provisionTargetProgress = 0;
ignoreNextDisconnectEvent = false;
expectDisconnected = false;
if (clearDevice) {
@@ -478,6 +507,7 @@ public class EspProvisionManager {
private void finishProvisionSuccess() {
mainHandler.removeCallbacks(provisionTimeoutTask);
stopProvisionProgressTask();
provisioning = false;
expectDisconnected = true; // 标记为预期断开
notifyProvisioning(100);
@@ -486,10 +516,27 @@ public class EspProvisionManager {
private void finishProvisionFailed(int errorCode, String message) {
mainHandler.removeCallbacks(provisionTimeoutTask);
stopProvisionProgressTask();
provisioning = false;
notifyFailed(errorCode, message);
}
private void advanceProvisionProgress(int minProgress, int targetProgress) {
int nextProgress = Math.max(provisionProgress, minProgress);
provisionTargetProgress = Math.max(nextProgress, Math.min(targetProgress, MAX_AUTO_PROGRESS));
notifyProvisioning(nextProgress);
startProvisionProgressTask();
}
private void startProvisionProgressTask() {
mainHandler.removeCallbacks(provisionProgressTask);
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
}
private void stopProvisionProgressTask() {
mainHandler.removeCallbacks(provisionProgressTask);
}
private String getProvisionFailureMessage(ESPConstants.ProvisionFailureReason failureReason) {
if (failureReason == ESPConstants.ProvisionFailureReason.AUTH_FAILED) {
return "WiFi 密码错误";
@@ -540,11 +587,13 @@ public class EspProvisionManager {
}
private void notifyProvisioning(final int progress) {
provisionProgress = Math.max(0, Math.min(progress, 100));
runOnMainThread(new Runnable() {
@Override
public void run() {
provisionProgress = Math.max(0, Math.min(progress, 100));
if (callback != null) {
callback.onProvisioning(progress);
callback.onProvisioning(provisionProgress);
}
}
});