Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 11 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Plug your laptop into a DSP, camera, switcher, display or control processor, pre

![ProDHCPServer main window in dark mode](docs/images/main-window-dark.png)

> **Status:** Phases 1 (the core DHCP loop) and 2 (ping graphs, session log export, profiles) are done and passed their hardware tests in October 2026. Phase 3 (finding devices) is being built. See [Roadmap](#roadmap).
> **Status:** All three planned phases are done and passed their hardware tests in October 2026: the core DHCP loop, visibility (ping graphs, session log export, profiles) and finding devices (static IP finder, discovery, switch port). The only item not yet tried on real gear is PJLink discovery of projectors. See [Roadmap](#roadmap).

## Why

Expand Down Expand Up @@ -43,22 +43,21 @@ Most AV kit ships set to DHCP, and on a bench or a fresh site there's usually no

![The Profiles panel with the Default preset and links to the manufacturers' documentation](docs/images/profiles-panel-dark.png)

**Phase 3 (in progress)**
**Phase 3: finding devices**

- **Static IP finder.** While the server runs, the **Found on the network** list shows every device heard on the cable that didn't take an address from the server, including ones with a static IP on another subnet. A device shows up as soon as it sends anything (a broadcast, an mDNS or UPnP announcement, a vendor beacon), and with Npcap installed, as soon as it powers up (its ARP check).
- **Reach it.** One click adds a temporary address on the device's subnet to your adapter, so you can open its WebUI without stopping the DHCP server. The address is removed on Stop, on exit and after a crash, like every other change. If Wi-Fi is on that subnet, the app offers to turn it off until Stop.
- **Scan for static IPs.** For quiet devices: ARPs every address on your subnet, the brand presets' factory subnets (192.168.254.x, 192.168.0.x, 192.168.1.x) and any subnet a device was seen on, using a temporary address on each that's removed straight after.
- **Discovery protocols:** mDNS/DNS-SD (including Sennheiser SSC and Dante Domain Manager), SSDP/UPnP (with the device's own name and model), PJLink (projectors and displays), Art-Net (lighting nodes), AES67 stream announcements (SAP), AMX Device Discovery beacons, AMX NetLinx, Q-SYS and Shure discovery. Every query is read-only. Sources are in [docs/vendor-discovery.md](docs/vendor-discovery.md).
- **Discovery protocols:** mDNS/DNS-SD (including Sennheiser SSC and Dante Domain Manager), SSDP/UPnP (with the device's own name and model), PJLink (projectors and displays), Art-Net (lighting nodes), AES67 stream announcements (SAP), AMX Device Discovery beacons, AMX NetLinx, Q-SYS and Shure discovery. Every query is read-only. Sources are in [docs/vendor-discovery.md](docs/vendor-discovery.md). Crestron's own discovery is deliberately left out: Crestron documents that the same unauthenticated channel can change a device's settings, so the app never sends anything to it.
- **Switch port.** With [Npcap](https://npcap.com) installed, shows which managed switch and port you're plugged into, and its VLAN, from LLDP or CDP. Everything else works without Npcap.

**Default profile:** server IP `192.168.100.1/24`, addresses `192.168.100.100` to `192.168.100.199`, 60-minute leases. Make your own profile under **Profiles** (the gear button) to change any of these.

## Download and run

1. Open the [Actions tab](https://github.com/cookingwithsimon/ProDHCPServer/actions/workflows/build.yml), pick the latest green **Build and test** run, and download **ProDHCPServer-win-x64** under Artifacts.
2. Unzip it. You get a single `ProDHCPServer.exe`; there's nothing to install and no .NET runtime needed.
3. Double-click it. Windows asks for administrator rights, because changing adapter settings and serving DHCP require them.
4. The exe isn't code-signed yet, so the first time Windows SmartScreen says "Windows protected your PC". Click **More info**, then **Run anyway**.
1. Open the [latest release](https://github.com/cookingwithsimon/ProDHCPServer/releases/latest) and download the exe under **Assets** (for example `ProDHCPServer-v1.0.0-win-x64.exe`). It's a single file: there's nothing to unzip or install, and no .NET runtime needed.
2. Double-click it. Windows asks for administrator rights, because changing adapter settings and serving DHCP require them.
3. The exe isn't code-signed yet, so the first time Windows SmartScreen says "Windows protected your PC". Click **More info**, then **Run anyway**.

## Using it

Expand Down Expand Up @@ -99,7 +98,7 @@ Each phase ends with a hardware test pass on real AV equipment before the next o

- **Phase 1: core loop** (done, hardware-tested October 2026).
- **Phase 2: visibility** (done, hardware-tested October 2026). Continuous ping with a latency graph per device, a full session log you can filter and export (TXT/CSV), and saved profiles for subnet, pool, lease time and DHCP options (router, DNS, NTP, option 43/66/150 and custom options).
- **Phase 3: discovery** (in progress). Find devices that already have a static IP, reach their subnet in one click, and discover devices via mDNS, SSDP/UPnP, vendor protocols and LLDP/CDP.
- **Phase 3: discovery** (done, hardware-tested October 2026; PJLink not yet tried on a real projector). Find devices that already have a static IP, reach their subnet in one click, and discover devices via mDNS, SSDP/UPnP, vendor protocols and LLDP/CDP.

## Files it writes

Expand All @@ -109,7 +108,7 @@ Each phase ends with a hardware test pass on real AV equipment before the next o
| Your profiles | `%LOCALAPPDATA%\ProDHCPServer\profiles.json` |
| Adapter backup (only while a session runs, or after a crash) | `%ProgramData%\ProDHCPServer\adapter-backup.json` |

While serving, the app also adds a Windows Firewall rule so it can receive DHCP traffic (UDP 67 and 68, for this exe only), and removes the rule on Stop.
While serving, the app also adds two Windows Firewall rules for this exe only: one so it can receive DHCP traffic (UDP 67 and 68), and one on wired adapters so it can hear devices announcing themselves (mDNS, UPnP, vendor discovery). Both are removed on Stop.

## For developers

Expand All @@ -127,14 +126,14 @@ dotnet publish src/ProDHCPServer.App -c Release -r win-x64 -o publish

| Project | What's in it |
|---|---|
| `src/ProDHCPServer.Core` | Platform-independent logic: DHCP packet codec and server engine, adapter backup/restore lifecycle, status rules, manufacturer (OUI) lookup. Fully unit-tested. |
| `src/ProDHCPServer.Windows` | Windows specifics: adapter reading and changes, the UDP 67 socket, ARP entries, firewall rule, other-server probe, ping and port checks. |
| `src/ProDHCPServer.Core` | Platform-independent logic: DHCP packet codec and server engine, adapter backup/restore lifecycle, status rules, manufacturer (OUI) lookup, discovery packet parsing and subnet planning. Fully unit-tested. |
| `src/ProDHCPServer.Windows` | Windows specifics: adapter reading and changes, the UDP 67 socket, ARP entries and scans, firewall rules, other-server probe, ping and port checks, discovery sockets, and the optional Npcap capture for LLDP/CDP. |
| `src/ProDHCPServer.App` | The WPF app: UI, elevation prompt, crash handling. |
| `tests/` | Core unit tests (run anywhere) and Windows integration tests (run on the Windows CI runner and never change adapter settings). |
| `docs/` | Hardware test checklists for each phase, the sources for the discovery protocols (`vendor-discovery.md`), and the screenshots used in this README (taken by the CI smoke test). |
| `tools/` | CI smoke test (launches the app and takes screenshots) and the manufacturer list updater (`python3 tools/update-oui.py`). |

**CI.** Every push and pull request runs the **Build and test** workflow on Windows: build, Core and Windows tests, publish the exe, and a smoke test that screenshots the app in light and dark mode. The exe and screenshots are uploaded as run artifacts.
**CI.** Every push and pull request runs the **Build and test** workflow on Windows: build, Core and Windows tests, publish the exe, and a smoke test that screenshots the app in light and dark mode. The exe and screenshots are uploaded as run artifacts, so you can try a build from any branch before it's released.

**Contributing.** Work happens on branches with pull requests into `main`. See [CLAUDE.md](CLAUDE.md) for the project rules (they apply to people too), and use the PR template's checklist. Formatting follows `.editorconfig`; check it with `dotnet format whitespace ProDHCPServer.sln --verify-no-changes`.

Expand Down
5 changes: 4 additions & 1 deletion docs/hardware-test-phase3.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ About 30 minutes. You need:
- One device you can set to a **static IP on a different subnet**. For example, set the NAV SD to 192.168.1.50 /24 in its web page, or use anything still on a factory static address such as an Extron switcher at 192.168.254.254.
- A managed switch with LLDP or CDP turned on, if you have one, for section 5.

Download `ProDHCPServer.exe` from the latest successful **Build and test** run on the Phase 3 pull request (Actions tab → run → Artifacts → `ProDHCPServer-win-x64`). Click **More info → Run anyway** on the SmartScreen warning.
Download `ProDHCPServer.exe` from the latest successful **Build and test** run on `main` (Actions tab → run → Artifacts → `ProDHCPServer-win-x64`). Click **More info → Run anyway** on the SmartScreen warning.

Tick each box. If something fails, use **Export log…** and send me the file.

Expand Down Expand Up @@ -54,3 +54,6 @@ Only if you're happy to install [Npcap](https://npcap.com/#download) on the test
## 6. Phases 1 and 2 still work

- [ ] Quick repeat: one device straight on the cable, Start, lease, ping graph and WebUI green, **Open WebUI**, **Export log…**, Stop, adapter back to its original settings.

## Results
Passed 2026-10-16, every item except the PJLink one in section 4, which wasn't tried because no PJLink projector or display was on hand. Run that item the next time one is available.
Loading