Daten statt per UDP mit TTL ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gerdchen03
User
Beiträge: 3
Registriert: Sonntag 26. April 2015, 16:54

Hallo,

vorab, ich hab keinen Schimmer vom Programmieren. Ich bin eher auf der Hardwareseite begabt, stoße nun aber an meine Grenzen, und bräuchte Hilfe. Vielleicht hat ja jemand von euch Zeit und Lust mich an der Hand zu nehmen ;-)

Ich habe ein Script (nicht von mir), das sogenannte ADS-B-Daten, also Informationen von Flugzeugen, wie man sie auf flightradar24.com sieht, aufnimmt, und derzeit per UDP ausgibt. Mein Ziel ist es, diese Daten in einer Flugnavigationssoftware für Segelflieger als Warnung anzeigen zu lassen, um Kollisionen mit großen Flugzeugen zu vermeiden. Dazu brauche ich die Daten aber an der seriellen Schnittstelle.

Hier http://www.python-forum.de/pastebin.php?mode=view&s=433 habe ich das Script hochgeladen.

Wie müsste ich das Script verändern, dass die Daten an /dev/ttyUSB0 ausgegeben werden?
BlackJack

@Gerdchen03: Das ist ziemlich gruseliger Quelltext.

Wir haben da ein „god object” das im Grunde nichts weiter ist als eine Sammlung von Funktionen und um die 20 globalen Variablen die in eine Klasse gestopft wurden, wobei einige von den globalen Variablen ausserhalb der `__init__()` eingeführt werden. Übersichtlich und nachvollziehbar ist das alles nicht. In der viel zu langen `process()`-Methode kommen zu den 20 globalen Namen noch mal 30 lokalen Namen hinzu. Und dann haben wir noch mal mehr als 30 Namen durch den Sternchenimport aus dem `math`-Modul. Yay…

`connect()`, `unpack()`, und `checksum()` sind nicht wirklich Methoden. Die wären als Funktionen besser aufgehoben.

Die `read()`-Methode wird wenn ich das richtig sehe falsch benutzt, sprich das Programm enthält dort einen Fehler. Die Methode gibt einen Fehlercode zurück den der Aufrufer nicht weiter beachtet. `self.response` wird in den beiden Fehlercode-Fällen nicht verändert, so dass der Aufrufer dann die letzte Nachricht noch einmal verarbeitet. Die API von dem `read()` ist aber auch eigenartig. Zum einen sieht das mit dem Fehlercode nach C oder so aus, denn in Python würde man dafür eine Ausnahme verwenden, zum anderen ist der Rückgabewert im Erfolgsfall die Länge der Nachricht — was man auch problemlos mit der `len()`-Funktion von der Nachricht selbst abfragen könnte. Die `read()`-Methode wäre sinnvoller wenn sie gar nicht erst verschiedene Fehlercodes zurückgeben würde wenn noch keine komplette Nachricht gelesen werden konnte, sondern einfach solange liest bis mindestens eine Nachricht komplett ist, und diese dann liefert.

Bevor man in den Quelltext noch zusätzlich etwas reinbastelt, müsste man den eigentlich erst einmal aufräumen. Was im Grunde auf neu schreiben hinaus läuft.
Gerdchen03
User
Beiträge: 3
Registriert: Sonntag 26. April 2015, 16:54

Hallo BlackJack,

danke für deine Antwort, auch wenn sie etwas ernüchternd ist ;-)
Das Chaos könnte evtl. daher kommen, dass jemand dieses Script aus zwei anderen zusammengebastelt hat. Ich habe mal beide hier gepostet:
http://www.python-forum.de/pastebin.php?mode=view&s=435
http://www.python-forum.de/pastebin.php?mode=view&s=436

Wird es damit besser, oder auch nicht wirklich?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gerdchen03 hat geschrieben: Das Chaos könnte evtl. daher kommen, dass jemand dieses Script aus zwei anderen zusammengebastelt hat. Ich habe mal beide hier gepostet:
http://www.python-forum.de/pastebin.php?mode=view&s=435
http://www.python-forum.de/pastebin.php?mode=view&s=436

Wird es damit besser, oder auch nicht wirklich?
Nö, wird nicht besser. Und ich denke das Chaos kommt eher dadurch zu stande, dass Du Python codest, ohne die Grundlagen verstanden zu haben! :mrgreen:

Wenigstens beim posten des Codes im Pastebin hättest Du doch die *richtige* Sprache zwecks Syntax-Highlighting einstellen können, oder? Ich meine dazu muss man ja nicht programmieren können :P

Fazit: Wenn Du Python Code brauchst, lerne Python oder engagiere jemanden, der Dir das schreibt. Mehr Optionen sehe ich nicht...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Psst, die sind nicht vom OP, der im ersten Beitrag schreibt das er keinen Schimmer vom Programmieren hat. Sieht letztlich also nach der Frage aus ob das mal schnell jemand machen kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackJack: Ja, das hatte ich schon genauso verstanden... aber wenn der OP Ahnung hätte, würde er nicht aus grottigen Scripten klauen ;-) Daher mein Einwand, dass das Chaos auf ihn selber zurückzuführen ist... und letztlich kann man ja nicht den Originator dafür verantwortlich machen, wenn jemand seinen schlechten Code verschlimmbessert... :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Gerdchen03: Ich glaube ich habe noch einen Fehler gefunden: Wenn in `unpack()` eine neue Nachricht auseinandergenommen wird, sollen bei Werten die nicht in der Nachricht enthalten sind, die vom letzten mal verwendet werden (ist im Moment so) oder sollten die auf Defaultwerte gesetzt werden (da ist nämlich momentan nutzloser Code der auf dem falschen Objekt diese Werte setzt.)!?
Gerdchen03
User
Beiträge: 3
Registriert: Sonntag 26. April 2015, 16:54

Also noch mal, ich habe den Code nur im Netz gefunden und ausprobiert. Ich hab nicht mal ein Zeichen verändert!
Da ich keine Ahnung vom Programmieren habe, konnte ich ja nicht ahnen, dass der Code so schlecht ist. Ursprünglich war dir Frage ja nur, was muss man ändern, dass die Ausgabe über TTL erfolgt. Da hatte ich die Hoffnung, dass das mit ein paar Zeilen erledigt ist.
BlackJack

@Gerdchen03: Ich denke ich habe noch einen Fehler gefunden: Die Zeitangabe im erzeugten '$GPRMC,…' sind ziemlich sicher falsch, denn um die sinnvoll auswerten zu können müssen die drei Komponenten (Stunden, Minuten, Sekunden) jeweils zweistellig sein, also ggf. mit führender Null. Die drei Zeitangaben 1 Uhr 21 Minuten und 5 Sekunden, 12 Uhr 1 Minute und 5 Sekunden, und 1 Uhr 2 Minuten und 15 Sekunden werden in dem Programm beispielsweise alle als '1215' formatiert.

Edit: Beim Datumsteil besteht das gleiche Problem: 1.11. und 11.1. sind beispielsweise nicht unterscheidbar. Und laut den Beispieldaten im Kommentar ist das Jahr auch nur zweistellig angegeben, ``now.year`` wird aber 4-Stellig sein.
Antworten