Decimen Optical Transfer: QR-файлы по свету

источник ↗ ·

Браузерный PoC передачи файлов через экран и камеру с fountain-кодами без сети и приложений.

privacy

Эта заметка участвует в semantic memory.

AI Summary

🚀 TL;DR

Decimen Optical Transfer — минималистичный proof-of-concept, позволяющий передавать файлы (512 КБ или 2 МБ) между устройствами исключительно через экран и камеру с помощью fountain-кодов и QR-кодов. Скорость до 129 КБ/с, без сети, приложений и ручного сопряжения.

📖 Что это такое

Проект реализует односторонний оптический канал: отправитель отображает файл как бесконечный поток анимированных QR-кодов, получатель снимает их камерой и восстанавливает файл. Используется Luby Transform (LT) coding с robust-soliton distribution, что делает передачу устойчивой к потерям кадров.

🔑 Ключевые факты

  • Передача 512 КБ или 2 МБ изображения
  • Скорость ~129 КБ/с (handheld), до 186 КБ/с (propped)
  • Нет handshake, receiver подхватывает поток mid-flight
  • Каждый кадр имеет 20-байтный заголовок (session id, seq, block count/size, hash)
  • Fountain-коды: получатель собирает ~K·1.15 кадров в любом порядке
  • QR-коды версии v27 (1465 байт) или v40 (2953 байт)
  • Декодирование через zxing-cpp → WASM
  • Safari: BarcodeDetector отсутствует (WebKit bug 281848)

⚙️ Как это работает

  1. Отправитель: файл разбивается на блоки; каждый кадр — XOR псевдослучайного подмножества блоков (deterministic из seq).
  2. Получатель: собирает кадры, применяет LT-peeling, восстанавливает файл.
  3. Нет необходимости в retransmission — потерянные кадры просто игнорируются.
  4. Настройки: tx fps (24), bytes/frame, ECC level (L), capture width/fps, worker count.
  5. HTTPS обязателен для getUserMedia; dev-сервер использует self-signed сертификат.

💡 Вывод и значение

Проект демонстрирует практическую передачу данных по оптическому каналу без инфраструктуры. Fountain-коды решают проблему отсутствия обратного канала и потерь кадров. Подходит для air-gapped сценариев, обмена данными между устройствами без Bluetooth/Wi-Fi/NFC.

📌 Важные детали

  • JS-движки по-разному реализуют Math.log — используется детерминированный IEEE-754 логарифм
  • iOS: frameRate: {exact: 60} обязателен, иначе камера даёт 30 fps
  • requestVideoFrameCallback требует generation counter, иначе утечка zombie capture loop
  • Прогресс измеряется по собранным кадрам, а не по решённым блокам (LT-peeling back-loads)
  • QR ECC level L — оптимальный компромисс между плотностью и надёжностью

Автор: bashalarmistalt (https://github.com/bashalarmistalt/decimen-optical-transfer)

Мои мысли

graph

Карта связей