const { BtHelper } = require("../../devices/bt_helper"); import { EnumCmdEvent } from '../../devices/cmd_key_event'; import EventManager from '../../utils/event_bus' // pages/OTA/ota.js Page({ /** * 页面的初始数据 */ data: { nvabarData: { showCapsule: 1, // title: '固件信息', }, device: {}, otaData: {}, btHelper: null, progress: 0, // 进度条初始值 otaStatus: 0, buttonTips: "固件更新", _chunks: [], }, setOtaStatus(status) { switch (status) { case 0: this.setData({ otaStatus: 0, buttonTips: "固件更新" }); break; case 1: this.setData({ otaStatus: 1, buttonTips: "下载升级包" }); break; case 2: this.setData({ otaStatus: 2, buttonTips: "开始更新" }); break; case 3: this.setData({ otaStatus: 3, buttonTips: "更新中..." }); break; case 4: this.setData({ otaStatus: 4, buttonTips: "更新失败,再试一次" }); break; default: break; } }, startOtaTap() { let connect = getApp().globalData.device.connect ?? false if (!connect) { wx.showToast({ title: '设备已经掉线了', }) return; } let _this = this wx.showModal({ title: '有新固件可升级', content: _this.otaData.content ?? '提升体验,操作更流畅', cancelText: '以后再说', confirmText: '升级', complete: (res) => { if (res.cancel) { } if (res.confirm) { _this.downloadFile(_this.otaData.url) } } }) // const btHelper = BtHelper.getInstance(); // btHelper.ota(this.data.otaData.file_url) }, downloadFile(url) { urlPath = updateData.url ?? ""; content = updateData.content ?? "暂无更新"; var list = urlPath.split("/"); // let cachePath = await PathUtil.getDownloadPath(fileName: list.last ?? 'OTAUpgrade.OTA'); const fs = wx.getFileSystemManager(); // 构建本地文件路径 const localFilePath = list[list.length - 1]; let _this = this; // 判断文件是否存在 fs.access(localFilePath, (err) => { if (err) { // 文件不存在,开始下载 wx.downloadFile({ url: url, // 下载资源的URL success: (res) => { if (res.statusCode === 200) { // 下载成功,保存文件路径 const filePath = res.tempFilePath; // 将下载的文件移动到本地路径 fs.rename({ oldPath: filePath, newPath: localFilePath, success: () => { // this.setData({ // localFilePath: localFilePath // }); // 调用 OTA 更新方法 // const btHelper = BtHelper.getInstance(); // btHelper.ota(localFilePath); wx.showToast({ title: '文件下载成功', }); _this.readFile(localFilePath); }, fail: (err) => { wx.showToast({ title: '文件移动失败', }); console.error('文件移动失败:', err); } }); } else { wx.showToast({ title: '文件下载失败', }); } }, fail: (err) => { wx.showToast({ title: '文件下载失败', }); console.error('下载文件失败:', err); } }); } else { _this.readFile(localFilePath); wx.showToast({ title: '文件已存在,跳过下载', }); } }); }, readFile(localFilePath) { if (!localFilePath) { wx.showToast({ title: '下载文件为空', }); return; } this.setOtaStatus(2); const fs = wx.getFileSystemManager(); let _this = this; fs.readFile({ filePath: localFilePath, encoding: 'base64', // 可以选择 'utf8' 或 'base64' success: (res) => { // const btHelper = BtHelper.getInstance(); // btHelper.ota(localFilePath); // console.log('文件内容:', res.data); _this.sendDataToBluetooth(res); }, fail: (err) => { wx.showToast({ title: 'OTA文件下载失败', }); console.error('文件读取失败:', err); } }); }, sendDataToBluetooth(data) { const chunkSize = 20; // 每次发送的数据块大小 const chunks = []; for (let i = 0; i < data.length; i += chunkSize) { chunks.push(data.slice(i, i + chunkSize)); } this.data._chunks = chunks; }, updateProgress(newProgress) { this.setData({ progress: newProgress, }); }, // 示例:模拟进度更新 simulateProgressUpdate() { let currentProgress = 0; const interval = setInterval(() => { if (currentProgress >= 100) { clearInterval(interval); wx.showToast({ title: '升级完成', }); } else { currentProgress += 10; this.updateProgress(currentProgress); } }, 500); }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { let param = JSON.parse(options.param) console.log(param) let otaData = param.otaData let device = param.device device.clientType = device.clientType ?? device.ProdModel this.setData({ otaData: otaData, device: device }) let _this = this; EventManager.addNotification(CmdEvent.eventName, function (event) { let name = event.name; console.log("OTA页:", event) switch (name) { case EnumCmdEvent.otaCmd: let otaCmd = event.otaCmd; if (otaCmd === 1) { _this.sendDataToBluetooth() } else { } break; } }, this) btHelper = BtHelper.getInstance(); const sendNextChunk = (index) => { if (index >= chunks.length) { wx.showToast({ title: '文件发送完成,设备开始升级', }); btHelper.otaCmd(0); return; } const chunk = chunks[index]; btHelper.otaData(chunk); } }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { } })