pico-sdr/util/bridge.py

66 lines
1.7 KiB
Python
Executable file

#!/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()