【第1篇】无光缆、无网线、无 WiFi、无蓝牙,我用“光“把文件传到了手机里
曾经有个奇怪的想法:电脑和手机明明近在咫尺、屏幕对着摄像头,为什么要绕一大圈走 U 盘、WiFi 或蓝牙才能传文件?能不能直接用屏幕发出的光把数据"照"过去?
没有实际需求,纯粹因为好玩——于是在Claude Code/Workbuddy(免费积分)/QClaw(免费积分)的共同帮助下做了这个实现。
下面两个 GIF 就是成品: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%
接收端不需要知道发送端是什么设备——它只看摄像头里的二维码。解码一个分块就记录一个。即便屏幕有反光、摄像头角度偏了、中间有几帧因为眨眼漏过去了,只要缺失块的重发循环扫到,最终都能补齐。
当所有分块收齐后:
- 分块按序号拼装成完整字节流
- CRC32 校验,确认数据无损
- 弹出 “接收成功!” 对话框,提示保存到本地
此时文件已经完整出现在手机存储中,可以打开预览、分享给其他应用。
这里发生了什么?— 技术参数拆解
文件大小 118KB (Windows 触摸键盘壁纸)
二维码版本 Ver 30, 单帧约 900 字节
总帧数 约 150 帧
刷新率 5 fps (200ms/帧)
理论耗时 150 ÷ 5 = 30 秒
实际耗时 因重传和丢帧,约 40-50 秒
传输介质对比
| 方式 | 需要什么 | 近场速度 | 配对/握手 | 跨防火墙 |
|---|---|---|---|---|
| USB / U 盘 | 物理端口 + U 盘 | 快 | 即插即用 | — |
| WiFi 直连 | 同网段或热点 | 快 | 需要配对 | 可能被挡 |
| 蓝牙 | 蓝牙硬件 + 配对 | 慢 | 需要配对 | — |
| NFC | NFC 硬件 + 紧贴 | 极慢 | 不需要 | — |
| QRCast (光) | 屏幕 + 摄像头 | 中等 | 不需要 | 不受限制 |
QRCast 最大的特点不是速度——而是零依赖、零握手。
它不要求两台设备在同一网络(事实上根本不需要任何网络),不要求支持蓝牙或 NFC,甚至不需要驱动程序。只要一台设备能显示画面,另一台设备有摄像头,就能传文件。
有了效果,怎么做到的?— 下篇预告
看到这里你可能已经有几个疑问:
- 二维码是静态的,怎么传输动态数据? — 答案是把文件切成上千个分块,一帧一帧地"播放"
- 摄像头会漏扫,丢了分块怎么办? — 答案是一个带 CRC 校验 + 循环重发的帧协议
- 为什么不用彩色二维码? — 彩色能翻倍带宽,但对环境光更敏感。先搞定黑白的,彩色是扩展方向
这些问题的答案,就在下一篇 「原理篇 — 二维码光传输的帧协议设计」 中。我会从字节流分块讲到帧头帧序,再到 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篇】原理篇 — 二维码光传输的帧协议设计,敬请期待。
更多推荐




所有评论(0)