ShadowCat v1:无需网络与USB,用摄像头实现跨设备离线文件直传
你有没有遇到过这种抓狂的场景?
- 两台电脑都没连 WiFi,也没有 U 盘,急着传个配置文件过去。
- 手机没装某个 App,电脑也没登录网盘,照片就是倒腾不过去。
- 身处内网或完全离线的环境,却必须把文档从 A 设备送到 B 设备。
大多数人这时候只能去找数据线,或者临时开个热点传微信。但如果这些都用不了呢?
今天给大家介绍一个有点“黑科技”味道的方案 —— ShadowCat v1。它不需要网络、不需要蓝牙、不需要 USB 线,甚至不需要安装任何 App。只要两台设备都有浏览器和摄像头,就能通过“光信号”把文件传过去。
它到底怎么做到的?
ShadowCat 的核心思路非常直接:把文件变成一连串快速变化的图像,让屏幕来“发光”,让摄像头来“读光”。
你可以把它理解成“加强版活码”或者“现代传真机”:
- 发送端把文件切割、编码,生成一连串特殊的动态图案(类似超高频 QR 码)。
- 这些图案在发送设备的屏幕上以极快的速度闪烁。
- 接收端用摄像头对准屏幕,捕捉这些图案并实时解码。
- 解码完成后,文件就在本地重建了。
整个过程完全在浏览器里完成,收发双方都只是打开一个网页而已。
具体怎么用?四步走
- 打开发送端:在发送设备(电脑或手机)的浏览器里打开 ShadowCat 页面,选择你要发送的文件(建议几 MB 以内的小文件)。
- 开始编码:网页会自动把文件转换成高速闪烁的图像帧,你的屏幕会变成“发光源”。
- 打开接收端:在接收设备上也打开同样的 ShadowCat 页面,切换到接收模式,把摄像头对准发送端的屏幕。
- 自动重建:接收端识别到光信号后,会自动解码并在本地把文件拼好,直接下载保存。
就这么简单。不需要配对,不需要登录,也不需要关心双方是什么系统。
代码长什么样?
下面是一段发送端的伪代码,帮你理解它的核心逻辑:
// Sender side (pseudocode for illustration) —— 发送端逻辑示例(伪代码)
const file = await selectFile(); // 让用户选择本地文件
const encodedFrames = await ShadowCat.encode(file); // 将文件编码成一系列图像帧
for (const frame of encodedFrames) {
displayFrameOnScreen(frame); // 在屏幕上显示当前这一帧图像
await delay(200); // 每帧显示 200 毫秒,实际使用时可根据摄像头帧率调整
}
你看,逻辑非常干净:选文件 -> 编码成帧 -> 逐帧显示。接收端则是反过来:逐帧捕获 -> 解码 -> 合并成文件。
为什么开发者应该关注?
ShadowCat 并不是为了替代微信或网盘而生的,它在下面这些场景里简直是救命稻草:
- 物理隔离环境:内网机、工控机、涉密设备,根本不允许联网。ShadowCat 只需要视线可见,完美适配“气隙环境”(Air-Gapped)。
- 跨平台救急:Linux 笔记本要给 iPhone 传个配置文件?没有隔空投送、没有蓝牙配对,打开浏览器就能传。
- 零依赖部署:整个工具是单页面应用,随便丢到任何一个能跑浏览器的设备上就能用,非常适合应急脚本包或运维工具箱。
- 天然防窃听:没有网络流量,就不存在网络嗅探。只要保证物理上只有接收方的摄像头能看到屏幕,数据就不会被中间人截获。
它的局限你要知道
当然,这项技术也不是万能的,使用前得先管理好自己的预期:
- 速度有限:受摄像头帧率和图像识别效率限制,传输速度大概在每秒 100 KB 左右。传个大视频会很痛苦,但传文档、图片、配置文件完全没问题。
- 文件别太大:官方建议控制在几 MB 以内。太大的文件会导致传输时间过长,容错率也会下降。
- 需要一定光线和对焦:环境太暗、摄像头太差、或者屏幕反光严重,都可能影响识别成功率。
总结
ShadowCat v1 提供了一种非常优雅的“兜底方案”:当网络、蓝牙、USB 全部失效时,我们还有光。
它用最底层的屏幕加摄像头做数据链路,把复杂的跨设备传输问题,简化成了“你闪、我看”的动作。对于开发者来说,无论是临时应急、离线运维,还是研究光学传输的玩法,这个工具都值得放进收藏夹。
