15 augustus 2026
Het bloed kruipt waar het niet gaan kan. Onder dat motto heb ik opnieuw een Ten-Tec RX320 aangeschaft. Na eerdere projecten met deze ontvanger begon het toch weer te kriebelen.
Deze keer heb ik een volledig in Python geschreven webserver ontwikkeld. Dus geen losse HTML-pagina’s die door een Apache-server worden gepubliceerd, maar alles geïntegreerd in Flask, met een HTML-template, JavaScript en een CSS-file.
Het project is opnieuw een mooie combinatie geworden van mijn interesse in de RX320, SDR en softwareontwikkeling. Soms kom je gewoon weer terug bij een oude liefde. 🙂
In deze versie is de audio real-time en zonder merkbare vertraging. Er wordt gebruikgemaakt van een echte peer-to-peerverbinding voor de audio, waardoor de vertraging tot een minimum wordt beperkt. De eerdere oplossing met Darkice en Icecast is daarmee volledig komen te vervallen.
De software is beschikbaar op GitHub en is platformonafhankelijk opgezet. Daarmee kan het programma onder andere op Windows en Linux draaien.
Ik heb de server ontwikkeld op een Raspberry Pi 3B en maak gebruik van een Flask-webserver. Voor de real-time audio gebruik ik de Python-library aiortc, waarmee WebRTC (Web Real-Time Communication) en ORTC (Object Real-Time Communication) worden ondersteund.
aiortc is gebouwd bovenop asyncio, het standaard framework van Python voor asynchrone I/O. Hierdoor is het mogelijk om de audio rechtstreeks en met zeer weinig vertraging naar de webbrowser te streamen.
Het resultaat is een snelle audioverbinding tussen de RX320 ontvanger en de gebruiker, zonder de merkbare vertraging die je bij traditionele audio-streaming vaak tegenkomt. De verbinding wordt automatisch opgebouwd. Zodra de melding ‘Audio connected’ verschijnt, kan de player worden gestart. Elke afstemming die je vervolgens maakt, hoor je vrijwel direct terug.

De software is als volgt opgebouwd:
RX320 Web Server
│
├── main.py
├── rx320.ini
├── rx320.py
├── dxcluster.py
├── shoutbox.db
│
├── static
│ ├── app.js
│ └── style.css
│
└── templates
└── index.html
De shoutbox is optioneel. Omdat de ontvanger waarschijnlijk niet door veel gebruikers tegelijk gebruikt zal worden en het systeem vooral voor privégebruik is bedoeld, is overleg met andere gebruikers niet echt nodig. De shoutbox kan daarom eenvoudig worden uitgeschakeld.
In de .ini-file kunnen een aantal memories worden ingesteld. Deze worden in de webinterface weergegeven en bieden de mogelijkheid om de RX320 direct op een opgeslagen frequentie af te stemmen.
Ook vanuit het DX Cluster-venster kan de ontvanger direct worden afgestemd. Door op een frequentie in het DX Cluster te klikken, wordt de RX320 automatisch op deze frequentie ingesteld.
De bijbehorende mode wordt daarbij automatisch bepaald aan de hand van het bandplan, dat eveneens in de .ini-file is opgenomen. Hierdoor wordt niet alleen de juiste frequentie ingesteld, maar ook automatisch de bijbehorende mode, zoals USB, LSB of CW.
Toch weer een leuk software project met de RX320.
Ondertussen heb ik ook een versie gemaakt voor stand-alone gebruik van de RX320 in combinatie met een Raspberry Pi 3B en een 7-inch TFT-scherm.
De bediening en afstemfunctionaliteit zijn grotendeels vergelijkbaar met de webversie. Ook hier zijn DX Cluster en memories beschikbaar, zodat je snel naar interessante frequenties kunt afstemmen.
Daarnaast is het mogelijk om de frequentie eenvoudig in stappen van ±1 kHz en ±100 Hz te verhogen of te verlagen. Hierdoor kun je snel en nauwkeurig door het frequentiegebied afstemmen. Tevens kun je de huidige frequentie en mode tijdelijk op slaan in een geheugenplaats. Zo kun je een frequentie met één handeling bewaren en later eenvoudig weer terugroepen.

Kortom, weer aardig wat uurtjes aan het programmeren geweest, maar met leuke resultaten. De RX320 blijft een prima black-box ontvanger om mee te spelen en te experimenteren. Bovendien heeft hij een uitzonderlijk goede ontvangstkwaliteit, zeker gezien zijn leeftijd.
