曾经有个奇怪的想法:电脑和手机明明近在咫尺、屏幕对着摄像头,为什么要绕一大圈走 U 盘、WiFi 或蓝牙才能传文件?能不能直接用屏幕发出的光把数据"照"过去?

没有实际需求,纯粹因为好玩——于是在Claude Code/Workbuddy(免费积分)/QClaw(免费积分)的共同帮助下做了这个实现。

下面两个 GIF 就是成品:PC 端高速刷新黑白二维码,手机摄像头对准屏幕,文件就"飞"过去了。


第一步:PC 发送端 — 把文件变成"闪烁的光"

PC 端发送二维码

PC 端的操作很简单:选中一个文件(这里是 118KB 的 TouchKeyboardThemeLight003.jpg,Windows 自带触摸键盘壁纸),配置参数:

参数 含义
二维码版本 Ver 30 单帧约 900 字节净荷
刷新间隔 200ms 每秒刷新 5 张二维码
纠错级别 H (30%) 允许 30% 码字被遮挡/误读

然后一键运行,屏幕开始快速闪烁——每一帧二维码承载文件的一个分片,连续滚动播放。

为什么叫"光传输"? 屏幕发出的可见光携带着数据编码(黑白模块 = 1/0),摄像头捕捉光信号并解码,整个过程没有任何无线电波参与。


第二步:手机接收端 — 把"闪烁的光"还原成文件

手机端接收二维码

打开 QRCast Android App,选择 “黑白二维码 → 相机扫码”,对准闪烁的 PC 屏幕。

你会在界面上看到实时进度:

  • 已收到 (Received):当前成功解码的分块序号列表(如 5,6,7,8,11...
  • 缺失 (Missing):尚未解码的分块序号(0,1,2,3,4,9,10...
  • 进度百分比:随着更多帧被成功解码,进度条从 0% 走到 100%

接收端不需要知道发送端是什么设备——它只看摄像头里的二维码。解码一个分块就记录一个。即便屏幕有反光、摄像头角度偏了、中间有几帧因为眨眼漏过去了,只要缺失块的重发循环扫到,最终都能补齐。

当所有分块收齐后:

  1. 分块按序号拼装成完整字节流
  2. CRC32 校验,确认数据无损
  3. 弹出 “接收成功!” 对话框,提示保存到本地

此时文件已经完整出现在手机存储中,可以打开预览、分享给其他应用。


这里发生了什么?— 技术参数拆解

文件大小    118KB (Windows 触摸键盘壁纸)
二维码版本  Ver 30, 单帧约 900 字节
总帧数      约 150 帧
刷新率      5 fps (200ms/帧)
理论耗时    150 ÷ 5 = 30 秒
实际耗时    因重传和丢帧,约 40-50 秒

传输介质对比

方式 需要什么 近场速度 配对/握手 跨防火墙
USB / U 盘 物理端口 + U 盘 即插即用
WiFi 直连 同网段或热点 需要配对 可能被挡
蓝牙 蓝牙硬件 + 配对 需要配对
NFC NFC 硬件 + 紧贴 极慢 不需要
QRCast (光) 屏幕 + 摄像头 中等 不需要 不受限制

QRCast 最大的特点不是速度——而是零依赖、零握手

它不要求两台设备在同一网络(事实上根本不需要任何网络),不要求支持蓝牙或 NFC,甚至不需要驱动程序。只要一台设备能显示画面,另一台设备有摄像头,就能传文件。


有了效果,怎么做到的?— 下篇预告

看到这里你可能已经有几个疑问:

  1. 二维码是静态的,怎么传输动态数据? — 答案是把文件切成上千个分块,一帧一帧地"播放"
  2. 摄像头会漏扫,丢了分块怎么办? — 答案是一个带 CRC 校验 + 循环重发的帧协议
  3. 为什么不用彩色二维码? — 彩色能翻倍带宽,但对环境光更敏感。先搞定黑白的,彩色是扩展方向

这些问题的答案,就在下一篇 「原理篇 — 二维码光传输的帧协议设计」 中。我会从字节流分块讲到帧头帧序,再到 CRC 校验和重传策略,把整套协议拆开来讲。


亲自试一下?

项目已经完全开源,PC 端 (Python) 和 Android 端 (Kotlin) 代码都可以直接跑:

GitHub: https://github.com/pisces312/qrcast
Android: https://github.com/pisces312/qrcast-android

环境要求:Python 3.8+(PC 端)、Android SDK 35 + JDK 17(手机端)、一部带摄像头的 Android 手机、一台能显示二维码的屏幕。

几行命令就能复现上面的效果:

# 克隆项目
git clone https://github.com/pisces312/qrcast.git
cd qrcast

# 生成并显示二维码(替换 yourfile.jpg 为你的文件路径)
python -m qrcast.bw.gen_and_display_individual yourfile.jpg \
  --ver 30 --interval 0.2

然后用手机打开 QRCast App,对准屏幕,看文件"飞"过去。


下一篇:【第2篇】原理篇 — 二维码光传输的帧协议设计,敬请期待。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐