2016-12-12 22 views
1

私はちょうど深刻なネットワーク問題に遭遇しました。私は、ADS-B受信機として少なくとも1つのRasPiを備えた仮想レーダーサーバーをセットアップするプロセスに入っています。これが何であるかを説明するだけです。飛行機は公共の周波数(1080MHz)で位置データを送信し、それを表示したいと思います。それはFlightradar24のようなものです。PythonストリームデータをTCP経由で

私のPiでは、SDRデバイス(DVB-Tスティック)を介してこれらの送信をインターセプトし、デコードされたデータをネットワークストリームに提供するMalcolm Robbからdump1090を実行します。 Piのポート30003でtelnetすれば、このストリームを見ることができます。ここまでは順調ですね。

2番目のマシンでは、仮想レーダーサーバー(短いVRS)が実行されています。これは主に、PIのポートに受信したデータを表示するWebサーバーです。私のローカルLANでも同様に動作します。

しかし、トリッキーな部分がわかります。通常、Piはルータ/ファイアウォールの背後にあり、ポート転送は行われないため、VRSはそのTCPストリームに接続できません。私は既にtelnetでそのストリームを開くために逆SSH接続を確立することができましたが、これはPiで実行されているTelnetセッションであり、リモートで制御されているVRSではできません。

私の考えは、VRSマシンの逆SSHからデータを傍受し、Pythonスクリプトを使用してそれを読み込んで新しいローカルTCPストリームを提供することでした。だから、理論上、VRSはそれを読むことができました。

私の最初の問題は、接続を傍受する方法です。私はPythonでそれを行う2つの方法を見つけました。どちらを好むか、より良いアイデアがありますか?

方法1

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

方法2

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

しかし、どのように私はさらにWORにスタウトを得るのですか?

次の問題は、TCPストリームを設定することです。 Dump1090はすべての時間にデータを送信するようですが、これまでのところ、Pythonでこれを設定する方法を理解できませんでした。これまでは、受信サーバーを最初に起動する必要があるクライアントとサーバーのコンボしかありませんでした。他の賢明な点として、クライアントはリスニングポートが開いていないとの例外を投げます。この問題を解決する方法はありますか?

多分私は複写する方法を考えています。だから私は誰か簡単なアイデアを掲示しています!

フロリアン

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

+0

あなたはすでに、なぜあなたは、単に[SSHに組み込まれたポートフォワーディング](http://blog.trackets.com/2014/05/17を使用していないSSHセッションを使用している場合/ssh-tunnel-local-and-remote-port-forwarding-explained-withexexamples.html)? –

+1

@SteffenUllrich彼はすでにそれを使用しています。私のフロリアンへの質問は、「なぜ30003番ポートに直接sshフォワードしないのですか?"あなたのPiで、' ssh user @ vrs -R 13889:localhost:22'の代わりに 'ssh user @ vrs -R 30003:localhost:30003'を実行してみてください。 vrsのポート30003を開いてPiからストリームを取得するだけです。 – xhienne

答えて

0

私はsshとtunellingマスターはないですしながら、私は唯一の第二部のためにお答えします: Try/Exceptを使用して接続を確立してください。

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...') 
関連する問題