#!/usr/bin/env python import binascii import struct from socket import (AF_INET, MSG_DONTWAIT, SO_REUSEADDR, SO_SNDBUF, SOCK_STREAM, SOL_SOCKET, socket) import click import serial @click.command() @click.option("-f", "--frequency", default=88200000, help="Frequency to tune to") def bridge(frequency): sock = socket(AF_INET, SOCK_STREAM) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.setsockopt(SOL_SOCKET, SO_SNDBUF, 1024 * 100) print("Posing as rtl_tcp at tcp://127.0.0.1:1234") sock.bind(("127.0.0.1", 1234)) sock.listen(3) while True: peer, addr = sock.accept() print("Client connected:", addr) with serial.Serial("/dev/ttyACM0", baudrate=10_000_000, timeout=0.1) as fp: print(f"Starting RX @ {frequency}") fp.write(struct.pack(">BBL", 0, 1, int(frequency))) fp.flush() print("Begin") try: cmd = b"" while True: try: cmd += peer.recv(1, MSG_DONTWAIT) except BlockingIOError: pass while len(cmd) >= 5: fp.write(cmd[:5]) info = struct.unpack(">BL", cmd[:5]) print("->", hex(info[0]), info[1]) cmd = cmd[5:] data = fp.read(64) if data: peer.send(data) except ConnectionError: pass except KeyboardInterrupt: pass finally: fp.write(b"\x00") print("Bye.") if __name__ == "__main__": bridge()