bashalarmistalt/decimen-optical-transfer · 上手攻略
- 仓库:bashalarmistalt/decimen-optical-transfer
- 链接:https://github.com/bashalarmistalt/decimen-optical-transfer
- 分类:文件传输 · 光通信 · 离线传输
- 作者:Tom
- 更新:2026-08-03
这是什么
Decimen Optical Transfer 是一个纯浏览器端文件传输工具,核心原理是把任意文件编码为永不停歇的二维码动画流,接收端用摄像头扫描并在浏览器内实时重建文件。设备之间无需网络、无需配对、不装 App,只需一块屏幕和一颗摄像头,文件就能"以光速"到达另一台设备。
它用到了喷泉码(Fountain Code / Luby Transform Code)来对抗丢帧——每个 QR 帧不是文件内容的直接切分,而是伪随机异或块,接收端收到约 K×1.15 个不同帧即可完全重建,顺序和完整与否都不重要,丢帧只拖慢速度,不破坏正确性。
早期实验版本曾达到手机对手机 128 KB/s(更密帧幅 + 多码网格 + 纠错色通道),当前 PoC 版本面向通用场景做了精简。
解决什么问题
- 完全离线的两设备文件传输:没有 WiFi、没有 USB、没有蓝牙配对,只有一块屏幕和一颗摄像头。
- 高度受限网络下的应急传输:如酒店、机场、会议厅等无法访问网络或不想连公共 WiFi 的场景。
- 临时一次性文件共享:不需要注册、不需要服务端,适合一对一的临时大文件分发。
- 最大文件 64 MB(本次 PoC 上限),支持任意 MIME 类型,自动保留文件名。
快速安装
在线直接用(最简方式)
无需安装,直接访问 decimen.app,在两台设备上分别打开,发送端选 /send/,接收端选 /receive/。首次加载后 Service Worker 会缓存全站,之后可以完全离线使用。
本地 npm 部署
git clone https://github.com/bashalarmistalt/decimen-optical-transfer.git
cd decimen-optical-transfer
npm install
npm run dev # 开发服务器(热更新),Vite 输出 https://:5173 地址
npm run serve # 生产构建后启动静态服务
npm run demo # 演示模式:只能发送两个内置图片,防止陌生人浏览你的文件系统
npm test # 跑 golden wire-format 向量测试和单元测试
npm run build # 构建网站 → dist/
npm run build:standalone # 构建完全自包含的单文件版 → dist-standalone/
npm run build:all # 构建全部制品
零依赖离线包
# 下载 release 附件,得到两个 .html 文件:
# - decimen-sender.html (~55 KB,只有发送端)
# - decimen-receiver.html (~1.3 MB,包含 940 KB 解码器 WASM 内联)
# 接收端 .html 可通过邮件、USB 传递给对方,无需任何网络或构建工具。
核心用法
最小可跑流程(本地开发服务器)
发送端(电脑)
npm run dev
# 浏览器打开 https://localhost:5173/send/
# 选"发送文件"或"文本片段",调至屏幕最高亮度
⚠️ Vite 开发服务器使用自签名证书,首次访问浏览器会报警,点击"Show Details → 继续访问"即可。手机访问同一局域网地址时同样需要接受证书警告。
接收端(手机)
1. 浏览器打开 Vite 输出的网络地址(如 https://192.168.x.x:5173/receive/)
2. 接受证书警告一次
3. 点击 Start camera,对准发送端屏幕
4. 接收完毕后自动 SHA-256 校验,通过后下载文件
演示模式(公共演示,防止他人操作发送端电脑)
npm run demo
# 发送端只能选两个内置图片,无法浏览本机文件系统
核心参数说明
| 参数 | 说明 |
|---|---|
| 文件大小上限 | 64 MB(PoC 限制) |
| 传输速度 | 实测 ~129 KB/s(手机接收 2 MB 图片),高质量屏幕可达更高 |
| 丢帧处理 | 喷泉码自动恢复,不请求重传 |
| 离线支持 | Service Worker 预缓存,首次访问后全站可离线使用 |
| 加密 | ❌ 无,屏幕内容对任何可见相机可见,仅提供"无网络"的隐私 |
构建独立部署包
# 构建两个完全自包含的单文件 HTML(无外部依赖)
npm run build:standalone
# 结果在 dist-standalone/:
# decimen-sender.html (~55 KB)
# decimen-receiver.html (~1.3 MB,WASM 解码器以 data: URI 内联)
GitHub Pages 部署
# 启用 Pages 后,每次 push 到 main 自动部署
# .github/workflows/pages.yml 已配置
# 访问:https://<username>.github.io/<repo>/
典型适用场景
- 无网络两设备互传:飞机上、地下室、屏蔽房内,只要屏幕和摄像头正常就能传。
- 临时大文件分享:不想用微信/QQ/邮件传输限制,手一挥文件就到对方手机。
- 安全隔离传输:物理隔离的气隙网络(air-gapped),完全不需要任何网络连接。
- 公共演示/ kiosk:用 demo 模式限制发送端只能选预设内容,防止旁人操作你的电脑。
- 应急固件/脚本传递:在无法接入 U 盘的工业设备上,通过屏幕+手机传一个小文件进去。
坑与注意
⚠️ 摄像头权限限制(最大坑)
- iOS Safari / Android Chrome 从
file://打开无法使用摄像头:因为摄像头权限绑定到安全来源(https 或 localhost)。解法:用npm run dev的网络地址访问,或用托管站点的离线模式。 - 发送端无此限制,只有接收端需要真实 https 来源。
⚠️ 无加密
- 屏幕内容对任何可见相机完全可见,不提供保密性,只提供"无网络路径"的隐私。敏感内容勿用。
⚠️ 屏幕亮度 = 带宽
- 最低亮度会严重影响 QR 帧的可读性和速度。始终调至最高亮度传输。
⚠️ 摄像头抖动
- 手持手机抖会导致 autofocus 不断重新对焦,是吞吐量第一杀手。建议用手机支架或靠在固定物体上。
⚠️ 单向通道
- 屏幕→摄像头是单向的,接收端无法请求重传(喷泉码补偿了这一点,但丢帧仍会拖慢速度)。
⚠️ 最大文件 64 MB
- 这是 PoC 的人为上限,不适合大文件分发。128 KB/s 速度传 64 MB 约需 8.5 分钟。
与同类对比
| 项目 | 通道 | 离线 | 最大速度 | 文件上限 | 特点 |
|---|---|---|---|---|---|
| Decimen | 屏幕→摄像头 | ✅ | ~129 KB/s(实测) | 64 MB | 喷泉码纠错,浏览器原生,无需 App |
| divan/txqr | 屏幕→摄像头 | ✅ | 较快 | 较小 | Go 语言,2018年早期实现 |
| sz3/libcimbar | 屏幕→摄像头 | ✅ | 更高 | 更大 | 自定义彩色码,非 QR,效率更高 |
| mohankumarelec/airgapped-qr | 屏幕→摄像头 | ✅ | 一般 | 中等 | 浏览器端,顺序分块+压缩,无喷泉码 |
| AirDrop | WiFi Direct | ❌ | 很高 | 无限制 | 苹果生态,专有协议 |
| LOCAL Send | LAN | ❌ | 很高 | 无限制 | 开源跨平台,局域网传输 |
结论:Decimen 的核心差异化在于纯浏览器 + 喷泉码 + 完全离线,尤其适合无任何网络基础设施或高度安全隔离场景。
一句话推荐结论
在没有任何网络条件的情况下,Decimen 用一块屏幕和一颗摄像头让两台设备完成可靠文件传输——喷泉码让丢帧不再是问题,纯浏览器运行无需安装,是离线应急传输的最优雅方案之一。
最小可跑命令
# 环境:Node.js 18+,npm 9+
git clone https://github.com/bashalarmistalt/decimen-optical-transfer.git
cd decimen-optical-transfer
npm install
npm run dev
# 发送端浏览器:https://localhost:5173/send/
# 接收端手机:访问终端输出的 https://192.168.x.x:5173/receive/
# 屏幕亮度调最高,手机摄像头对准屏幕,保持稳定
# 接收完毕后 SHA-256 自动校验,通过后保存文件
注意:传输速度依赖屏幕质量、摄像头对焦、环境光线,实测 129 KB/s 为参考值,不代表所有设备。
原始链接
- 仓库:https://github.com/bashalarmistalt/decimen-optical-transfer
- 最新 release:https://github.com/bashalarmistalt/decimen-optical-transfer/releases/latest
- 在线体验:https://decimen.app/