From 439f56021826f913e3c7c9aae24ff08e43d5d4d0 Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Tue, 21 Jul 2026 09:43:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(lefu):=20=E5=AE=8C=E5=96=84=E8=93=9D?= =?UTF-8?q?=E7=89=99=E8=BF=9E=E6=8E=A5=E7=8A=B6=E6=80=81=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=96=AD=E5=BC=80=E5=90=8E=20UI=20?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - connectState 回调增加 UNAVAILABLE 清理和 READY 自动重连 - disconnect() 增加 _intentionalConnect 标记避免误重连 - deviceWillDisconnect 增加 _activeProtocol 防重入判断 - connectedDevice/equipment/connectedWifi 增加断开状态响应 - connectedWifi 设备断开后自动退出配网页 Co-Authored-By: Claude Sonnet 4.6 --- miniprogram/app.json | 2 +- miniprogram/lefu/service.ts | 30 +++++++++++++++++-- miniprogram/pages/addMember/addMember.ts | 4 +-- .../pages/connectedDevice/connectedDevice.ts | 9 ++++++ .../pages/connectedWifi/connectedWifi.ts | 13 ++++---- miniprogram/pages/equipment/equipment.ts | 10 +++++++ miniprogram/utils/request/index.ts | 4 +-- 7 files changed, 60 insertions(+), 12 deletions(-) diff --git a/miniprogram/app.json b/miniprogram/app.json index 2933028..daa4897 100644 --- a/miniprogram/app.json +++ b/miniprogram/app.json @@ -32,7 +32,7 @@ "lazyCodeLoading": "requiredComponents", "plugins": { "ppScale-plugin": { - "version": "0.0.25", + "version": "0.0.29", "provider": "wx0826af4e4908f524" } }, diff --git a/miniprogram/lefu/service.ts b/miniprogram/lefu/service.ts index 61dd54e..f7f6532 100644 --- a/miniprogram/lefu/service.ts +++ b/miniprogram/lefu/service.ts @@ -168,6 +168,7 @@ class LeFuService { this._onConnectStateCb?.(res) if (res === plugin.BLUE_STATE.CONNECTSUCCESS) { this._startKeepAlive() + return } if (res === plugin.BLUE_STATE.CONNECTFAILED) { this._stopKeepAlive() @@ -176,6 +177,28 @@ class LeFuService { } else { this._doReconnect() } + return + } + // 蓝牙不可用:做完整清理 + if (res === plugin.BLUE_STATE.UNAVAILABLE) { + this._stopKeepAlive() + this._stopReconnectTimer() + if (this._activeProtocol) { + this._activeProtocol = null + this._onDisconnectedCb?.() + } + return + } + // 蓝牙就绪:如有缓存设备且非主动断开,尝试连接 + if (res === plugin.BLUE_STATE.READY) { + if (this._intentionalConnect) { + this._intentionalConnect = false + } else if (this._lastRawDevice && !this._activeProtocol) { + this._stopReconnectTimer() + wx.openBluetoothAdapter({ + success: () => this.connect(this._lastRawDevice!), + }) + } } }) @@ -189,9 +212,11 @@ class LeFuService { plugin.bus.subscribe('deviceWillDisconnect', () => { console.warn(TAG, 'bus[deviceWillDisconnect],intentionalConnect:', this._intentionalConnect) - this._activeProtocol = null this._stopKeepAlive() - this._onDisconnectedCb?.() + if (this._activeProtocol) { + this._activeProtocol = null + this._onDisconnectedCb?.() + } if (!this._intentionalConnect) { this._doReconnect() } @@ -221,6 +246,7 @@ class LeFuService { disconnect(): void { console.log(TAG, 'disconnect()') + this._intentionalConnect = true this._stopKeepAlive() plugin.Blue.disconnect() } diff --git a/miniprogram/pages/addMember/addMember.ts b/miniprogram/pages/addMember/addMember.ts index ad52899..8e314c1 100644 --- a/miniprogram/pages/addMember/addMember.ts +++ b/miniprogram/pages/addMember/addMember.ts @@ -326,7 +326,7 @@ Page({ get('weighingScale/v3/getUserInfoByIdcard', { sn: lefuService.deviceInfo?.serialNumber ?? '', - idCard, + idCard: idCard || null, realname: name }, { loading: true }) .then(res => { @@ -491,7 +491,7 @@ Page({ sn: lefuService.deviceInfo?.serialNumber ?? '', scaleDeviceId: lefuService.deviceInfo?.serialNumber ?? '', realname: name.trim(), - idCard, + idCard: idCard || null, sex: finalSex, birthday, height: heightNum, diff --git a/miniprogram/pages/connectedDevice/connectedDevice.ts b/miniprogram/pages/connectedDevice/connectedDevice.ts index 1f442e3..9cad0ff 100644 --- a/miniprogram/pages/connectedDevice/connectedDevice.ts +++ b/miniprogram/pages/connectedDevice/connectedDevice.ts @@ -28,6 +28,11 @@ Page({ onShow() { console.log(TAG, 'onShow') + // 回到页面时同步实际连接状态,避免回调被其他页面覆盖导致状态不同步 + if (!lefuService.isConnected) { + const list = this.data.deviceList.map(item => ({ ...item, connected: false })) + this.setData({ deviceList: list }) + } }, onHide() { @@ -169,6 +174,10 @@ Page({ this.setData({ _autoConnectTried: true }) this._autoConnectByIndex(matchedIndex) }) + lefuService.onDisconnected(() => { + const list = this.data.deviceList.map(item => ({ ...item, connected: false })) + this.setData({ deviceList: list }) + }) lefuService.startScan() console.log(TAG, 'lefuService.startScan() 已调用') }, diff --git a/miniprogram/pages/connectedWifi/connectedWifi.ts b/miniprogram/pages/connectedWifi/connectedWifi.ts index 9045918..5026355 100644 --- a/miniprogram/pages/connectedWifi/connectedWifi.ts +++ b/miniprogram/pages/connectedWifi/connectedWifi.ts @@ -25,7 +25,7 @@ Page({ _toBleStatus(state: string): BleStatus { const bs = lefuService.BLUE_STATE if (state === bs.CONNECTSUCCESS || state === bs.WIFISUCCESS) return 'connected' - if (state === bs.CONNECTFAILED) return 'failed' + if (state === bs.CONNECTFAILED || state === bs.UNAVAILABLE) return 'failed' return 'connecting' }, @@ -34,6 +34,11 @@ Page({ lefuService.onDeviceInfo((info) => { this.setData({ deviceName: info.modelNumber }) }) + // 设备断开即退出配网页 + lefuService.onDisconnected(() => { + wx.showToast({ title: '设备已断开连接', icon: 'none', duration: 1500 }) + setTimeout(() => wx.navigateBack(), 1500) + }) this.setData({ bleStatus: this._toBleStatus(lefuService.connectState), deviceName: lefuService.deviceInfo?.modelNumber ?? '智能体重秤', @@ -43,15 +48,13 @@ Page({ onShow() { lefuService.onConnectState((state) => { - const bs = lefuService.BLUE_STATE - if (state === bs.CONNECTSUCCESS || state === bs.WIFISUCCESS || state === bs.CONNECTFAILED) { - this.setData({ bleStatus: this._toBleStatus(state) }) - } + this.setData({ bleStatus: this._toBleStatus(state) }) }) }, onUnload() { wx.hideLoading() + lefuService.onDisconnected(() => {}) if (this.data.status === 'configuring') { lefuService.disconnect() } diff --git a/miniprogram/pages/equipment/equipment.ts b/miniprogram/pages/equipment/equipment.ts index 1a612c6..4bdea6a 100644 --- a/miniprogram/pages/equipment/equipment.ts +++ b/miniprogram/pages/equipment/equipment.ts @@ -68,6 +68,7 @@ Page({ lefuService.stopScan() lefuService.onDeviceConnect(() => {}) lefuService.onDeviceInfo(() => {}) + lefuService.onDisconnected(() => {}) }, /** 拉取已绑定设备列表,加载完成后检查缓存自动连接 */ @@ -112,6 +113,9 @@ Page({ lefuService.onDeviceInfo((info) => { this._markConnected(info.serialNumber as string) }) + lefuService.onDisconnected(() => { + this._markAllDisconnected() + }) lefuService.autoConnect() }, @@ -124,6 +128,12 @@ Page({ this.setData({ deviceList: list }) }, + /** 将所有设备标记为未连接 */ + _markAllDisconnected() { + const list = this.data.deviceList.map(item => ({ ...item, connected: false })) + this.setData({ deviceList: list }) + }, + /** 点击「连接」:扫描周边设备,找到 deviceId 匹配的设备后连接 */ onTapConnect(e: WechatMiniprogram.TouchEvent) { const userInfo = e.currentTarget.dataset.userInfo as DeviceItem diff --git a/miniprogram/utils/request/index.ts b/miniprogram/utils/request/index.ts index e8f0106..7921630 100644 --- a/miniprogram/utils/request/index.ts +++ b/miniprogram/utils/request/index.ts @@ -2,8 +2,8 @@ import type { ApiResponse, HttpMethod, RequestOptions } from './types' export type { ApiResponse, RequestOptions } -const BASE_URL = 'http://10.10.10.10:8889/' // 测试环境 -// const BASE_URL = 'https://device.shuziweidao.com/gateway/' // 正式环境 +// const BASE_URL = 'http://10.10.10.10:8889/' // 测试环境 +const BASE_URL = 'https://device.shuziweidao.com/gateway/' // 正式环境 let _loadingCount = 0