diff --git a/tools/pyflix/flix.py b/tools/pyflix/flix.py index 723af13..1bc495e 100644 --- a/tools/pyflix/flix.py +++ b/tools/pyflix/flix.py @@ -53,9 +53,9 @@ class Flix: except OSError as e: if e.errno != errno.EADDRINUSE: raise - # Port busy with QGC - using forwarding - logger.debug('Listening on port 14445 (QGC forwarding)') - self.connection: mavutil.mavfile = mavutil.mavlink_connection('udpin:0.0.0.0:14445', source_system=254) # type: ignore + # Port busy - using proxy + logger.debug('Listening on port 14560 (proxy)') + self.connection: mavutil.mavfile = mavutil.mavlink_connection('udpin:0.0.0.0:14555', source_system=254) # type: ignore self.connection.target_system = mav_id self.mavlink: mavlink.MAVLink = self.connection.mav self._event_listeners: dict[str, List[Callable[..., Any]]] = {} diff --git a/tools/pyflix/proxy.py b/tools/pyflix/proxy.py new file mode 100755 index 0000000..dbd1581 --- /dev/null +++ b/tools/pyflix/proxy.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +"""Proxy for running pyflix library alongside QGroundControl app.""" + +import socket + +LOCAL = ('0.0.0.0', 14550) # from Flix +TARGETS = ( + ('127.0.0.1', 14560), # to QGroundControl + ('127.0.0.1', 14555), # to pyflix +) + +def main(): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.bind(LOCAL) + + source_addr = None + packets = 0 + + print('Proxy started - run QGroundControl') + + while True: + data, addr = sock.recvfrom(1024) # read entire UDP packet + if addr in TARGETS: # packet from target + if source_addr is None: + continue + sock.sendto(data, source_addr) + else: # packet from source + source_addr = addr + for target in TARGETS: + sock.sendto(data, target) + + packets += 1 + print(f'\rPackets: {packets}', end='') + +if __name__ == '__main__': + main() diff --git a/tools/pyproject.toml b/tools/pyproject.toml index f252c76..3bb205d 100644 --- a/tools/pyproject.toml +++ b/tools/pyproject.toml @@ -10,6 +10,9 @@ dependencies = [ "pymavlink", ] +[project.scripts] +flixproxy = "pyflix.proxy:main" + [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta"