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>/

典型适用场景

  1. 无网络两设备互传:飞机上、地下室、屏蔽房内,只要屏幕和摄像头正常就能传。
  2. 临时大文件分享:不想用微信/QQ/邮件传输限制,手一挥文件就到对方手机。
  3. 安全隔离传输:物理隔离的气隙网络(air-gapped),完全不需要任何网络连接。
  4. 公共演示/ kiosk:用 demo 模式限制发送端只能选预设内容,防止旁人操作你的电脑。
  5. 应急固件/脚本传递:在无法接入 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/