Wire v3 · 光学二维码 · 纯离线
把文件“照”过去
发送端的屏幕上滚动着一串二维码,接收端用摄像头读取,在本机还原出原始内容。 没有服务器、没有账号、没有网络——数据只走光和镜头。
Wire v3 · 光学二维码 · 纯离线
发送端的屏幕上滚动着一串二维码,接收端用摄像头读取,在本机还原出原始内容。 没有服务器、没有账号、没有网络——数据只走光和镜头。
光学传输把「文件」变成「一段会动的二维码」。发送端把内容切块、喷泉编码,然后以固定帧率 把一块块二维码打在屏幕上;接收端的摄像头持续取景,逐个解出二维码里的数据块,凑齐之后 在本机重组、校验,最后交回原始文件或文字。
整条链路里没有服务器、没有 WebRTC、没有账号,也没有任何网络请求:数据只走屏幕的光和 手机的镜头。发送端与接收端可以在两台完全离线的设备上工作。
内容被切成 K 个数据块,发送端先顺序各发一遍,再发 K 个中等度数(4–24)的确定性修复帧, 然后循环。接收端只要凑够约 K×1.00–1.15 个互不相同的帧就能还原,不需要回传信道, 也不需要知道到底丢了哪几帧——这正是「喷泉」的含义。
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 厘米通常最稳。
© 2026 Evan Crawley (Bash Alarmist),部分代码由 Steve Dakh 以 MIT 贡献。 这是强 copyleft 许可:再分发(包括把本页部署到服务器供他人访问)需要保留许可证与 署名,并向使用者提供对应源码。
界面外壳(首页、发送/接收流程、样式、脚本、PWA 支持)为本项目原创;核心页面
core/send.html、core/receive.html
与上游 Release 产物逐字节一致。
把本页安装成应用后,整套界面与传输核心都会缓存到本机:断网、飞行模式、甚至完全没有 网络的环境里也能打开并完成一次光学传输。接收端需要的摄像头权限与网络无关。
提示:离线缓存只在 https:// 或
http://localhost 下生效;用 file://
直接双击打开时浏览器会禁用 Service Worker。
https:// 或 http://localhost;局域网 http 会被浏览器拒绝。正在检测…