initial commit. tested with jtalert, wsjtx, n1mm

master
bmo 2019-01-04 16:40:26 -08:00
rodzic 397bc3fd50
commit 4602c9798b
1 zmienionych plików z 86 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,86 @@
#
# A rude work around to get JTAlert v.2, N1MM Logger+ 1.0.7422.0 (first version with WSJTX support), and WSJT-X 2.0 working
# together.
#
# 0. Start this program (python 3.x)
# 1. Start wsjt-x. Configure UDP server port to be 224.1.1.1, port 5007
# 2. Start N1MM. No configuration possible for wsjtx window
# 3. Verify that N1MM's wsjtx window is receiving CQ spots from wsjtx
# 4. Edit the file C:\Users\<YOURUSERNAME>\AppData\Local\WSJT-X\WSJT-X.ini
# add these two lines above the UDPServer=224.1.1.1 line:
# udpserver=127.0.0.1
# udpserverport=2238
# Put a comment in front of the UDPServer= and UDPServerPort= lines, like this:
# #UDPServer=224.0.0.1
# #UDPServerPort=5007
# 5. Save the file.
# 6. Start JT-Alert (JTAlert will read the .ini file with the 127.0.0.1:2238 values, and start receiving packets
# 7. Comment out the 127.0.0.1:2238 UDPServer lines with #
# 8. Save the file again.
# You'll have to do this again each time you start up JTAlert to 'fool' it into using port 2238.
#
# Issues: JTALERT-X closes it's socket connection while the settings dialog is open. We do the brute force thing of trying to
# reestablish the connection to the port
# WSJT-X talks to a multicast port. This program sits on the multicast port, and forwards packets it receives to other Unicast sockets.
# It also listens on the unicast sockets, and forwards received packets back to WSJT-X.
# It assumes that there's only ONE other application sending packets to the multicast socket (WSJT-X)
#
MULTICAST_PORT = { 'ip_address':'224.1.1.1', 'port':5007, 'timeout':0.2 }
FORWARDING_PORTS = [
{ 'ip_address': '127.0.0.1', 'port': 2237, 'timeout':0.2 },
{ 'ip_address': '127.0.0.1', 'port': 2238, 'timeout':0.2 }
]
import os
import sys
import logging
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import pywsjtx
import pywsjtx.extra.simple_server
#
# The RIGHT way to do a packet redistributor like this is to select or wait on the sockets.
# This one trades a little latency (~.50 seconds for two unicast and one multicast socket) for
# not changing some other code I had around
#
def main():
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] %(message)s")
consoleFormatter = logging.Formatter('%(asctime)s %(message)s')
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(message)s')
wsjtx_instance_addr_port = None
servers = []
master_server = pywsjtx.extra.simple_server.SimpleServer(MULTICAST_PORT['ip_address'], MULTICAST_PORT['port'],
timeout=MULTICAST_PORT['timeout'])
for port_spec in FORWARDING_PORTS:
servers.append({"instance":pywsjtx.extra.simple_server.SimpleServer(port_spec.get('server_ip_address','127.0.0.1'),
port_spec.get('server_port',0), timeout=port_spec['timeout']),
"to_addr_port": (port_spec['ip_address'], port_spec['port']),
"server_spec": port_spec })
while (True):
pkt, wsjtx_instance_addr_port = master_server.rx_packet()
if pkt is not None:
logging.debug('RX packet from wsjtx')
for s in servers:
s['instance'].send_packet(s['to_addr_port'],pkt )
for s in servers:
try:
pkt, srv_instance_addr_port = s['instance'].rx_packet()
if pkt is not None:
logging.debug('RX packet from {}'.format(s['to_addr_port']))
master_server.send_packet(wsjtx_instance_addr_port,pkt)
except ConnectionResetError:
# reopen the port.
logging.debug("ERROR - Restarting port {}".format(s['to_addr_port']))
s["instance"] = pywsjtx.extra.simple_server.SimpleServer(port_spec.get('server_ip_address','127.0.0.1'),
port_spec.get('server_port',0), timeout=port_spec['timeout'])
if __name__ == "__main__":
main()