[WARNING] Deprecated: --highlight-style. Use --syntax-highlighting instead.

QR Code Transceiver (광학 에어갭 데이터 전송 시스템)

English | 한국어

애니메이션 연속 QR 코드(“QR 코드 무비”)를 사용하여 물리적으로 격리된 에어갭(Air-gap) 환경 간에 텍스트 및 바이너리 파일을 전송하는 초경량, 의존성 없는 브라우저 기반 송수신 시스템입니다.

License: MIT Python 3.x WebRTC / HTTPS


📌 개요 (Overview)

QR Code Transceiver는 컴퓨터 모니터와 스마트폰 카메라와 같이 물리적으로 격리된(“에어갭”) 기기 간에 Wi-Fi, 블루투스, 이동통신 또는 물리적 USB 연결 없이도 안전하게 데이터를 전송할 수 있도록 합니다.

주요 기능


🏗️ 시스템 아키텍처 (System Architecture)

flowchart TD
    subgraph Transmitter ["송신기 (화면 Display)"]
        A[텍스트 / 파일 입력] --> B[Base64 인코딩 및 페이로드 청크 분할]
        B --> C[JSON 패킷 프레임 생성]
        C --> D[QR 코드 애니메이션 스트림 출력]
    end

    subgraph Receiver ["수신기 (카메라 Camera)"]
        E[카메라 비디오 스트림] --> F[실시간 프레임 스캐너]
        F --> G[JSON 헤더 및 데이터 청크 파싱]
        G --> H[시각적 진행 그리드에 청크 기록]
        H -->|모든 청크 수신 완료| I[전체 데이터 재조립]
        I -->|텍스트| J[텍스트 UI 출력]
        I -->|바이너리 파일| K[Base64 디코딩 및 파일 다운로드]
    end

    Transmitter -- "광학 에어갭 (화면 -> 카메라)" --> Receiver

🚀 시작하기 (Getting Started)

사전 요구사항

빠른 실행 (Quick Start)

  1. 저장소 클론:

    git clone https://github.com/your-username/qrcode_transceiver.git
    cd qrcode_transceiver
  2. 로컬 HTTPS 서버 실행:

    python3 server.py 8000

    (참고: python3 server.py 8080과 같이 옵션 인자로 포트 번호를 지정할 수 있습니다)

  3. 웹 애플리케이션 접속:


📖 사용 가이드 (Usage Guide)

데이터 송신 (Transmitter)

  1. transmitter.html 페이지를 엽니다.
  2. Text Data 입력란에 텍스트를 입력하거나 Upload a File을 통해 바이너리 파일을 업로드합니다.
  3. 필요에 따라 QR 코드 설정을 조정합니다:
  4. Generate Movie 버튼을 클릭합니다.
  5. Speed (FPS) 슬라이더를 사용하여 재생 속도를 조절합니다(기본값: 5 FPS). 필요시 Play/Pause나 프레임 이동 컨트롤을 활용합니다.
  6. (선택사항) ✨ Summarize & Generate 버튼을 눌러 Gemini AI로 텍스트를 요약한 후 QR 코드를 생성할 수 있습니다.

데이터 수신 (Receiver)

  1. receiver.html 페이지를 엽니다.
  2. 사용할 카메라(후면 또는 전면)를 선택하고 Scan Rate 슬라이더(초당 1~60회)를 조정합니다.
  3. Start Camera 버튼을 누르고 프롬프트가 뜨면 카메라 접근 권한을 허용합니다.
  4. 송신기 화면의 애니메이션 QR 코드를 향해 카메라를 비춥니다.
  5. 청크가 수신됨에 따라 시각적 진행 그리드가 실시간으로 업데이트됩니다.
  6. 청크가 100% 수집되면 페이로드가 자동으로 재조립되어 화면에 표시되거나 파일로 다운로드됩니다.

📡 프로토콜 및 패킷 포맷 (Protocol & Packet Format)

데이터는 QR 코드로 생성되기 전 JSON 프레임 형태로 청크 분할됩니다.

프레임 패킷 구조

{
  "h": {
    "i": 1,
    "t": 12,
    "f": 1,
    "n": "example_document.pdf"
  },
  "d": "SGVsbG8gV29ybGQh..."
}

헤더 (h) 필드:

데이터 (d) 필드:


📁 저장소 구조 (Repository Structure)

.
├── server.py             # SSL 래퍼가 포함된 간이 Python HTTPS 서버
├── transmitter.html      # HTML/JS 송신기 UI 및 QR 코드 생성기
├── receiver.html         # HTML/JS 수신기 UI 및 실시간 카메라 스캐너
├── easy.qrcode.min.js    # 동적 QR 코드 렌더링용 로컬 JS 라이브러리
├── certs/
│   ├── cert.pem          # 자체 서명 TLS 인증서
│   └── key.pem           # TLS 개인키
└── docs/
    └── adr/              # 아키텍처 결정 기록 (ADR)

📑 아키텍처 결정 기록 (ADRs)

본 프로젝트의 주요 기술적 의사결정은 ADR로 문서화되어 있습니다:


🔒 보안 및 성능 고려사항 (Security & Performance)


📄 라이선스 (License)

본 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다.