7627c17653
Restores the helper accidentally removed when adding access-denied handling, retries I/O after seeding pyusb config index on Windows, and handles USB overflow reads without crashing the HELLO loop. Co-authored-by: Cursor <cursoragent@cursor.com>
161 lines
4.9 KiB
Markdown
161 lines
4.9 KiB
Markdown
# JUC500 File Transfer (Apple Silicon ↔ Windows 11)
|
|
|
|
j5create **JUC500** USB 3.0 Wormhole 케이블로 **Apple Silicon Mac**과 **Windows 11** 사이 파일을 직접 전송하는 오픈 구현입니다.
|
|
|
|
## 왜 공식 앱이 Silicon Mac에서 안 되나
|
|
|
|
실측/분석 결과:
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| USB ID | `0711:7500` / Product: **Smart Data Link** |
|
|
| 가상 CD | `WORMHOLE` (FAT12, 공식 설치본 포함) |
|
|
| 번들/공식 Mac 앱 (2024, v1.0.1463.47) | **x86_64 전용**, Apple Silicon 네이티브 **arm64 없음** |
|
|
| USB 스택 | deprecated `IOUSBDevice` API (`kIOUSBDeviceInterfaceID500`) |
|
|
| 핵심 라이브러리 | KaiJet / OTi `OTiTransfer.framework` — bounding·alive·XML UPipe |
|
|
|
|
Intel Mac에서는 Rosetta 없이(구버전) 또는 Rosetta로 동작할 수 있으나, Apple Silicon + 최신 macOS에서는 공식 Wormhole 경로가 깨집니다. 이 프로젝트는 **libusb로 Vendor/CDC 인터페이스를 직접 열고**, 자체 프레임 프로토콜로 파일을 보냅니다.
|
|
|
|
공식 Windows Wormhole과 호환되지 않습니다. **양쪽 모두 이 프로그램을 실행**해야 합니다.
|
|
|
|
## 장치 인터페이스 (요약)
|
|
|
|
```
|
|
IF0 CDC Comm INT 0x81
|
|
IF1 CDC Data BULK 0x02 / 0x83
|
|
IF2 Mass Storage WORMHOLE CD (OS 점유 — 건드리지 않음)
|
|
IF3 HID mouse (KM — OS 점유)
|
|
IF4 HID keyboard (KM — OS 점유)
|
|
IF5 Vendor BULK 0x08/0x89 (데이터) + 0x0A/0x8B (keepalive)
|
|
```
|
|
|
|
## 요구 사항
|
|
|
|
### macOS (Apple Silicon)
|
|
|
|
- Python 3.10+
|
|
- libusb: `brew install libusb`
|
|
- (선택) 공식 Wormhole 앱이 떠 있으면 종료
|
|
|
|
```bash
|
|
cd /path/to/juc500
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -r requirements.txt
|
|
python -m juc500_xfer info
|
|
```
|
|
|
|
### Windows 11
|
|
|
|
1. Python 3.10+ 설치
|
|
2. [libusb](https://libusb.info/) 또는 이 저장소 `vendor/libusb-1.0.dll` 을 PATH/`vendor/` 에 배치
|
|
3. **Zadig**로 `Smart Data Link` 복합 장치의
|
|
- **Interface 5** (Vendor Specific)
|
|
- **Interface 1** (CDC Data, 권장)
|
|
에 **WinUSB** 드라이버 설치
|
|
4. 공식 j5create Wormhole / 자동실행 소프트웨어는 **종료·제거** (같은 인터페이스를 점유함)
|
|
|
|
```powershell
|
|
cd juc500
|
|
py -3 -m venv .venv
|
|
.\.venv\Scripts\Activate.ps1
|
|
# vendor\wheels\pyusb-*.whl 사용 (PyPI 불필요)
|
|
python -m pip install --no-index --find-links=vendor\wheels -r requirements.txt
|
|
pip install -e .
|
|
python -m juc500_xfer info
|
|
```
|
|
|
|
또는 `scripts\setup_windows.bat` 실행.
|
|
|
|
**장치가 안 보이면:**
|
|
|
|
```powershell
|
|
# libusb DLL 복사 (필수)
|
|
copy vendor\libusb-1.0.dll .venv\Scripts\libusb-1.0.dll
|
|
python -m juc500_xfer doctor
|
|
```
|
|
|
|
Zadig로 **Interface 5 (MI_05)** 에 WinUSB 설치 여부를 확인하세요.
|
|
케이블 가상 CD의 공식 **Wormhole**가 IF5를 점유하면 Access denied가 납니다.
|
|
GUI **Wormhole 종료** 버튼 또는 `python -m juc500_xfer kill-wormhole` 로 종료할 수 있습니다 (연결·실행 시에도 자동 종료).
|
|
|
|
## 사용법
|
|
|
|
### GUI (권장)
|
|
|
|
```bash
|
|
# 최초 1회
|
|
./scripts/setup_macos.sh
|
|
|
|
# 이후
|
|
./start.sh
|
|
```
|
|
|
|
인자를 넘기면 CLI로 동작합니다: `./start.sh doctor`, `./start.sh kill-wormhole` 등.
|
|
|
|
양쪽 PC에 케이블을 꽂고, **먼저 수신 쪽**, 이어서 송신 쪽을 실행합니다.
|
|
|
|
**Windows (수신 예)**
|
|
|
|
```powershell
|
|
python -m juc500_xfer recv --dest Downloads -y
|
|
```
|
|
|
|
**Mac (송신 예)**
|
|
|
|
```bash
|
|
python -m juc500_xfer send ~/Desktop/archive.zip
|
|
# 또는
|
|
./start.sh send ~/Desktop/archive.zip
|
|
```
|
|
|
|
## Windows 설치파일
|
|
|
|
산출물:
|
|
|
|
| 파일 | 용도 |
|
|
|------|------|
|
|
| `JUC500-Setup-win64.exe` | Inno Setup 설치 프로그램 |
|
|
| `JUC500-portable.exe` | 단일 실행 포터블 EXE |
|
|
| `JUC500-win64-portable.zip` | 폴더형 포터블 (+ `setup.bat`) |
|
|
|
|
**Mac(Apple Silicon)에서 빌드:**
|
|
|
|
```bash
|
|
./build-installer-windows.sh --ci
|
|
# → dist-windows/ 에 위 파일 다운로드 (GitHub Actions)
|
|
```
|
|
|
|
**Windows PC에서 빌드:**
|
|
|
|
```bat
|
|
build-installer-windows.bat
|
|
```
|
|
|
|
(Inno Setup 6 필요 시 Setup.exe 생성. 없어도 portable exe/zip 은 생성됩니다.)
|
|
|
|
사용 전 Win11에서 Zadig WinUSB 설정이 필요합니다 (`docs/WINDOWS.md`).
|
|
|
|
## GUI
|
|
|
|
fileShare와 동일한 **듀얼 패널(이 PC | 전송 | 상대 PC)** 웹 UI입니다.
|
|
|
|
```bash
|
|
python -m juc500_xfer gui
|
|
# → http://127.0.0.1:8765/
|
|
```
|
|
|
|
양쪽 PC에서 GUI를 실행한 뒤 **연결**을 누르세요. (입력공유는 미지원, UI만 동일 구조)
|
|
|
|
Windows 설치본은 `JUC500.exe` / `JUC500-portable.exe` 더블클릭으로 동일 GUI가 열립니다.
|
|
|
|
## 프로토콜
|
|
|
|
Vendor BULK(`0x08`/`0x89`) 위에 길이·CRC 프레임(`J5FX` 매직)을 올리고 `HELLO` 핸드셰이크로 연결을 만듭니다. 보조 파이프(`0x0A`/`0x8B`)로 keepalive를내어 링크를 유지합니다. 파일은 SHA-256으로 무결성을 검증합니다.
|
|
|
|
공식 OTi XML / bounding 프로토콜은 재구현하지 않았습니다.
|
|
|
|
## 분석 메모
|
|
|
|
자세한 USB·바이너리 분석은 [`docs/ANALYSIS.md`](docs/ANALYSIS.md) 를 참고하세요.
|