Is2axudp.py
Beschreibung
is2axudp.py ist ein Python3 Skript, um Pakete im APRS-IS Protokoll entgegenzunehmen und in das AXUDP Format zu wandeln. Dies ermöglicht es beispielsweise Daten einer Wetterstation mit CWOP Report (z.B. WeeWX) direkt per HF über APRS abzustrahlen, anstatt die Daten nur über das Internet an einen APRS-Server zu übermitteln. Selbstverständlich lassen sich so auch andere Daten aus dem APRS-IS Protokoll in AXUDP wandeln.
Anwendungszwecke:
- Abstrahlung der Daten direkt lokal über HF (z.B. mit udpflex und einem TNC)
- Abstrahlung der Daten über einen entfernten APRS-Digipeater mit dxlAPRS Software
Funktionsweise
Im Beispiel die Anbindung einer Wetterstation mit WeeWX und konfiguriertem CWOP Report.
python3 is2axudp.py connection <-# is2axudp 0.1 ->user DL1NUX-14 pass 21432 vers weewx 4.2.0 <-# logresp # ->DL1NUX-14>APRS,TCPIP*:@182025z5013.81N/01059.43E_000/002g004t035r001p009P009b10250h81.weewx-4.2.0-FineOffsetUSB <~DL1NUX-14>APRS:@182025z5013.81N/01059.43E_000/002g004t035r001p009P009b10250h81.weewx-4.2.0-FineOffsetUSB
- Das Skript erzeugt einen TCP Server auf einem im Skript vorgegebenen und auch änderbaren Port.
- Die Wetterstation connected den TCP Server.
- is2axudp.py antwortet protokollgemäß mit der Softwareversion
- WeeWX sendet das APRS Loginskript mit Rufzeichen, Passcode und Softwareversion
- is2axudp.py antwortet mit einem # logresp #. Damit weiß WeeWX dass die Verbindung erfolgreich ist.
- WeeWX sendet das APRS Paket mit enthaltener TCPIP* Syntax. Das ist so definiert für Übergaben in das APRS-IS Netzwerk.
- Für die Aussendung als APRS-Paket wird durch is2axudp.py die Syntax ",TCPIP*" wieder entfernt. Es bleibt das eigentliche Rohpaket übrig.
- is2axudp.py wandelt mithilfe der wx.py von Chris OE5DXL das Paket in das AXUDP Format um.
Das somit erzeugte AXUDP Paket kann an alle kompatiblen Tools der dxlAPRS Toolchain (udpflex, afskmodem, udpbox usw.) zur Weiterverarbeitung übergeben werden.
Lokale Aussendung am gleichen Standort
Wenn die Wetterdaten vom gleichen Standort wie die Wetterstaton abgestrahlt wird, kann das Skript ohne Änderung verwendet werden. Es sind lediglich der gewünschte TCP Port einzutragen (Standard = 1234) sowie das AXUDP-Ziel (IP-Adresse und Port). Das Paket wird dann 1:1 ausgesendet.
Änderungen am Skript:
TCP Port Eingang (Standard 1234):
serversocket.bind(("0.0.0.0", 1234))
AXDUP Ausgang (Standard = IP 127.0.0.1 und Port 9032):
sendax(data,("127.0.0.1",9032),{})
Aussendung nach dem Durchlaufen des Skripts:
DL1NUX-14>APRS:@182025z5013.81N/01059.43E_000/002g004t035r001p009P009b10250h81.weewx-4.2.0-FineOffsetUSB
Das Paket kann von allen Stationen in HF-Reichweite gelesen werden. Wenn ein iGate unter den Empfängern ist, erscheint die Aussendung auch auf aprs.fi & Co. Möchte man, dass das Paket ggf. noch digipeatet wird, muss man noch den APRS-Pfad durch ein z.B. WIDE1-1 erweitern. Dies geschieht recht einfach im "replace" Abschnitt der is2axudp.py. Anstatt dass ",TCPIP*" durch "nichts" ersetzt wird (quasi entfernt), kann man auch einen anderen String einfügen. Es muss aber immer ein "," (Komma - ohne Anführungszeichen) dem Pfad vorangestellt werden.
Original:
data = data.replace(b',TCPIP*',b'')
Änderung mit WIDE1-1 Pfad:
data = data.replace(b',TCPIP*',b',WIDE1-1')
Aussendung mit WIDE1-1:
DL1NUX-14>APRS,WIDE1-1:@182025z5013.81N/01059.43E_000/002g004t035r001p009P009b10250h81.weewx-4.2.0-FineOffsetUSB
Aussendung an einem entfernten Standort
Wenn man die Daten der Wetterstation nicht am gleichen Standort sondern entfernt abstrahlen möchte, z.B. beim nächsten Digipeater, muss ein wenig mehr beachtet werden.
- Die Pakete der Wetterstation sollten nicht "direkt" eins-zu-eins ausgesendet werden.
- Heißt die Wetterstation z.B. DL1NUX-14 und der Digi DB0NU-10, würde eine eins-zu-eins Abstrahlung allen Empfänger der Aussendung vortäuschen, dass DL1NUX-14 direkt empfangen wurde. Das stimmt aber nicht, da sich DL1NUX-14 gar nicht am Standort von DB0NU befindet. Das "Relais" würde quasi mit dem "falschen Rufzeichen" seine Aussendung machen.
- Korrekter wäre, wenn der APRS-Digipeater die Aussendung auch als gedigipeatertes paket abstrahlen würde. Also so, als wenn es DL1NUX-14 über HF empfangen hätte und nun digipeaten würde.
Paket wird durch is2axudp.py empfangen:
DL1NUX-14>APRS,TCPIP*:@182205z5013.81N/01059.43E_341/002g006t035r001p011P011b10242h81.weewx-4.2.0-FineOffsetUSB
Paket wird von is2axudp.py umgewandelt und ein WIDE1-1 Pfad angehängt:
DL1NUX-14>APRS,WIDE1-1:@182205z5013.81N/01059.43E_341/002g006t035r001p011P011b10242h81.weewx-4.2.0-FineOffsetUSB
Paket wird von DB0NU-10 korrekt auf HF abgestrahlt:
DL1NUX-14>APRS,DB0NU-10*:@182205z5013.81N/01059.43E_341/002g006t035r001p011P011b10242h81.weewx-4.2.0-FineOffsetUSB
Was passiert in diesem Beispiel und welche Bedeutung hat es?
- Wie oben beschrieben wird das von WeeWX empfangene Paket empfangen und der String ",TCPIP*" wird entfernt.
- Als Pfad wird WIDE1-1 angehängt (String = ",WIDE1-1"), damit der Digipeater (udpbox) weiß, dass er es digipeaten soll.
- Anschließend wird das Paket im AXUDP Format an den Digipeater gesandt.
- Der Digipeater "empfängt" das Paket über AXUDP, erkennt anhand des "WIDE1-1" dass es das Paket digipeaten soll.
- Das Paket wird von DB0NU-10 abgestrahlt und korrekterweise das H-Bit "*" an das eigene Call angehängt. Dadurch weiß jede Station, die das Paket empfängt, dass die Aussendung indirekt von DB0NU-10 stammt, und nicht direkt von DL1NUX-14. Das WIDE1-1 wir din diesem Fall komplett entfernt, da der eine Hop aus WIDE1-1 "verbraucht" ist. Würde man wollen, dass noch weitere Digis das Paket digipeaten sollen, kann man auch das WIDE erweitern auf WIDE2-2, oder WIDE1-1,WIDE2-1 usw. Es ist jede Kombination denkbar. Hierbei sollte man aber sparsam sein. Es sollte maximal bis zum nächsten iGate "getragen" werden.
Das Digipeating übernimmt die udpbox. Dazu gibt es mehrere technische Lösungen:
- Senden des AXUDP Paketes an den Listenport des vorhandenen Digipeaters
- Dieser muss aber auf die entfernte IP-Adresse hören. Meist hört die udpbox nur auf "127.0.0.1", damit werden Paket von entfernten Stationen nicht angenommen.
- Die quick-and-dirty Lösung wäre die udpbox auf der Ip 0.0.0.0 hören zu lassen. Dadurch werden jedoch alle Pakete von allen IPs entgegen genommen. Es könnte also der Digi von Fremden "mißbraucht" werden, sollte die udpbox frei zugänglich sein (z.B. im Hamnet)
- Senden des AXUDP Paketes an eine eigene Chain im vorhandenen udpbox
- Man ergänzt die vorhandene udpbox um eine weitere chain für für die Übermittlung der Daten von der einen Wetterstation und setzt alle Digipeating-Optionen nach Wunsch erneut.
- Der Vorteil daran ist, dass Daten nur von dieser einen Gegenstelle angenommen werden. Ein Mißbrauch ist unwahrscheinlich.
- Außerdem kann man bei Bedarf mit zusätzlichen Filtereinstellungen am Digi in der udpbox weitereren möglichen Mißbrauch einschränken.
- Senden des AXUDP Paketes an eine zusätzliche Instanz von udpbox
- Die udpbox kann auch als zusätzlicher Prozess gestartet werden, auch mit dem selben Call wie im anderen Prozess.