| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- 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: '服务器内部错误' });
- }
- }
- }; // ← 确保对象正确闭合
|