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
17 changes: 13 additions & 4 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 (discovery) is next. See [Roadmap](#roadmap).
> **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).

## Why

Expand Down Expand Up @@ -43,6 +43,14 @@ 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)**

- **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).
- **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
Expand All @@ -67,7 +75,8 @@ Most AV kit ships set to DHCP, and on a bench or a fresh site there's usually no
|---|---|
| Red banner: another DHCP server is on the link | You're plugged into a network that already hands out addresses (office, venue, home router). Unplug from it, or only use **Serve anyway** on a network you own. |
| Step 2 red, "No link" | No cable, a dead port, or the device is off. Steps 2 to 4 recover by themselves when the link comes up. |
| Step 5 amber, no DHCP requests after 30 seconds | The device probably has a static IP or DHCP turned off. |
| Step 5 amber, no DHCP requests after 30 seconds | The device probably has a static IP or DHCP turned off. Look under **Found on the network**, or press **Scan for static IPs**, then **Reach it**. |
| A device isn't found | Some devices stay silent until spoken to. Press **Scan for static IPs**. If it's on a subnet the scan doesn't cover, power-cycle it with Npcap installed: its ARP check at power-up shows its address. |
| The device gets an offer but never accepts it | Some embedded network stacks ignore their own broadcast flag. Tick **Always broadcast replies** in your profile and try again. |
| Step 1 amber, mentions Wi-Fi or VPN | Another adapter is on the same subnet. Use **Turn it off until Stop**, or use a profile with a different server IP. |
| Step 2 says the cable shows connected but nothing has been received | The USB network adapter has stopped receiving. Unplug it from the laptop and plug it back in. If step 1 mentions an old Realtek driver, install the newer one: Windows Settings > Windows Update > Advanced options > Optional updates > Driver updates, tick the Realtek one only. |
Expand All @@ -90,7 +99,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.** Find devices that already have a static IP, move your adapter onto their subnet in one click, and discover devices via mDNS (including Dante), SSDP/UPnP and LLDP/CDP.
- **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.

## Files it writes

Expand Down Expand Up @@ -122,7 +131,7 @@ dotnet publish src/ProDHCPServer.App -c Release -r win-x64 -o publish
| `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.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, and the screenshots used in this README (taken by the CI smoke test). |
| `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.
Expand Down
56 changes: 56 additions & 0 deletions docs/hardware-test-phase3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Phase 3 hardware test

About 30 minutes. You need:

- The unmanaged laptop.
- Two AV devices on a small unmanaged switch (the NAV E and NAV SD are ideal).
- 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.

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

## 1. Found on the network

- [ ] Press **Start** with both devices on the switch, one of them on its static IP. Under the device list there's a **Found on the network** section saying it's listening.
- [ ] Within a minute, the static device appears there with its IP, an amber light and "Static IP on 192.168.1.x, which this laptop isn't on yet". If it doesn't, power-cycle it.
- [ ] The DHCP device is **not** listed there (it's in **All devices** above).
- [ ] After 30 s with no DHCP request from the static device, step 5 names it: "No DHCP requests…, but 192.168.1.50 (…) is on the cable with a static IP."
- [ ] The session log has a "Found 192.168.1.50 … It has a static IP on another subnet" line.

## 2. Reach it

- [ ] Press **Reach it** on the static device. Within a few seconds its light turns green, the line says "This laptop can reach it", and **Open WebUI** appears.
- [ ] The log says "Added 192.168.1.249/24 to "Ethernet" so this laptop can reach 192.168.1.50. It's removed when you press Stop."
- [ ] **Open WebUI** opens the device's web page.
- [ ] The DHCP device still works the whole time (its ping graph keeps going).
- [ ] Press **Stop**, then check the adapter in Windows (`ipconfig`): 192.168.1.249 is gone and the adapter is back to how it was.

## 3. Scan for static IPs

- [ ] Unplug the static device, Start, and plug it back in only after the server is running. If it doesn't show up by itself, press **Scan for static IPs**.
- [ ] The line under the button counts through the subnets ("Scanning 192.168.1.x (2 of 5)…") and ends with "Scan finished: N devices answered." It takes a minute or two.
- [ ] The static device is listed with its MAC and manufacturer, found by "subnet scan".
- [ ] While it scans, `ipconfig` shows one extra temporary address at a time; when it finishes, none are left.
- [ ] Press **Scan for static IPs** again and press **Stop** while it's still scanning: the adapter goes back to its original settings with no leftover addresses.

## 4. Discovery protocols

Tick what applies to the gear you have; skip the rest.

- [ ] A device that advertises itself (Dante, Q-SYS, Sennheiser, Shure, a ClickShare or most network players) shows its own name, found by mDNS, UPnP, Q-SYS or Shure.
- [ ] A projector or display with PJLink turned on shows up, found by PJLink, within about 30 s.
- [ ] Hover over a found device: the tooltip lists what it said (services, model, firmware).

## 5. Switch port (needs Npcap)

Only if you're happy to install [Npcap](https://npcap.com/#download) on the test laptop (free, a normal installer).

- [ ] Without Npcap: the section says "Install Npcap to see which switch port you're plugged into…", and **Get Npcap** opens the download page.
- [ ] With Npcap, through a managed switch with LLDP or CDP on: within about 30 s a line says "Plugged into <switch> port <port>, VLAN <n>". The log has the same line.
- [ ] With Npcap, power-cycle the static device: it appears within seconds of booting, found by ARP.

## 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.
Loading
Loading