ShadowCat:用QR码在设备间传文件,老手机没有蓝牙也能用

你的旧手机蓝牙坏了、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讨论

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容