🎥 JVC Projector Control (iOS)
A modern iOS remote-control app for JVC D-ILA projectors. This project implements the raw TCP control protocol used by models such as the JVC DLA-X5900, handling handshakes, commands, and status queries using POSIX sockets.
Built with SwiftUI, Combine, and a modular architecture with tabs for Start, Log, Settings, and About.
⸻
✨ Features
📡 Core Functionality • Power On / Power Off commands • Full TCP handshake: • Reads PJ_OK greeting • Sends PJREQ • Waits for PJACK • Sends properly-formatted JVC commands (LF / CRLF variants) • Receives and parses Acknowledgement and Detailed Response return codes
🔎 Status Polling • Supports advanced enquiry mode (3F 89 01 50 57 0A) for detailed power states: • 30 → Standby • 31 → Power On • 32 → Cooling • 34 → Emergency • Automatically displays: • Human-friendly status (“Power On”, “Cooling”, etc.) • Raw packet bytes • Hex dumps in the log
🛠 Settings Tab • User-modifiable: • Projector IP address • Projector port • Values persist for the session and update the controller live
📝 Log Tab • Timestamped, scrollable log of: • Packets sent • Responses received • HEX chunks from the socket • Handshake results • Polling activity • Extremely helpful for debugging projector behavior
🎨 iOS-friendly UI • Uses SwiftUI TabView • Metallic projector app icon in light, dark, and tinted variations • Color-coded power state (green/orange/red/gray)
⸻
🧰 Requirements • iOS 16+ • Xcode 15 or newer • A JVC projector supporting the TCP control protocol on port 20554 • Local network access permission enabled in your app
⸻
🚀 Getting Started
-
Clone the repository git clone git@github.com:YOURUSER/YOURREPO.git
-
Open the project
Open JVCProjectorControl.xcodeproj in Xcode.
- Update IP / Port
Go to the Settings tab in the running app and enter your projector’s IP address (usually something like 192.168.x.x).
- Test connectivity
Use: • Poll now • Power On / Off
Watch the Log tab for diagnostics and raw protocol data.
⸻
📡 Supported Projector Models
Tested with: • JVC D-ILA X5900
Should also work (with identical protocol) on: • X7900 / X9900 • RS540 / RS640 • Several other D-ILA models supporting TCP remote control
⸻ 📦 Project Architecture JVCProjectorControl/ │ ├── ProjectorController.swift # All networking, parsing, logging ├── ContentView.swift # TabView layout ├── StartView.swift # Main projector controls ├── LogView.swift # Live socket log ├── SettingsView.swift # IP/port editing └── AboutView.swift # App info
Key design goal: Keep networking logic isolated in ProjectorController, making the UI thin and easy to extend.
⸻
🧪 Troubleshooting
If you see: • No PJ_OK greeting → Projector not reachable or not ready • No PJACK → The projector rejected the handshake • Raw responses like 06 89 01 ... → Basic ACK • Raw responses containing two packets glued together → Expected behavior (continuous mode)
If your projector is cooling down, responses may be delayed or different.
⸻
🤝 Contributing
Contributions are welcome! Ideas include: • Adding input/source switching • Lens control • Picture mode switching • HomeKit or Siri integration • Persistent IP storage using AppStorage / UserDefaults • Widget or Apple Watch remote
⸻
📄 License
MIT — free to use, modify, and distribute.
⸻
💬 Contact
If you have questions, suggestions, or want help adding new JVC commands, feel free to open an issue or reach out.