你的旧手机蓝牙坏了、NFC坏了,但摄像头和浏览器还能用?ShadowCat就是为这种场景设计的——一个完全离线的单HTML文件,通过QR码在两台设备之间传输文件。
工作原理
ShadowCat的核心思路很简单:把文件切成小块,每块编码成一个QR码,然后不断循环显示。接收端用摄像头扫描,一块块拼回来。
具体流程:
发送端:选择文件 → 设置分块大小和帧率 → 点击开始 → 屏幕上开始循环显示QR码
接收端:打开摄像头对准发送端 → 自动识别头部信息 → 逐块接收 → 显示进度和缺失块 → 接收完成后验证CRC → 下载文件
协议设计
协议非常简洁:
头部:QRX1|H|总块数|文件名|大小|CRC32
数据:QRX1|D|块索引|Base64数据
Base64编码中不含|字符,所以解析就是简单的split('|')。接收端按索引追踪块,自动去重。
实际传输速度
500字符 × 3帧/秒 ≈ 1.1 KB/s(Base64)≈ 0.83 KB/s(原始数据)。
一个100 KB的文件大约需要2分钟传输。接收端通常需要1-2轮循环就能完整接收。
速度不快,但对于”旧手机上一个重要的备忘录文件”或”一个配置文件”这类场景,完全够用。
实用技巧
摄像头权限问题:浏览器的getUserMedia API需要HTTPS或localhost。直接用file://协议不行。可以用python3 -m http.server 8000启动一个本地服务器,然后通过局域网访问。
iOS Safari:跨设备访问需要HTTPS。局域网环境下可以用Caddy反代或自签名证书。
QR码溢出:如果某个块编码后QR码太大,可以减小分块大小或降低纠错级别。
老设备解码慢:降低帧率、提高纠错级别到Q、把分块缩小到300字符左右。
特色功能
缺失块网格:接收端会显示一个网格,告诉你哪些块还没收到。你可以手动跳到缺失的帧重新扫描。
从指定帧开始:如果传输中断,可以从上次收到的帧继续,不用从头来。
CRC校验:接收完成后自动验证文件完整性。
使用场景
1. 旧手机数据迁移(蓝牙/NFC坏了但摄像头好的情况)
2. 气隙环境(Air-gapped)下的数据传输
3. 跨平台传输(手机到电脑、iOS到Android等)
4. 没有网络环境下的文件分享
获取方式
整个工具就是一个HTML文件,可以从GitHub下载:
git clone https://github.com/unprovable/ShadowCat.git
# 用浏览器打开qrcode.html即可
完全离线运行,不需要任何服务器或网络连接。MIT开源协议。
本文参考来源:ShadowCat GitHub | Hacker News讨论


















暂无评论内容