Eterink 是 MindReset Quote/0(ESP32-C3 + 296×152 黑白墨水屏)的私有化应用。后端(TypeScript)负责渲染、设备管理与周计划调度;前端(Vue 3)提供浏览器控制台,并内置 USB 本地工具页与设备模拟器页。
本项目基于 SeimoDev/inklink-studio,遵循 GNU GPL-3.0,详见许可与来源。
Eterink/
├── backend/ # TypeScript 纯 JSON API:渲染、设备管理与插件系统(Node ≥ 20,零运行时依赖)
├── web/ # Vue 3 前端,一次构建产出三个入口
│ ├── index.html # 控制台 /:设备、显示任务、任务规划、电源策略与插件
│ ├── usb/ # USB 本地工具页 /usb/:Web Serial 配置、画面编辑与固件刷写
│ ├── sim/ # 设备模拟器页 /sim/:无硬件时模拟固件轮询与上屏
│ ├── src/ # 控制台源码(api / components / lib / router / stores / views)
│ └── public/firmware/ # 内置一体化固件(USB 工具页刷写资源)
├── firmware/ # ESP-IDF 固件(ESP32-C3 + UC8251D)
├── __web/ # 迁移前的旧版 USB 工具(保留备查,见其 README)
├── nginx.conf # 部署示例:静态托管 web/dist 并反代 /api 到后端
└── PLUGIN_GUIDE.md # 后端插件制作手册
根目录提供基于 pnpm 的快捷命令(首次使用先执行一次 pnpm install):
pnpm dev # 并行启动后端(:8080)与前端开发服务器(:5173)
pnpm dev:backend # 仅启动后端
pnpm dev:web # 仅启动前端
pnpm build # 依次构建后端与前端
pnpm test # 依次运行后端与前端测试
pnpm typecheck # 前后端类型检查前端开发服务器通过 Vite 将 /api 代理到 http://127.0.0.1:8080,与生产环境的同源部署保持一致。运行后端后第一次访问控制台时,会自动进入初始化流程设置账号密码。
web/ 一次构建产出三个入口,共用同一套浅色视觉基线:
| 入口 | 路径 | 说明 |
|---|---|---|
| 控制台 | / |
公开首页与登录/初始化;登录后管理设备、显示任务、任务规划、电源策略与插件 |
| USB 工具 | /usb/ |
Web Serial 连接设备:配置读写、离线画面编辑、固件备份与刷写(无需登录) |
| 设备模拟器 | /sim/ |
无硬件时模拟设备的后端同步循环与上屏,便于联调后端(无需登录) |
后端是设备的公网控制入口,只提供 JSON API,不托管任何页面:
- 身份验证:验证访问者是否为设备拥有者;密码 scrypt 加盐哈希,会话为 HMAC 签名的 HttpOnly Cookie。
- 显示任务:任务(基础源 + 插件组件)与周一至周日计划的增删改查;按服务器本地时间自动切换到当前时段的任务,支持临时显示并自动恢复。
- 设备协议:设备以
X-Eterink-Device/X-Eterink-Secret凭据轮询上报遥测,服务端返回显示版本、电源策略与下一个计划边界;设备仅在版本变化时拉取 1-bit 帧。 - 插件系统:注册渲染器与组件扩展后端渲染(可声明选项 Schema,面板自动生成配置控件),并可注册额外的 API 端点;插件配置由控制面板维护并保存在服务器。
部署、环境变量与完整 API 一览见 backend/README.md。
设备定时向后端请求配置与显示状态,仅在目标画面变化时更新屏幕。请求频率由固件按电源状态自动调整,用户可在一定范围内自定义:
| 电源状态 | 行为 |
|---|---|
| 充电 | 电源活跃状态,每 1 秒获取服务端信息,实现伪实时修改 |
| 断开供电后的活跃期 | 每 5 秒获取服务端信息 |
| 休眠态 | 按用户设定的时间间隔与服务器交互 |
例如断开供电越久或电量越低,可以降低请求频率以节省电量:开启自适应后,休眠间隔按断电时长(每满 6 小时递增一档)与电量(低于 20%/10% 时加大档位)自动放大,并以设定的间隔上限封顶。
电池休眠期为深睡轮询(睡眠时长 = 轮询间隔 − 15 秒),插 USB 即秒级唤醒。深睡期间设备会读取后端声明的下一个周计划边界(display.nextChangeAt):边界比轮询间隔更近时提前唤醒,保证计划切换准点生效。
固件基线为 ESP-IDF 6.1:
. "$IDF_PATH/export.sh"
cd firmware
idf.py set-target esp32c3
idf.py build日常刷写统一从 USB 本地工具页(/usb/)的“浏览器刷写与备份”区域执行。固件构建、合并为浏览器资源及分区说明见 firmware/README.md。
- Web 控制台(
/):公开首页与登录/初始化,登录后管理设备、显示任务、任务规划、电源策略与插件 - 后端按周计划渲染显示任务(基础源 + 插件组件叠加),公网控制显示内容与设备状态;插件系统可扩展渲染器与组件并注册额外 API
- 设备按电源策略定时同步后端配置与显示状态,变化时更新画面;深睡时按周计划边界提前唤醒
- USB 本地工具页(
/usb/)提供 296×152 可视化编辑,图片裁剪、缩放、灰阶转 1-bit 与多种抖动算法 - 文字和传感器图层自由定位、样式调整、层级管理与项目 JSON 导入导出
- 电池电压、电量、芯片温度、USB 状态、运行时间和可用内存读取
- 从设备载入并保存 Wi-Fi、BLE、数据读取、屏幕更新、强制全刷间隔与连续局刷上限
- 通过 USB 配置后端服务器地址、设备 ID 与密钥,并读写充电/断电/休眠电源策略
- UC8251D 变化区域局刷、周期全刷和无变化跳过
- 浏览器内置固件刷写、本地固件载入及整颗 4 MB Flash 备份下载
- 设备模拟器页(
/sim/):无硬件时模拟固件轮询、拉帧、CRC 校验与上屏
屏幕是黑白 1-bit 面板;网页中的灰阶效果通过抖动网点模拟,发送到设备的最终画面只有黑白两色。
浏览器刷写会覆盖设备固件。仅对已确认采用相同板级引脚、UC8251D 屏幕和 4 MB Flash 的 Quote/0 设备操作。浏览器生成的整片备份包含 Wi-Fi 凭据,请妥善保管。
本项目基于 SeimoDev/inklink-studio,按 GNU General Public License v3.0 发布(见 LICENSE)。原项目版权归其作者所有;本项目在原项目基础上的修改与新增同样以 GPL-3.0 授权,任何人均可在相同条款下再分发。
PLUGIN_GUIDE.md:后端插件制作手册(渲染器、组件、HTTP 端点与热重载)backend/README.md:后端部署、环境变量、设备接入协议与 APIweb/README.md:前端三个入口的开发、构建与部署firmware/README.md:固件构建、浏览器固件资源生成与分区策略