const pool = require('../config/db'); const logger = require('../logger'); const fs = require('fs'); const path = require('path'); const multer = require('multer'); const { v4: uuidv4 } = require('uuid'); const crypto = require('crypto'); const FIRMWARE_PATH = path.join(__dirname, '../sketch_feb24a.ino.bin'); const LATEST_FIRMWARE_VERSION = "1.0.3"; const upload = multer({ dest: 'uploads/' }); // 固件签名验证函数 const validateFirmwareSignature = (filePath) => { // 这里添加实际的签名验证逻辑 return true; // 暂时返回true用于测试 }; // 新增固件版本查询方法 module.exports = { // 原有检查更新方法 checkUpdates: async (req, res) => { const { device_id, current_version } = req.body; logger.info(`OTA检查请求: 设备=${device_id}, 版本=${current_version}`); try { const [device] = await pool.promise().query( 'SELECT * FROM devices WHERE device_id = ?', [device_id] ); if (!device.length) { return res.status(404).json({ code: 404, message: '设备未注册' }); } const requiresUpdate = current_version !== LATEST_FIRMWARE_VERSION; const updateInfo = { latest_version: LATEST_FIRMWARE_VERSION, release_notes: "1. 优化温控逻辑\n2. 修复安全漏洞", file_size: fs.statSync(FIRMWARE_PATH).size, mandatory: requiresUpdate }; res.json({ code: 200, requires_update: requiresUpdate, ...updateInfo }); } catch (error) { logger.error('检查更新失败:', error); res.status(500).json({ code: 500, message: '服务器内部错误' }); } }, // 原有下载方法 downloadFirmware: (req, res) => { if (fs.existsSync(FIRMWARE_PATH)) { res.download(FIRMWARE_PATH); } else { res.status(404).send("固件文件未找到"); } }, // 新增上传处理方法 uploadFirmware: upload, handleFirmwareUpload: async (req, res) => { if (!req.file) { return res.status(400).json({ code: 400, message: '未选择固件文件' }); } try { if (!validateFirmwareSignature(req.file.path)) { fs.unlinkSync(req.file.path); return res.status(403).json({ code: 403, message: '固件签名验证失败' }); } fs.renameSync(req.file.path, FIRMWARE_PATH); res.json({ code: 200, message: '固件上传成功', version: LATEST_FIRMWARE_VERSION }); } catch (error) { res.status(500).json({ code: 500, message: '固件上传失败' }); } }, // 新增升级方法 upgradeStatus: new Map(), startUpgrade: (req, res) => { const { device_id } = req.body; const upgradeId = uuidv4(); // 修复this指向问题 module.exports.upgradeStatus.set(upgradeId, { device_id, progress: 0, status: 'pending', start_time: Date.now() }); res.json({ code: 200, message: '升级已启动', upgrade_id: upgradeId }); }, // ← 保持逗号分隔 checkDeviceUpdate: async (req, res) => { const { deviceId, currentVersion } = req.body; try { const [versions] = await pool.promise().query( 'SELECT * FROM firmware_versions WHERE device_type = ? ORDER BY release_date DESC LIMIT 1', [deviceId] ); // 添加缺失的闭合括号和错误处理 const latest = versions[0] || { version_number: currentVersion }; const hasUpdate = latest.version_number > currentVersion; res.json({ code: 200, hasUpdate, latestVersion: latest.version_number }); } catch (error) { logger.error('检查更新失败:', error); res.status(500).json({ code: 500, message: '服务器内部错误' }); } }, // ← 添加逗号分隔 getFirmwareVersions: async (req, res) => { try { const [results] = await pool.promise().query( 'SELECT * FROM firmware_versions ORDER BY release_date DESC' ); res.json({ code: 200, data: results }); } catch (error) { logger.error('获取固件版本失败:', error); res.status(500).json({ code: 500, message: '服务器内部错误' }); } } }; // ← 确保对象正确闭合