diff --git a/miniprogram/lefu/service.ts b/miniprogram/lefu/service.ts index ed1facb..534102b 100644 --- a/miniprogram/lefu/service.ts +++ b/miniprogram/lefu/service.ts @@ -423,6 +423,34 @@ class LeFuService { }) } + // ─── OTA 升级 ───────────────────────────── + /** + * 下发 OTA 固件升级指令 + * 只负责调用协议层 codeOtaUpdate,是否需要升级、版本比较等业务判断由调用方处理。 + */ + otaUpdate(): Promise { + return new Promise((resolve, reject) => { + if (!this._activeProtocol) { reject(new Error('设备未连接')); return } + this._activeProtocol.codeOtaUpdate((status: number) => { + status === 0 ? resolve() : reject(new Error('升级指令下发失败')) + }) + }) + } + + // ─── 设备初始化 ─────────────────────────── + /** + * 初始化设备信息 + * 下发 codeClearDeviceData('00') 指令清除设备信息,区别于 clearDeviceMembers 的 '01'(清空用户数据)。 + */ + initDevice(): Promise { + return new Promise((resolve, reject) => { + if (!this._activeProtocol) { reject(new Error('设备未连接')); return } + this._activeProtocol.codeClearDeviceData('00', (res: number) => { + res === 0 ? resolve() : reject(new Error('请求失败')) + }) + }) + } + // ─── 用户同步 ───────────────────────────── /** * 清空设备内的用户数据 diff --git a/miniprogram/pages/equipment/equipment.less b/miniprogram/pages/equipment/equipment.less index b42fef2..f727873 100644 --- a/miniprogram/pages/equipment/equipment.less +++ b/miniprogram/pages/equipment/equipment.less @@ -294,6 +294,41 @@ } } } + + .device-update { + width: 100%; + gap: 10px; + display: flex; + flex-wrap: nowrap; + margin-top: 20rpx; + justify-content: space-around; + + > view { + flex: 1; + height: 56rpx; + display: flex; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + border-radius: 28rpx; + border: 2rpx solid #EAECF1; + + > view:nth-of-type(1) { + width: 24rpx; + height: 24rpx; + display: flex; + align-items: center; + margin-right: 6rpx; + } + + > view:nth-of-type(2) { + color: #77849E; + height: 24rpx; + font-size: 24rpx; + line-height: 24rpx; + } + } + } } /* 添加设备按钮 */ diff --git a/miniprogram/pages/equipment/equipment.ts b/miniprogram/pages/equipment/equipment.ts index 0832b2d..0e5ec8e 100644 --- a/miniprogram/pages/equipment/equipment.ts +++ b/miniprogram/pages/equipment/equipment.ts @@ -39,6 +39,25 @@ const uploadHistoryData = (data: Record) => /** SN 转 MAC:每两位加一个冒号(如 CEE9052031AC → CE:E9:05:20:31:AC) */ const formatMac = (sn: string) => sn.match(/.{2}/g)?.join(':') ?? '' +/** 服务端固件版本(weighingScale/v2/firmware/version 接口 result 字段) */ +interface FirmwareVersion { + mcuVersion: string + bleVersion: string + wifiVersion: string + resVersion: string +} + +/** 获取服务端最新固件版本 */ +const getFirmwareVersion = (modelNumber: string) => + get('weighingScale/v2/firmware/version', { type: modelNumber }, { loading: false }) + +/** 判断服务端版本是否比设备版本新(两端都去掉点号后转数字比较) */ +const isServerNewer = (deviceVer: string, serverVer: string) => { + const dn = parseInt(deviceVer, 10) + const sn = parseInt((serverVer || '').replace(/\./g, ''), 10) + return sn > dn +} + /** 展示用设备项 */ interface DeviceItem { id: string @@ -327,6 +346,84 @@ Page({ }) }, + /** OTA 升级:拉服务端最新版本,比较后下发升级指令 */ + onTapOta() { + const deviceInfo = leFuService.deviceInfo + if (!leFuService.isConnected) { + wx.showToast({ title: '请先连接设备', icon: 'none' }) + return + } + if (!deviceInfo) { + wx.showToast({ title: '固件信息未就绪', icon: 'none' }) + return + } + + const { firmwareRevision, modelNumber } = deviceInfo + const [mcuVer, bleVer, wifiVer, resVer] = (firmwareRevision || '').split('.') + console.log('[OTA] 设备版本', { mcuVer, bleVer, wifiVer, resVer }) + + this.setData({ loadingShow: true, loadingTitle: '正在检测新版本' }) + getFirmwareVersion(modelNumber) + .then((res) => { + const { mcuVersion, bleVersion, wifiVersion, resVersion } = res.result + console.log('[OTA] 服务端版本', { mcuVersion, bleVersion, wifiVersion, resVersion }) + const needUpdate = isServerNewer(mcuVer, mcuVersion) + || isServerNewer(bleVer, bleVersion) + || isServerNewer(wifiVer, wifiVersion) + || isServerNewer(resVer, resVersion) + if (!needUpdate) { + this.setData({ loadingShow: false }) + wx.showToast({ title: '已是最新版本', icon: 'none' }) + return + } + this.setData({ loadingTitle: '正在升级' }) + leFuService.otaUpdate() + .then(() => { + // 升级后设备重启,清空连接信息 + leFuService.disconnect() + this.setData({ loadingShow: false }) + wx.showToast({ title: '升级指令已下发', icon: 'success' }) + }) + .catch(() => { + this.setData({ loadingShow: false }) + wx.showToast({ title: '升级失败', icon: 'none' }) + }) + }) + .catch(() => { + this.setData({ loadingShow: false }) + }) + }, + + /** 初始化设备信息 */ + onTapInit() { + if (!leFuService.isConnected) { + wx.showToast({ title: '请先连接设备', icon: 'none' }) + return + } + wx.showModal({ + title: '初始化设备', + content: '是否确认初始化设备信息?', + cancelText: '取消', + confirmText: '确定', + confirmColor: '#F24439', + success: (res) => { + if (!res.confirm) return + this.setData({ loadingShow: true, loadingTitle: '正在初始化设备' }) + leFuService.initDevice() + .then(() => { + // 初始化后设备归零,清空连接信息 + leFuService.disconnect() + this.setData({ loadingShow: false }) + wx.showToast({ title: '初始化完成', icon: 'success' }) + }) + .catch((err: Error) => { + this.setData({ loadingShow: false }) + wx.showToast({ title: err?.message || '初始化失败', icon: 'none' }) + }) + }, + }) + }, + /** 处理历史数据并上传到后台 */ _uploadHistory(mainUserId: string, dataList: any[], done?: () => void) { if (!dataList || !dataList.length) { diff --git a/miniprogram/pages/equipment/equipment.wxml b/miniprogram/pages/equipment/equipment.wxml index a386811..793c800 100644 --- a/miniprogram/pages/equipment/equipment.wxml +++ b/miniprogram/pages/equipment/equipment.wxml @@ -107,6 +107,19 @@ + + + + + + OTA升级 + + + + 初始化 + + +