2016-12-12 3 views
1

Ich bin gerade in ein ernstes Netzwerkproblem gerannt. Ich bin dabei, einen Virtual Radar Server mit mindestens einem RasPi als ADS-B Empfänger einzurichten. Nur um zu erklären, worum es geht: Flugzeuge senden Standortdaten auf einer öffentlichen Frequenz (1080 MHz) und ich möchte das anzeigen. Es ist irgendwie wie Flightradar24.Python stream Daten über TCP

Auf meinem Pi starte ich dump1090 von Malcolm Robb, der diese Übertragungen über ein SDR-Gerät (DVB-T-Stick) abfängt und einen Netzwerkstream mit den entschlüsselten Daten liefert. Sie können diesen Stream ansehen, wenn Sie nur an Port 30003 des Pi telnet. So weit, ist es gut.

Auf einem zweiten Computer läuft Virtual Radar Server (kurz VRS). Es ist meistens ein Webserver, der die empfangenen Daten auf dem beschriebenen Port des PI anzeigt. In meinem lokalen LAN funktioniert das auch.

Aber wissen, kommt der schwierige Teil. Das Pi befindet sich normalerweise hinter einem Router/einer Firewall ohne Portweiterleitung, so dass VRS diesen TCP-Stream nicht verbinden kann. Ich habe es bereits geschafft, eine umgekehrte SSH-Verbindung aufzubauen, um diesen Stream wieder in Telnet zu öffnen, aber da dies eine Telnet-Sitzung ist, die auf dem Pi läuft, und nur ferngesteuertes VRS, können wir es nicht tun.

Jetzt war meine Idee, die Daten von der umgekehrten SSH auf der VRS-Maschine abzufangen und ein Python-Skript zu verwenden, um es zu lesen und einen frischen lokalen TCP-Strom davon zur Verfügung zu stellen. In der Theorie konnte VRS es also lesen.

Mein erstes Problem ist, wie man die Verbindung abfängt. Ich habe zwei Möglichkeiten gefunden, dies in Python zu tun. Welchen bevorzugen Sie oder haben Sie eine bessere Idee?

Methode 1

import os 
os.system("ssh [email protected] -p 13889 telnet localhost 30003 

Methode 2

import subprocess 
subprocess.call("ssh [email protected] -p 13889 telnet localhost 30003") 

Aber wie bekomme ich den dicken weiter wor mit?

Das nächste Problem besteht darin, den TCP-Stream einzurichten. Dump1090 scheint die Daten alle Zeit zu senden, aber bis jetzt konnte ich nicht herausfinden, wie man das in Python einrichtet. Bisher habe ich nur eine Client-Server-Kombination bekommen, bei der der empfangende Server zuerst gestartet werden muss. Andernfalls wirft der Client die Ausnahme, dass der Abhörport nicht geöffnet ist. Gibt es eine Möglichkeit, dieses Problem zu lösen?

Vielleicht denke ich Wege zu kopplizierten. So jemand hat eine einfachere Idee, posten Sie es!

Florian

flightradar24.com github.com/MalcolmRobb/dump1090 virtualradarserver.co.uk/

+0

Wenn Sie bereits eine SSH-Sitzung haben dann warum Sie nicht einfach mit den Tasten [Port-Forwarding in SSH gebaut] (http://blog.trackets.com/2014/05/17 /ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html)? –

+1

@SteffenUllrich Er benutzt es bereits. Meine Frage an Florian wäre eher "Warum gehst du nicht direkt auf Port 30003?"Ich meine, auf deinem Pi, anstatt' ssh user @ vrs -R 13889: localhost: 22', warum machst du nicht einfach 'ssh user @ vrs -R 30003: localhost: 30003'. Auf diese Weise hast du nur um den Port 30003 auf dem Vr zu öffnen, um den Stream vom Pi zu bekommen. – xhienne

Antwort

0

Während ich bin kein Meister in ssh und tunelling ich nur für den zweiten Teil beantworten: Verwenden Sie Try/Except mit etwas Verzögerung, um eine Verbindung herzustellen.

Beispiel

import time 

connected = False 
while not connected: 
    try: 
     # connect whatever you like 
     connected = True 
    except IOError: # or any other exception you get from connecting 
     time.sleep(5) # or any other value 
     print('Could not connect, retrying...')