애니메이션 연속 QR 코드(“QR 코드 무비”)를 사용하여 물리적으로 격리된 에어갭(Air-gap) 환경 간에 텍스트 및 바이너리 파일을 전송하는 초경량, 의존성 없는 브라우저 기반 송수신 시스템입니다.
QR Code Transceiver는 컴퓨터 모니터와 스마트폰 카메라와 같이 물리적으로 격리된(“에어갭”) 기기 간에 Wi-Fi, 블루투스, 이동통신 또는 물리적 USB 연결 없이도 안전하게 데이터를 전송할 수 있도록 합니다.
Uint8Array)로 자동 변환하고 원본 파일명을 유지하여
브라우저 다운로드를 실행합니다.navigator.mediaDevices.getUserMedia)을 충족하기
위해 Python SSL 서버 및 자체 서명 TLS 증명서를 제공합니다.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
저장소 클론:
git clone https://github.com/your-username/qrcode_transceiver.git
cd qrcode_transceiver로컬 HTTPS 서버 실행:
python3 server.py 8000(참고: python3 server.py 8080과 같이 옵션 인자로
포트 번호를 지정할 수 있습니다)
웹 애플리케이션 접속:
https://localhost:8000/transmitter.html 로 접속합니다.https://<로컬-IP>:8000/receiver.html 로
접속합니다.transmitter.html 페이지를 엽니다.receiver.html 페이지를 엽니다.데이터는 QR 코드로 생성되기 전 JSON 프레임 형태로 청크 분할됩니다.
{
"h": {
"i": 1,
"t": 12,
"f": 1,
"n": "example_document.pdf"
},
"d": "SGVsbG8gV29ybGQh..."
}h) 필드:i (number): 현재 청크 인덱스 (1부터
시작).t (number): 시퀀스의 전체 청크 개수.f (number): 데이터 유형 플래그 (0
= 일반 텍스트, 1 = Base64 인코딩 파일).n (string, optional): 원본 파일명
(f = 1 일 때 포함).d) 필드:d (string): 원본 텍스트 청크 또는 Base64로
인코딩된 바이너리 청크..
├── 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)
본 프로젝트의 주요 기술적 의사결정은 ADR로 문서화되어 있습니다:
navigator.mediaDevices.getUserMedia)을 충족하기 위해
./certs/ 내의 로컬 자체 서명 인증서가 필요합니다.본 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다.