Wire protokol · v1

QR kodların gerçekten ne taşıdığı.

Son güncelleme: 2026-05-01

transfqr tek-yönlü bir protokol: gönderici ekranı QR kareleri yanıp söner; alıcı kamerası yakalayabildiklerini toplar. Geri-kanal yok — Bluetooth handshake yok, WebRTC negotiation yok, geri yönde acknowledgement yok. İşi yürüten numara fountain kodlama. Alınan K + ε kare dosyayı yeniden kurar, hangilerini kaçırdığın fark etmez.

Hedefler

Frame zarfı (18-bayt başlık)

Her QR kod bir frame taşır. Frame ikili bir blob, base45 ile (RFC 9285) encode ediliyor — bu sayede QR encoder yoğun alphanumeric modu seçiyor; byte-mode base64 alternatifine göre QR başına ~%60 daha fazla bayt taşıyor. Tüm tamsayılar little-endian.

BaytAlanTipNotlar
0..1magicu160x5451 ('TQ')
2versionu8şu an 1
3packetTypeu80x01 = meta, 0x02 = data
4..7fileIdu32oturum başına rastgele; uyumsuz olunca alıcı atar
8..11totalChunksu32K = kaynak blok sayısı
12..13blockSizeu16kaynak blok başına bayt
14..17seedu32LT PRNG seed (sadece data; meta 0'a set eder)
18..payloadtipe özel

Paket türleri

Meta (0x01)

Gönderici tarafından periyodik olarak (her 10'uncu kare) yollanır ki akışın ortasında katılan alıcı bootstrap yapabilsin. Meta paketi şunu taşır:

fileNameLen   u8
fileName      utf-8 bytes
mimeLen       u8
mimeType      utf-8 bytes
originalSize  u64       (8 bytes LE)
sha256        32 bytes  (post-decompression checksum)
flags         u8        (bit 0 = compressed)

Data (0x02)

LT-encoded data sembolü. Payload tam olarak blockSize bayt. Başlıktaki seed alıcıya hangi kaynak blokların XOR'lanarak bu sembolün üretildiğini söyler. Aynı seed → iki tarafta aynı kombinasyon; LT degree dağılımı belief propagation'ı mümkün kılar.

Gönderici döngüsü

  1. Boyut threshold üstüyse kaynak baytları sıkıştır (pako üzerinden DEFLATE).
  2. Sıkıştırılmış (sıfır pad'lenmiş) payload'un SHA-256'sını hesapla.
  3. blockSize'lık K bloğa böl.
  4. Bu K blok üzerinde bir LT (Luby Transform) encoder kur.
  5. Sonsuz döngü: her 10'uncu tick'te meta paket çiz; aksi halde taze rastgele seed seç, bir LT sembol encode et, çıkan baytları QR olarak çiz.
  6. Kullanıcı iptal edince dur.

Alıcı döngüsü

  1. Kamerayı aç, sürekli QR tara.
  2. Decode edilen her frame için: magic + version doğrula, gördüğün ilk fileId'ye kilitlen, farklı olanları at.
  3. Meta ise ve henüz meta görmediysen: fileName, mime, size, sha256, flags sakla. Data ise: (seed, payload)'ı LT decoder'a besle.
  4. İlerlemeyi recovered / K olarak takip et.
  5. Decoder tamamlanınca: yeniden kur, SHA-256'yı doğrula, compressed flag set ise aç, dosyayı OS'a teslim et (kaydet / paylaş).

QR çizimi

Frame'ler error correction level L (~%7 redundancy) ile çiziliyor — fountain kodu zaten devasa uçtan-uca redundancy sağlıyor, QR'a daha fazla ECC bit'i harcamak per-frame payload'u küçültmekten başka işe yaramıyor. Quiet zone: 1 modül. Gönderici tempo: ~12-13 frame/saniye (80ms tick); alıcı kamera bazılarını kaçırır, fountain kodu kurtarır.

Bu protokol şunlar değil

Yol haritası

Bir fikrin mi var ya da bir hata mı buldun? protocol@transfqr.com.