const app = getApp(); // OTA 超时时间:1 分钟 const OTA_TIMEOUT_MS = 1 * 60 * 1000; Component({ data: { otaProgress: 0, otaStatus: '', // 'upgrading' | 'success' | 'failed' | '' otaMessage: '' }, lifetimes: { attached() { // OTA 升级由父页面在 activeProtocol 就绪后显式调用,此处不自动触发 }, detached() { // 组件销毁时清除超时定时器,防止泄漏 this._clearOtaTimer(); } }, methods: { // 完成按钮回调(成功或失败后展示) bindOk() { this.triggerEvent('deviceEvent', { status: true }); }, // 清除 OTA 超时定时器 _clearOtaTimer() { if (this._otaTimer) { clearTimeout(this._otaTimer); this._otaTimer = null; } }, // 开始 OTA 升级 startOtaUpgrade() { const activeProtocol = app.globalData.ppScale.activeProtocol; if (!activeProtocol) { wx.showToast({ title: '设备未连接,请重新连接', icon: 'none' }); return; } wx.showLoading({ title: '正在升级...', mask: true }); this.setData({ otaProgress: 0, otaStatus: 'upgrading', otaMessage: '升级初始化中...' }); // 启动超时保护,3 分钟内未完成则视为失败 this._clearOtaTimer(); this._otaTimer = setTimeout(() => { console.log('OTA 升级超时'); this.handleOtaFailed('升级超时,设备即将重启'); }, OTA_TIMEOUT_MS); // 回调参数为 { progress, isFailed } activeProtocol.codeOtaUpdate((res) => { console.log('OTA 升级回调:', res); if (res && res.progress !== undefined) { this.setData({ otaProgress: res.progress, otaMessage: `升级进度: ${res.progress}%` }); } if (res && res.isFailed === false) { this._clearOtaTimer(); this.handleOtaSuccess(); } else if (res && res.isFailed === true) { this._clearOtaTimer(); this.handleOtaFailed(); } }); }, // OTA 升级成功处理 handleOtaSuccess() { wx.hideLoading(); this.setData({ otaProgress: 100, otaStatus: 'success', otaMessage: '升级成功,设备即将重启' }); wx.showToast({ title: 'OTA 升级成功', icon: 'success', duration: 2000 }); setTimeout(() => { this.bindOk(); }, 2000); }, // OTA 升级失败处理 handleOtaFailed(msg) { wx.hideLoading(); const message = msg || '升级失败,设备即将重启'; this.setData({ otaProgress: 0, otaStatus: 'failed', otaMessage: message }); wx.showToast({ title: message, icon: 'none', duration: 2000 }); setTimeout(() => { this.bindOk(); }, 2000); } } });