After long hours of development, I have successfully finished a first release of the “SDR Server” (formerly known as “SDR Cloud” system but this name was also chosen by other team).
This software solution is able to share customizable (and programmable) IQ Streams of your favorite radio over the network for remote listening or processing. Currently only my own SDR software can handle the remote connection, but a “extio like” DLL is under work.
SDR streams can be remotely reprocessed and re-dispatched as one “sdr server” can receive and share streams coming from other servers. A script engine accepts JSON requests or script snippets to change its behavior.
Basically the protocol relies on HTTP and uses “application/content-stream” content-types. It means the streams can by sent across network proxies and standard TCP/IP equipment. Samples are sent using a VITA49 like format, with samples encoded as INTs or FLOATs depending on bandwidth.
Here is an example use case :

An AirSpy USB receiver is attached to the PC box running the SDR Server software. This AirSpy is fitted with a SV1AFN upconverter, so it is able to receive bunches of 10 MHz of HF at once.
For this demo, the SDR is tuned at 12 MHz, so it can process from 7 MHz to 12 MHz. The server is configured so as to create two IQ substreams :
- One stream from 10.100 to 10.150 MHz, called “30m”
- A second stream from 14.000 to 14.300, called “20m”
As the two streams fall inside the 10 MHz of the AirSpy, they can be served over the network simultaneously… That’s what I show below, where two instances of the gkSDR receiver are running on the same remote machine and processing the two streams at the same time.

This sharing server is fully web controlled and embeds a script engine to set and configure the streams and possible connections. Just to illustrate what can be done, here is the relevant section of the “boot script” used to declare the streams used in this example :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
// Rx Airpsy if( sourceDef.name == 'AirSpy' ) { var rx = new RFSource( sourceDef.UID ); // sets gain to avoid overload behind upconvter rx.setRxGain( 0, 12 ) ; // LNA rx.setRxGain( 1, 10 ) ; // mixer rx.setRxGain( 2, 10 ) ; // vga // center the 10 MHz window rx.setFrequency( 12.0 ) ; // Create stream #1 for 20M and name it for network visibility var streamDef = createStream( sourceDef.UID, 250e3 , '20M@250K') ; var remote_rx = new RFSource( streamDef.getUID() ); // tune center and lock to avoid remote retune remote_rx.setFrequency( 14.125 ) ; remote_rx.setLock( true ); // Create second stream streamDef = createStream( sourceDef.UID, 50e3 , '30M@50K') ; remote_rx = new RFSource( streamDef.getUID() ); remote_rx.setFrequency( 10.125 ) ; remote_rx.setLock( true ); } |
Basically the boot script checks what hardware is connected and decides what to do.
Note that the server accepts REST queries through a JSON over http mechanism so the settings could have been set manually.
For example, the remote SDR can be tuned with a request like :
http://<server IP>/api/stream/RX:1/tune/14.235
Each stream can be shared over multiple clients, as long as the server running the software as enough processing power. To avoid central frequency tuning conflicts, the boot code can decide if the band is locked (as in this example), or not.
The scripting engine allows to program specific local processing on any band, even while users are streaming on their side. Among many features, the scripting engine can:
- Capture bunches of spectrum and do some DSP locally (FFT, power, etc.),
- Post/Get results over http to remote systems,
- Trigger local recording of sub bands,
- Share set of “memories”,
- Manage client-to-client chats,
- encrypted streams,
- etc.
Work in progress :
- Remote stream synchronization,
- Remote stream aggregation,
- Remote stream decoding (analog linear modulations or digital modulations).
This software to share SDR IQ streams over the network is not Open Source and will probably not be free.
Contact me for details and availability