当前位置: 首页 > article >正文

网页固件升级界面设计

1. 代码

<!DOCTYPE html>
<html>
<head>
    <title>本地固件升级</title>
    <style>
        .L1_tab-content {
            max-width: 400px;
            margin: 20px auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 8px;
            text-align: center;
        }
        h2 {
            margin-bottom: 20px;
        }
        input[type="file"] {
            margin-bottom: 10px;
        }
        button {
            padding: 10px 20px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #0056b3;
        }
        progress {
            width: 100%;
            height: 20px;
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <div class="L1_tab-content">
        <h2>本地固件升级</h2>
        <input type="file" id="firmwareFile"><br>
        <button onclick="startUpgrade()">升级</button>
        <progress id="upgradeProgress" value="0" max="100"></progress>
    </div>

    <script>
        function startUpgrade() {
            const fileInput = document.getElementById('firmwareFile');
            const file = fileInput.files[0];
            if (!file) {
                alert("请先选择固件文件!");
                return;
            }

            const reader = new FileReader();

            reader.onload = function(event) {
                const fileData = event.target.result;
                const chunkSize = 1024; // 每次发送1KB
                const ip = '192.168.1.100'; // ESP8266的IP地址
                const port = 12345; // ESP8266的TCP端口

                const socket = new WebSocket(`ws://${ip}:${port}`);

                socket.onopen = () => {
                    let offset = 0;
                    const totalSize = fileData.byteLength;

                    function sendNextChunk() {
                        if (offset < totalSize) {
                            const chunk = fileData.slice(offset, offset + chunkSize);
                            socket.send(chunk);
                            offset += chunkSize;

                            // 更新进度条
                            const progress = Math.round((offset / totalSize) * 100);
                            document.getElementById('upgradeProgress').value = progress;

                            // 继续发送下一个块
                            setTimeout(sendNextChunk, 10); // 添加延迟以避免阻塞
                        } else {
                            socket.close();
                        }
                    }

                    // 开始发送第一个块
                    sendNextChunk();
                };

                socket.onmessage = (event) => {
                    console.log('Received:', event.data);
                };

                socket.onclose = () => {
                    console.log('升级完成');
                    alert('固件升级完成!');
                    document.getElementById('upgradeProgress').value = 0; // 重置进度条
                };
            };

            reader.readAsArrayBuffer(file);
        }
    </script>
</body>
</html>

2. 效果

在这里插入图片描述


http://www.kler.cn/a/511758.html

相关文章:

  • oneplus3t-lineageos-16.1编译-android9,
  • C++实现Point2D类 有限元基础类
  • Spring Security 6.X + JWT + RBAC 权限管理实战教程(上)
  • Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹
  • 考前64天 学习笔记 - 形成“习惯体系”进行最小启动
  • Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
  • 【Maven】resources-plugin
  • vue3-sfc-loader 加载远程.vue文件(sfc)案例
  • React总结
  • 合合信息DocFlow产品解析与体验:人人可搭建的AI自动化单据处理工作流
  • UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理?
  • 【spring boot统一功能处理】拦截器
  • 梯度提升决策树树(GBDT)公式推导
  • 【面试题】JVM部分[2025/1/13 ~ 2025/1/19]
  • pytest+playwright落地实战大纲
  • leetcode242-有效字母异位词
  • RoCE网络及其协议栈详解(没有中间商赚差价的网络)
  • 快速排序练习
  • Linux:生产者消费者模型
  • 第 3 章 核心处理层(上)
  • Bash 中 nohup 与 的区别及用法解析
  • leetcode416.分割等和子集
  • nginx作为下载服务器配置
  • Python人脸识别库DeepFace使用教程及源码解析
  • imbinarize函数用法详解与示例
  • python 基础类json和csv