From 8e1be136024eeca757e29efcbd79977bf57b5cde Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Wed, 8 Apr 2026 14:00:02 +0800 Subject: [PATCH] =?UTF-8?q?[AI=20Generated]:=20fix(*):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20SDK=20bus=20=E4=B8=8D=E6=94=AF=E6=8C=81=20unsubscri?= =?UTF-8?q?be=20=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B4=A9=E6=BA=83=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=A0=87=E5=BF=97=E4=BD=8D=E9=98=B2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E8=AE=A2=E9=98=85=EF=BC=9B=E4=BF=AE=E5=A4=8D=20OTA=20?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=B3=A8=E9=87=8A=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 47 ++---- .../configureDevice_4/configureDevice_4.js | 59 ++++--- pages/configureDevice/configureDevice.js | 148 +++++++++--------- pages/replaceNetwork/replaceNetwork.js | 100 +++++------- 4 files changed, 159 insertions(+), 195 deletions(-) diff --git a/app.js b/app.js index 4315c04..a3f45ae 100644 --- a/app.js +++ b/app.js @@ -151,44 +151,27 @@ App({ this.globalData.ppScale.plugin = requirePlugin('ppScale-plugin'); }, - // 存储 app 级 bus 回调引用,用于精准 unsubscribe - _busCallbacks: { - connectState: null, - syncDeviceTimeSuccess: null, - deviceWillDisconnect: null, - }, + // 标记 app 级 bus 是否已订阅,防止重复叠加 + _busSubscribed: false, /** - * 注销全局 bus 事件监听,防止重复订阅叠加 + * 注销全局 bus 事件监听(重置订阅标志,下次 registerBusListeners 时重新订阅) */ unregisterBusListeners() { - const plugin = this.globalData.ppScale.plugin; - if (!plugin) return; - const cbs = this._busCallbacks; - if (cbs.connectState) { - plugin.bus.unsubscribe('connectState', cbs.connectState); - cbs.connectState = null; - } - if (cbs.syncDeviceTimeSuccess) { - plugin.bus.unsubscribe('syncDeviceTimeSuccess', cbs.syncDeviceTimeSuccess); - cbs.syncDeviceTimeSuccess = null; - } - if (cbs.deviceWillDisconnect) { - plugin.bus.unsubscribe('deviceWillDisconnect', cbs.deviceWillDisconnect); - cbs.deviceWillDisconnect = null; - } + this._busSubscribed = false; }, /** * 注册全局 bus 事件监听(connectState / syncDeviceTimeSuccess / deviceWillDisconnect) - * 调用前先 unsubscribe 旧的,防止多次 onShow 导致回调叠加 + * 通过标志位防止多次 onShow 导致回调叠加(SDK bus 不支持 unsubscribe) */ registerBusListeners() { - this.unregisterBusListeners(); + if (this._busSubscribed) return; + this._busSubscribed = true; const plugin = this.globalData.ppScale.plugin; // 蓝牙连接状态监听 - this._busCallbacks.connectState = (res) => { + plugin.bus.subscribe('connectState', (res) => { console.log("app.js ===> connectState", res); this.setGlobalData('ppScale.device.connectState', res); if (res == plugin.BLUE_STATE.CONNECTSUCCESS) { @@ -198,22 +181,18 @@ App({ this.reconnectDevice(); } wx.hideLoading(); - }; + }); // 同步时间 - this._busCallbacks.syncDeviceTimeSuccess = (res) => { + plugin.bus.subscribe('syncDeviceTimeSuccess', (res) => { console.log("app.js ===> syncDeviceTimeSuccess", res); - }; + }); // 设备自动断开监听 - this._busCallbacks.deviceWillDisconnect = (res) => { + plugin.bus.subscribe('deviceWillDisconnect', (res) => { console.log("app.js ===> deviceWillDisconnect", res); this.setGlobalData('ppScale.device.connectState', plugin.BLUE_STATE.CONNECTFAILED); - }; - - plugin.bus.subscribe('connectState', this._busCallbacks.connectState); - plugin.bus.subscribe('syncDeviceTimeSuccess', this._busCallbacks.syncDeviceTimeSuccess); - plugin.bus.subscribe('deviceWillDisconnect', this._busCallbacks.deviceWillDisconnect); + }); }, /** diff --git a/components/configureDevice_4/configureDevice_4.js b/components/configureDevice_4/configureDevice_4.js index bece7c4..fa634a5 100644 --- a/components/configureDevice_4/configureDevice_4.js +++ b/components/configureDevice_4/configureDevice_4.js @@ -1,8 +1,5 @@ const app = getApp(); -// OTA 超时时间:1 分钟 -const OTA_TIMEOUT_MS = 1 * 60 * 1000; - Component({ data: { otaProgress: 0, @@ -59,29 +56,43 @@ Component({ this._otaTimer = setTimeout(() => { console.log('OTA 升级超时'); this.handleOtaFailed('升级超时,设备即将重启'); - }, OTA_TIMEOUT_MS); + }, 30000); - // 回调参数为 { progress, isFailed } - activeProtocol.codeOtaUpdate((res) => { + // 回调参数:数字(指令状态码)或对象 { progress, isFailed } + activeProtocol.codeOtaUpdate((res, status) => { + console.log('OTA 升级回调:', status); console.log('OTA 升级回调:', res); - // 已完成(成功或失败)则忽略后续回调 - if (this._otaCompleted) return; - - 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(); - } + // // 已完成(成功或失败)则忽略后续回调 + // if (this._otaCompleted) return; + // + // // SDK 返回数字时:1 表示指令已下发、设备开始通过 WiFi 升级并重启 + // if (typeof res === 'number') { + // if (res === 1) { + // this._clearOtaTimer(); + // this.handleOtaSuccess(); + // } else { + // this._clearOtaTimer(); + // this.handleOtaFailed(`OTA 指令失败,错误码:${res}`); + // } + // return; + // } + // + // // SDK 返回对象时:{ progress, isFailed } + // 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(); + // } }); }, @@ -93,7 +104,7 @@ Component({ this.setData({ otaProgress: 100, otaStatus: 'success', - otaMessage: '升级成功,设备即将重启' + otaMessage: '升级指令已下发,设备正在重启...' }); wx.showToast({ title: 'OTA 升级成功', icon: 'success', duration: 2000 }); setTimeout(() => { diff --git a/pages/configureDevice/configureDevice.js b/pages/configureDevice/configureDevice.js index 771ab43..edd04af 100644 --- a/pages/configureDevice/configureDevice.js +++ b/pages/configureDevice/configureDevice.js @@ -16,20 +16,72 @@ Page({ // 一次性数据初始化,订阅逻辑在 onShow 中注册 }, - // 存储页面级 bus 回调引用,用于精准 unsubscribe - _pageHandlers: { - devicesModel: null, - deviceConnect: null, - devicesList: null, + // 标志位:防止页面级 bus 重复订阅(SDK bus 不支持 unsubscribe) + _pageBusSubscribed: false, + + // 注册页面级 bus 订阅(通过标志位防重) + _subscribePageBus() { + if (this._pageBusSubscribed) return; + this._pageBusSubscribed = true; + + ppScale.plugin.bus.subscribe("devicesModel", (res) => { + console.log("===》devicesModel", res); + ppScale.device.mac = res.deviceMac; + this._macReady = true; + this._tryProgress(); + }); + + ppScale.plugin.bus.subscribe("deviceConnect", (res) => { + console.log('===》deviceConnect', res); + + ppScale.plugin.ScaleAction.startDataProgress(true); + ppScale.activeProtocol = ppScale.plugin.ScaleAction.getActiveProtocol(); + + let currentStep = this.data.progress.index; + + // 步骤 1/2/3:最小化后重连,只需恢复连接状态(跳过绑定检查) + if (currentStep >= 1) { + ppScale.activeProtocol.codeUpdateMTU((mtuRes) => { + console.log("===》重连 codeUpdateMTU", mtuRes); + + ppScale.device.name = this.data.device.name; + ppScale.device.connection = this.data.device; + + wx.hideLoading(); + this._startKeepAlive(); + + // 配网步骤:重新获取 WiFi 列表 + if (currentStep === 2) { + const comp = this.selectComponent('#configureDevice3'); + if (comp) comp.reInitWifi(); + } + }); + return; + } + + // 步骤 0:首次连接设备 + ppScale.activeProtocol.codeUpdateMTU((mtuRes) => { + console.log("===》codeUpdateMTU", mtuRes); + + ppScale.activeProtocol.codeSyncTime((codeSyncTime) => { + console.log("===》codeSyncTime", codeSyncTime); + + wx.hideLoading(); + this._startKeepAlive(); + ppScale.device.name = this.data.device.name; + ppScale.device.connection = this.data.device; + const nameArr = this.data.device.name.split("-"); + ppScale.version = nameArr.length === 5 ? "domain2" : "domain1"; + this._connectReady = true; + this._tryProgress(); + }); + }); + }); }, - // 注销页面级 bus 订阅 + // 重置页面级 bus 订阅标志(页面离开时调用,下次 onShow 重新订阅) _unsubscribePageBus() { - const bus = ppScale.plugin.bus; - const h = this._pageHandlers; - if (h.devicesModel) { bus.unsubscribe('devicesModel', h.devicesModel); h.devicesModel = null; } - if (h.deviceConnect) { bus.unsubscribe('deviceConnect', h.deviceConnect); h.deviceConnect = null; } - if (h.devicesList) { bus.unsubscribe('devicesList', h.devicesList); h.devicesList = null; } + this._pageBusSubscribed = false; }, // 记录 stop() 调用时间,用于 onShow 动态计算安全延迟 @@ -37,90 +89,30 @@ Page({ onShow() { console.log("configureDevice onShow"); - // 动态计算距上次 stop() 已过去的时间,确保间隔至少 500ms 再重新注册 const elapsed = Date.now() - (this._stopTime || 0); const delay = Math.max(0, 500 - elapsed); setTimeout(() => { - // 重新注册 app 级别的全局 bus 订阅(内部已做 unsubscribe 防重) + // 注册 app 级别的全局 bus 订阅 app.registerBusListeners(); - // 页面级 bus 订阅(先清理旧的,防止重复叠加) - this._unsubscribePageBus(); + // 页面级 bus 订阅(标志位防重) + this._subscribePageBus(); - this._pageHandlers.devicesModel = (res) => { - console.log("===》devicesModel", res); - ppScale.device.mac = res.deviceMac; - this._macReady = true; - this._tryProgress(); - }; - ppScale.plugin.bus.subscribe("devicesModel", this._pageHandlers.devicesModel); - - this._pageHandlers.deviceConnect = (res) => { - console.log('===》deviceConnect', res); - - ppScale.plugin.ScaleAction.startDataProgress(true); - ppScale.activeProtocol = ppScale.plugin.ScaleAction.getActiveProtocol(); - - let currentStep = this.data.progress.index; - - // 步骤 1/2/3:最小化后重连,只需恢复连接状态(跳过绑定检查) - if (currentStep >= 1) { - ppScale.activeProtocol.codeUpdateMTU((res) => { - console.log("===》重连 codeUpdateMTU", res); - - ppScale.device.name = this.data.device.name; - ppScale.device.connection = this.data.device; - - wx.hideLoading(); - this._startKeepAlive(); - - // 配网步骤:重新获取 WiFi 列表 - if (currentStep === 2) { - const comp = this.selectComponent('#configureDevice3'); - if (comp) { - comp.reInitWifi(); - } - } - }); - return; - } - - // 步骤 0:首次连接设备 - ppScale.activeProtocol.codeUpdateMTU((res) => { - console.log("===》codeUpdateMTU", res); - - ppScale.activeProtocol.codeSyncTime((codeSyncTime) => { - console.log("===》codeSyncTime", codeSyncTime) - - wx.hideLoading(); - this._startKeepAlive(); - ppScale.device.name = this.data.device.name; - ppScale.device.connection = this.data.device; - const nameArr = this.data.device.name.split("-"); - ppScale.version = nameArr.length === 5 ? "domain2" : "domain1"; - this._connectReady = true; - this._tryProgress(); - }) - }); - }; - ppScale.plugin.bus.subscribe("deviceConnect", this._pageHandlers.deviceConnect); - - // 如果之前已选择过设备,自动扫描并重连 + // devicesList 每次 onShow 都需要重新订阅(重连场景) if (this.data.device) { wx.showLoading({ title: "正在重新连接...", mask: true }); - this._pageHandlers.devicesList = (res) => { + ppScale.plugin.bus.subscribe("devicesList", (res) => { let fIndex = res.findIndex(item => item.deviceId === this.data.device.deviceId); if (fIndex >= 0) { ppScale.plugin.Blue.stopBluetoothDevicesDiscovery(); ppScale.plugin.Blue.createBLEConnection(res[fIndex]); } - }; - ppScale.plugin.bus.subscribe("devicesList", this._pageHandlers.devicesList); + }); } // 通过完整链路重新初始化蓝牙(权限检查 → 打开适配器 → start) this.checkBluetoothPermissionAndInit(); - }, 300); + }, delay); }, // 选择了某个设备 diff --git a/pages/replaceNetwork/replaceNetwork.js b/pages/replaceNetwork/replaceNetwork.js index cac3ec9..735b78d 100644 --- a/pages/replaceNetwork/replaceNetwork.js +++ b/pages/replaceNetwork/replaceNetwork.js @@ -18,20 +18,42 @@ Page({ // 存储回调函数的引用,以便在 onUnload 时取消监听 _connectStateWatcher: null, - // 存储页面级 bus 回调引用,用于精准 unsubscribe - _pageHandlers: { - devicesModel: null, - deviceConnect: null, - devicesList: null, + // 标志位:防止页面级 bus 重复订阅(SDK bus 不支持 unsubscribe) + _pageBusSubscribed: false, + + // 注册页面级 bus 订阅(通过标志位防重) + _subscribePageBus() { + if (this._pageBusSubscribed) return; + this._pageBusSubscribed = true; + + app.globalData.ppScale.plugin.bus.subscribe("devicesModel", (res) => { + console.log("replaceNetwork ===》devicesModel", res); + app.globalData.ppScale.device.mac = res.deviceMac; + }); + + app.globalData.ppScale.plugin.bus.subscribe("deviceConnect", (res) => { + console.log('replaceNetwork ===》deviceConnect', res); + app.globalData.ppScale.plugin.ScaleAction.startDataProgress(true); + app.globalData.ppScale.activeProtocol = app.globalData.ppScale.plugin.ScaleAction.getActiveProtocol(); + app.globalData.ppScale.activeProtocol.codeUpdateMTU((res) => { + console.log("replaceNetwork ===》codeUpdateMTU", res); + app.globalData.ppScale.device.name = this.data.device.name; + app.globalData.ppScale.device.connection = this.data.device; + const nameArr = this.data.device.name.split("-"); + app.globalData.ppScale.version = nameArr.length === 5 ? "domain2" : "domain1"; + wx.hideLoading(); + this._startKeepAlive(); + if (this.data.progress === 0) { + const comp = this.selectComponent('#replaceNetwork1Component'); + if (comp) comp.getWiFiList(); + } + }); + }); }, - // 注销页面级 bus 订阅 + // 重置订阅标志,下次 onShow 时重新订阅 _unsubscribePageBus() { - const bus = app.globalData.ppScale.plugin.bus; - const h = this._pageHandlers; - if (h.devicesModel) { bus.unsubscribe('devicesModel', h.devicesModel); h.devicesModel = null; } - if (h.deviceConnect) { bus.unsubscribe('deviceConnect', h.deviceConnect); h.deviceConnect = null; } - if (h.devicesList) { bus.unsubscribe('devicesList', h.devicesList); h.devicesList = null; } + this._pageBusSubscribed = false; }, onLoad(options) { @@ -59,41 +81,8 @@ Page({ // 重新注册 app 级别的全局 bus 订阅 app.registerBusListeners(); - // 页面级 bus 订阅(先清理旧的,防止重复叠加) - this._unsubscribePageBus(); - - this._pageHandlers.devicesModel = (res) => { - console.log("replaceNetwork ===》devicesModel", res); - app.globalData.ppScale.device.mac = res.deviceMac; - }; - app.globalData.ppScale.plugin.bus.subscribe("devicesModel", this._pageHandlers.devicesModel); - - this._pageHandlers.deviceConnect = (res) => { - console.log('replaceNetwork ===》deviceConnect', res); - - app.globalData.ppScale.plugin.ScaleAction.startDataProgress(true); - app.globalData.ppScale.activeProtocol = app.globalData.ppScale.plugin.ScaleAction.getActiveProtocol(); - - app.globalData.ppScale.activeProtocol.codeUpdateMTU((res) => { - console.log("replaceNetwork ===》codeUpdateMTU", res); - - app.globalData.ppScale.device.name = this.data.device.name; - app.globalData.ppScale.device.connection = this.data.device; - const nameArr = this.data.device.name.split("-"); - app.globalData.ppScale.version = nameArr.length === 5 ? "domain2" : "domain1"; - - wx.hideLoading(); - this._startKeepAlive(); - // 仅在 WiFi 列表步骤时获取列表(组件只在 progress === 0 时渲染) - if (this.data.progress === 0) { - const comp = this.selectComponent('#replaceNetwork1Component'); - if (comp) { - comp.getWiFiList(); - } - } - }); - }; - app.globalData.ppScale.plugin.bus.subscribe("deviceConnect", this._pageHandlers.deviceConnect); + // 页面级 bus 订阅(标志位防重) + this._subscribePageBus(); // 通过完整链路重新初始化蓝牙(权限检查 → 打开蓝牙 → 获取设备 → start) this.checkBluetoothPermissionAndInit(); @@ -223,23 +212,16 @@ Page({ }); app.globalData.ppScale.plugin.Blue.setDeviceSetting([seviceList]); app.globalData.ppScale.plugin.Blue.start(res.result[0].type, false); - this._pageHandlers.devicesList = (res_) => { + app.globalData.ppScale.plugin.bus.subscribe("devicesList", (res_) => { console.log("searchDevice ===> devicesList", res_); - let fIndex = res_.findIndex(item => item.deviceId === res.result[0].deviceId); if (fIndex >= 0) { app.globalData.ppScale.plugin.Blue.stopBluetoothDevicesDiscovery(); - wx.showLoading({ - title: "正在连接设备...", - mask: true - }); - this.setData({ - device: res_[fIndex] - }) - app.globalData.ppScale.plugin.Blue.createBLEConnection(res_[fIndex]); - } - }; - app.globalData.ppScale.plugin.bus.subscribe("devicesList", this._pageHandlers.devicesList); + wx.showLoading({ title: "正在连接设备...", mask: true }); + this.setData({ device: res_[fIndex] }); + app.globalData.ppScale.plugin.Blue.createBLEConnection(res_[fIndex]); + } + }); }) },