Skip to content

Repository files navigation

Vloom

光だけでファイルを渡す。 ネットワークもペアリングも要らない。

片方の画面にコードの動画ループを表示し、もう片方のカメラで撮り続けるだけで、通信経路を 一切介さずにファイルが渡ります。Wi-Fi も Bluetooth も、相手の連絡先も不要です。

試す

方法 対象 備考
Web で開く どの端末でも インストール不要。まずここから
Releases の APK Android ネイティブの方が高速。カメラ制御が細かい
ソースからビルド iOS Mac + Xcode が必要 (後述)

仕組み

ペイロードを Rust の Fountain code (RaptorQ) でパケット列に符号化し、各パケットをコードとして 循環表示します。受信側は十分なパケットが集まった時点で復元するので、1 枚も取りこぼさずに 撮る必要がありません。フレーム落ち・手ブレ・位置ズレに強く、送受信の fps を合わせる必要も ありません。一方向の光チャネルは再送要求ができないため、順送り方式では 1 枚落とすたびに一巡 待つことになりますが、Fountain code はこれを構造的に解決します。

コード形式は 2 系統。

QR — 標準形式。既存のデコーダが使え、どの端末でも動きます。

vcode — 独自の輝度ブロック格子。QR のファインダ・アライメント・フォーマット情報・EC 領域を 持たず、格子全体をデータに使い、1 セルに 2bit を載せます。

セル数 データ量 効率
QR v40 / EC=L 177×177 = 31,329 2,953 B 0.75 bit/セル
vcode 9×8 / 2bit 180×172 = 30,960 6,624 B 1.71 bit/セル

ほぼ同じセル数で 2.27 倍の情報量です。この差は QR の構造に由来するので、QR を使う限り 埋まりません。加えて vcode はブロック単位の CRC で部分回収ができ、フレームの一部が潰れても 読めたブロックだけを回収します。

実測は QR 経路で 200KB を約 45 秒 (4.4 KB/s)。vcode は理論値のみで実機計測はこれからです (9×8 / 30fps で理論 194 KB/s)。

使い方

送信側の画面いっぱいにコードを表示し、受信側のカメラを向けます。受信側のガイド枠にコードを 収めるのがコツです。送信側の画面輝度は最大にしてください。

vcode は格子 (5×4 / 7×6 / 9×8 / 11×10) と階調 (1bit / 2bit)、fps を選べます。密な格子ほど速い 代わりに高いカメラ解像度が要ります。6 px/セル が安定の目安で、4 px を切ると輝度 4 値はまず 復号できません。受信画面に実測の px/セルが出るので、それを見て調整してください。

1 フレームはディスプレイの 2 リフレッシュ周期以上表示する必要があります。60Hz 画面なら 30fps、 120Hz 画面なら 60fps が上限の目安です。

開発

必要環境

  • Rust (stable) + wasm-packcargo install wasm-pack
  • Flutter 3.41+ — ネイティブアプリをビルドする場合
  • Python 3.10+ — 開発用 HTTPS サーバと QR ベンチ

ビルドとテスト

cargo test --workspace          # Rust コア (fountain / vcode スキャナ)

cd core-wasm                    # PWA 用の WASM
wasm-pack build --target web --release --out-dir ../web/pwa/pkg

cd app                          # ネイティブアプリ
flutter pub get
flutter build apk --release     # Android

web/pwa/pkg/ は git 管理外なので、クローン直後は必ず WASM ビルドが要ります。

PWA を実機で試す

カメラ API (getUserMedia) は HTTPS または localhost でしか動きません。スマホから開くには HTTPS が 必要なので、自己署名証明書付きの開発サーバーを同梱しています。

pip install cryptography
python web/pwa/serve_https.py

PC とスマホを同じ Wi-Fi に繋ぎ、表示された https://<PC の IP>:8443/ を開きます。証明書警告は 「詳細設定 → アクセスする」で許容してください。開発専用です。

iOS について

iOS 版のバイナリは配布していません。署名なしの IPA は受け取った側での再署名が必要で、無料 アカウントでは 7 日で失効するためです。Mac があれば自分でビルドできます。

cd app
open ios/Runner.xcworkspace

Signing & Capabilities で自分の Apple ID (Personal Team) を選び、Bundle Identifier を固有値に 変更してから Run してください。Rust の iOS ターゲットが必要です (rustup target add aarch64-apple-ios)。無料アカウントは 7 日で失効するため、常用なら PWA を お勧めします。

ディレクトリ構成

fountain/    RaptorQ ラッパー (Fountain Encoder/Decoder)。符号化の中核
vcode/       独自コード形式のエンコーダとスキャナ (ホモグラフィ推定・部分回収)
core-wasm/   Fountain + vcode を wasm-bindgen でブラウザへ公開
app/         Flutter アプリ (送受信兼用)。Rust を FFI ブリッジで共有
web/pwa/     ブラウザ版 + 開発用 HTTPS サーバ
qr_bench/    QR 検出率ベンチ (Python / pyzbar)
docs/        形式仕様と関連研究の調査

Rust コアは WASM と FFI の両方から使うので、ブラウザ版・ネイティブ版・送受信で符号化/復号の 実装が分岐しません。

ライセンス

MIT

About

光だけでファイルを渡す。ネットワークもペアリングも不要な画面→カメラのファイル転送 (Fountain code + 独自コード形式)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages