光学传输

Wire v3 · 光学二维码 · 纯离线

把文件“照”过去

发送端的屏幕上滚动着一串二维码,接收端用摄像头读取,在本机还原出原始内容。 没有服务器、没有账号、没有网络——数据只走光和镜头。

不联网 不加密·勿传机密 单文件 64 MB 最多 6 码同屏
发送 选好文件或文字,屏幕变成二维码 接收 打开摄像头,对准发送端的屏幕 更多
关于光学传输
介绍 原理 版本 许可 离线 帮助

介绍

光学传输把「文件」变成「一段会动的二维码」。发送端把内容切块、喷泉编码,然后以固定帧率 把一块块二维码打在屏幕上;接收端的摄像头持续取景,逐个解出二维码里的数据块,凑齐之后 在本机重组、校验,最后交回原始文件或文字。

整条链路里没有服务器、没有 WebRTC、没有账号,也没有任何网络请求:数据只走屏幕的光和 手机的镜头。发送端与接收端可以在两台完全离线的设备上工作。

64 MB单文件上限
6 码单屏最多同显
64 B–3 KB每帧字节数可调
SHA-256还原后校验

适用与不适用

  • 适合:两台设备之间不便联网时的小文件、配置、网址、口令短语、照片。
  • 适合:气隙(air-gap)环境里单向搬运少量数据。
  • 不适合:大文件、需要保密的内容——二维码本身没有加密,附近任何摄像头都能拍到。

原理

喷泉码:丢帧只影响快慢

内容被切成 K 个数据块,发送端先顺序各发一遍,再发 K 个中等度数(4–24)的确定性修复帧, 然后循环。接收端只要凑够约 K×1.00–1.15 个互不相同的帧就能还原,不需要回传信道, 也不需要知道到底丢了哪几帧——这正是「喷泉」的含义。

带版本号的帧头(wire v3)

22 字节帧头:双魔数 0xD1 0xC3、版本字节、flags 字节, 其后是会话 ID、序列号、K、块长、总长与负载校验。遇到读不懂的 Decimen 流会明确提示 「请更新发送端」,遇到无关的二维码则保持沉默。

容器、压缩与校验

负载外面套一层 49 字节容器:魔数、gzip 标志、文件名长度、MIME 长度、原始长度、传输长度 与 32 字节 SHA-256。压缩收益为正时用浏览器的 CompressionStream 做 gzip;接收端在把结果交给你之前先验证 SHA-256,损坏的文件不会被保存。

本机解码

解码器是独立的 decimen-codec(QR-only 的 zxing-cpp WASM 构建),在 Web Worker 里运行, WASM 已内联进页面,因此首次加载后可以完全断网使用;多码同屏时多个 Worker 并行解码。

速度取决于光

实际速率由「每帧字节数 × 帧率 × 屏上码数 × 解码成功率」共同决定。屏幕亮度、镜头素质、 对焦稳定性、环境光都会影响它——把手机固定住、屏幕调最亮、距离 20–40 厘米通常最稳。

版本

传输核心
Decimen Optical Transfer v0.5.3
构建
5301fc2 · 官方 Release 产物
线格式
wire v3(0xD1 0xC3,version = 3)
界面框架
mdui 2 · Material Design 3
界面语言
简体中文(核心自带 12 种语言)
本页地址
—

兼容性

  • 0.5.x 之间互通;v0.3.0 / v0.4.x 与本版不能互通,请让两端使用同一代版本。
  • v0.5.3 接收端遇到旧格式发送端会明确提示「对方在用旧的 Decimen 格式」。
  • 本页内嵌的核心与上游官方产物逐字节一致,只额外注入了「独立运行适配层」。
上游源码仓库 github.com/bashalarmistalt/decimen-optical-transfer 上游发布记录 v0.5.3 的变更与校验和 本地更新记录 docs/upstream-releases.md 原版网站 decimen.app(发送端 / 接收端同版本,可互通)

许可

传输核心:AGPL-3.0-or-later

© 2026 Evan Crawley (Bash Alarmist),部分代码由 Steve Dakh 以 MIT 贡献。 这是强 copyleft 许可:再分发(包括把本页部署到服务器供他人访问)需要保留许可证与 署名,并向使用者提供对应源码。

本页新增部分

界面外壳(首页、发送/接收流程、样式、脚本、PWA 支持)为本项目原创;核心页面 core/send.html、core/receive.html 与上游 Release 产物逐字节一致。

AGPL-3.0 全文 LICENSES/Decimen-Optical-Transfer-v0.5.3-AGPL-3.0.txt 第三方声明 NOTICE(含 Emscripten、zxing-cpp 等) v0.3.0 的 MIT 许可 早期版本仍按 MIT 提供 mdui(MIT) vendor/mdui/LICENSE Material Icons(Apache-2.0) vendor/material-icons/LICENSE

离线使用(PWA)

把本页安装成应用后,整套界面与传输核心都会缓存到本机:断网、飞行模式、甚至完全没有 网络的环境里也能打开并完成一次光学传输。接收端需要的摄像头权限与网络无关。

正在检查安装状态… —
安装到本机 检查更新 清除离线缓存
离线缓存
—
缓存占用
—
当前状态
—

手动安装

  • Chrome / Edge(桌面):地址栏右侧的「安装」图标,或菜单 → 投放、保存和共享 → 安装页面为应用。
  • Android Chrome:菜单 → 添加到主屏幕 / 安装应用。
  • iOS Safari:分享 → 添加到主屏幕(iOS 不支持自动安装提示,功能不受影响)。

提示:离线缓存只在 https:// 或 http://localhost 下生效;用 file:// 直接双击打开时浏览器会禁用 Service Worker。

帮助

一次传输的四个步骤

  1. 发送端:点「发送」,选择文件(≤ 64 MB)或切到「文字」粘贴内容。
  2. 接收端:另一台设备打开本页 → 「接收」→「开始扫描」并允许摄像头。
  3. 对准:让二维码尽量占满取景框,发送端亮度调到最高,手机最好固定住。
  4. 等待:进度到 100% 后会自动做 SHA-256 校验,然后就能保存文件或复制文字。

常见问题

  • 摄像头打不开:必须是 https:// 或 http://localhost;局域网 http 会被浏览器拒绝。
  • 进度条纹丝不动:把发送端「传输设置 → 每帧字节数」降到 1000 左右、帧率降到 20–30,并调高屏幕亮度、固定手机。
  • 选错了镜头:接收端在核心页面的「接收设置 → 摄像头」里手动指定,切换是实时的。
  • 两端版本不一致:v0.3.0 / v0.4.x 与 v0.5.x 线格式不同,两个方向都不通。
  • 想传大文件:64 MB 是核心硬上限;光学链路适合小文件与文本。

环境检测

正在检测…

项目说明 README:目录结构、构建方式、验证记录 直接打开核心发送端 core/send.html(不含引导流程) 直接打开核心接收端 core/receive.html(不含引导流程)