ACARSのGNURadioでの受信にチャレンジしてみました。先に結果を言ってしまうとあまり満足な結果を得ることはできませんでした。しかしながらgnuradioの柔軟性は確認できたと思います。何かの参考になるかもしれませんので過程を書いておきます。
ACARSを受信しようにも、肝心のRTL2832Uドングルは先に書いたような不調のため受信は不可能です。そこで、ハンディ機VX-2で受信した信号をサウンドとしてGNURadioに入れて復調できるかどうかを試してみました。
まずはじめに、ACARSについて今回ちょっとだけ勉強してみました。ACARSとは、Aircraft Communications Addressing and Reporting Systemの略で、VHFの電波で航空機と地上の基地局から便名や位置についての情報を送信しているのだそうです(この解説と絵がわかりやすい)。日本では131.25MHzまたは131.45MHzが使われているそうです。MSK(minimum shift keying)で2400bpsの速度で変調されており、データフォーマットはASCIIで単純なもののようです。
まずは試しにハンディ機で信号を受信してみます。こんな音に聞こえます。
これの音声波形をオシロで見てみるとこんな感じでした。上が信号全体で0.26秒くらいの長さ。下が中間付近の拡大波形です。
本来MSKという変調方式は周波数/位相変調の一種だと思う(wikipedia)ので、振幅は一定になるのではないかと思うのですが、信号の周波数成分により振幅が大きく変わってしまっています。ハンディ機の周波数特性がフラットでないのでしょうか。この信号をもとにデコードを成功させるのは難しいかもしれません。
デコードするソフトウェアについてですが、Windowsには優れたものがあり、なんと地図や航跡をプロットしたり、航空機の諸情報を表示したりすることができるようです。さらにはRTL2832Uドングルも対応しているとのことです。詳しくはサイトを参照してください。
とはいうものの、この記事はMacとGNURadioでどこまでできるかを確かめることを目的なので、このソフトを試すのは別の機会に譲ることにします。
さて、GNURadioですが、ACARSデコード用にその名もgr-acarsというモジュールがあります。サイトはこちら。https://www.cgran.org/wiki/ACARS
このモジュールはCGRAN( https://www.cgran.org/ )で提供されています。CGRANとは、GNURadio向けの開発成果を共有するためのサイト(PerlでいうCPANのようなもの?)らしいです。gr-acarsをCGRANからダウンロードしビルドしてみました。今回試した環境はMacです(Macでgnuradioを使う方法はこちら)。gr-acarsについてはLinuxでも違いなく同様に使えると思います。
まずはダウンロードですが、CGRANはTracベースのサイトなので、subversionを使ってソースを持ってくる必要があります。
$ svn co https://www.cgran.org/svn/projects/gr-acars/trunk/ gr-acars
そしてcmakeを使ってMakefileを作成し、makeでビルド、最後にmake installでインストールします。
$ cd gr-acars
$ cd build
$ cmake ../
$ make
$ sudo make install
これで無事インストールは成功したように見えたのですが、実は落とし穴がありました。gnuradio-companionを起動し、gr-acarsのサンプルファイルを開こうとしました。ところがgr-acarsで追加されたはずのdecodeurブロックがフローグラフに表示されません。右の一覧表にはacarsというセクションが追加され、decodeurと表示されているのでインストールはされているのですが、このモジュールでエラーが発生しロードに失敗していました。pythonのバージョン不一致が原因のようです。ログを調べたところ、brewでインストールしたpython2.7を使っているはずなのにも関わらず、/usr/lib/libpython2.6.dylibを参照していることが原因でした。手元のpython環境に何らかの不手際があるのかもしれませんが、根本的な対策方法はわかりませんでした。そのかわり、cmakeで生成されたCMakeCache.txtの当該部分を、本来あるはずの値に書き換えてしのぐことにしました。
一度buildディレクトリを消去(rm -rf build)、mkdir build そして cmake ../ を実行したあと、生成されたbuild/CMakeCache.txtの当該箇所をこのように書き換えます。そして、make、sudo make installします。
//Path to a library.
PYTHON\_LIBRARY:FILEPATH=/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib
なんとかこれでモジュールが正しいライブラリを参照してコンパイルすることができ、decodeurブロックも正常にロードされるようになりました。
さて、インストールがうまくいったところで、つづいてはACARS用のフローグラフの構成です。gr-acarsのサンプルsample-acars.grcでは、rtl2832uをソースにしたものが入っていました。これを参考に、Audioをソースにするグラフを構成します。こんな感じになりました。(クリックで拡大)
サンプルと同様に、繰り返し試せるよう受信した信号をファイルに記録し、それを再生して何度も復調テストができるように構成します。使わないほうの経路はブロックをディセーブルします(グレーになっています)。スレッショルドやゲインを調整できるようになっています(逆に調整をしなければいけないということのようです)。サンプリングレートは48kHzが前提です。
ハンディ機VX-2とMacとの接続ですが、こんな感じにしました。VX-2のミニジャックから取り出したスピーカ出力を、ライン入力付きのUSBサウンドアダプタ(Roland UA-1G)に接続しています。ハンディ機の端子は4極タイプで、ちょっと特殊なので注意が必要です(普通の3極プラグを差し込むとPTT-ONの送信状態になってしまいます)。UA-1Gは96kHz対応の製品ですが、今回は48kHzで使います(以前SDR用に使っていたものです)。
機器を接続したら先ほどのフローグラフでgnuradioを走らせます。Macのスピーカ音声とScopeウインドウの波形をモニタしながら音量を調整します。Threasholdが適切だと信号を検知しはじめ、ログにデータが出力されてきます。さらに調整がうまくいくとデコードが成功するということのようです。
ところが、ウインドウ上にあるThreasholdとaudiogainとハンディ機の音量調整が微妙で、どのあたりが適切なのかはっきりしません。画面に16進数でデータは表示されるものの、なかなか正しくデコードされないようなのです。結局ソースコードを参照して、デコードが成功する条件を探しました。データ先頭が2b 2a 16 16 01という並びになる必要があることがわかりました。惜しい値にはなっているのですがなかなか完全一致しません。
長時間いろいろ試行錯誤した後、ログを確認してみたところ何度かデコードに成功していたようです。たとえばこんな感じの出力が出てきました。
Sat Oct 27 10:53:06 2012
len=63488 seuil=150.000000
a=44448.925781 b=573
dynamic threshold: 830.443237
2b 2a 16 16 01 5a 2e 4a 41 37 35 34 41 15 31 36 35 02 4d 33 34 41 4e 48 30 30 35 36 50 4f 37 4a 41 37 35 34 41 30 30 35 36 52 4a 43 43 52 4a 54 54 32 37 31 30 31 32 30 31 35 33 30 33 0d 0a 39 39 39 39 39 20 36 20 31 33 30 39 39 39 39 39 39 39 39 0d 0a 57 4e 34 31 33 31 31 45 31 34 31 34 31 36 30 31 35 33 30 33 32 35 36 30 34 2d 33 36 33 33 35 20 33 34 20 33 39 36 30 30 0d 0a 50 41 4e 30 32 20 20 30 31 35 33 03 37 66 7f 25 6a
+\*Z.JA754A165M34ANH0056PO7JA754A0056RJCCRJTT271012015303
99999 6 13099999999
WN41311E14141601530325604-36335 34 39600
PAN02 01537f%j
Aircraft=.JA754A
STX
Seq. No=4d 33 34 41 M34A
Flight=NH0056
PO7JA754A0056RJCCRJTT27101201530399999 6 13099999999WN41311E14141601530325604-36335 34 39600PAN02 0153ETX
Aircraft=.JA754A、Flight=NH0056とのことですが、果たして正しいのか、残念ながら航空関係は詳しくないので良くわかりません。でもRJCCとかRJTTとか、N41やE141など緯度経度っぽいデータも見えています。
とりあえずデコードを成功させることはできました。gr-acarsでできるのはこんなログを出力することまでのようです。
数時間やってみただけの経験ですが、なかなかハードルいです。今回の構成ではあまりに成功率が低いので連続でデータを取ったりすることは難しそうです。またデータの出力形式を見ても、まだまだ開発中というステータスだと思われます。
本当はrtl2832uドングルでの受信をやってみたいところです。こちらであればボリューム調整やサウンドの周波数特性といった不確定な要素を排除できるので成功率はもっと良くなると思うのですが、果たしてどうでしょうか。新しいドングルが到着したら試してみたいと考えています。
[追記]
フローグラフのファイルは下記から参照ください。
https://raw.github.com/edy555/gnuradio-trial/master/acars-audioin.grc