Listening with SDR++

An SDR observer is a node that transmits nothing and runs no firmware: it is an antenna on the map, and its window can serve that antenna to real SDR software over the rtl_tcp protocol. SDR++'s stock client connects to it as if it were a dongle, and what it draws is the simulation's actual air - the same summed IQ the verdicts are judged from, never a picture generated from packet events. If two transmissions collide, the waterfall shows the collision because the samples contain it, and for no other reason.

SDR observer a node on the map transmits nothing, hears everything drag it and the physics follows shared synthesis rtl_tcp server RTL0 header, 8-bit IQ follows the client's rate menu one client, like the real one TCP SDR++ stock RTL-TCP source the simulated spectrum, live Nothing on this path reads packet metadata: a collision is on the screen because the summed air contains it.

Serving the antenna#

  1. Place an SDR observer on the map, or import a scenario that has one. Any position works, and its height and antenna matter exactly as much as any other node's.
  2. Open its node window. An observer's window is its own: no console and no Radio tab - it runs no firmware and has no chip to read - but an SDR pane in front.
  3. Press serve rtl_tcp. The pane shows the address and port the server picked, and a status line that flips to "client connected" when something is on the other end.

An observer's node window on its SDR pane, ready to serve rtl_tcp

The same serve/stop control sits in the window's head, and the verb behind both is sdr.serve with sdr.stop, so a script can do it too.

Connecting SDR++#

In SDR++, choose the RTL-TCP source and give it the address and port from the observer's window. Then:

Start the simulation playing, and transmissions appear as chirp bursts at the channel's width. Drag the observer across the map while it serves: the engine forgets its cached path losses on the spot, and the next window prices the new geometry - walking an observer away from a transmitter sinks it into the noise floor in real time.

What the stream honestly is#

This is the same instrument the golden-vector experiment used from the other side: there a real dongle fed captured air into MeshBench's receiver; here MeshBench feeds simulated air into a real client. Both directions exist so neither half of the chain has to be taken on trust.

MeshBench documentation. Built from the running application, not from mock-ups. Screenshots are window-only captures; see CLAUDE.md for the rule that keeps them current. Edit this page.