RTLSDR-airband でエアバンドを複数チャネル同時受信 & ADS-B フィード提供

SDRエアバンド受信をやろうと思った背景

ある日、子供を大和市内の公園に連れて行った。ついでに厚木基地TWR と GND を受信していたら、GND からクリアランスデリバリーが聞こえてきた。「カデナ」だの「アンカレジ」だの、ずいぶん遠い目的地を言っていておもしろい。

普段の平日に在宅勤務しているとき、この厚木基地の無線をBGM代わりに仕事をするときがある。仕事場所の書斎は1Fで、基地とは反対側に窓があり、ハンディ機+ホイップアンテナでも管制塔側からの電波は届くのだが、特に GND は弱くてギリギリになっている。一方で2Fバルコニーには広帯域受信機能付きモービルホイップが設置されているので、バルコニーに隣接する寝室に受信機を置いておけば、かなりの強度で電波を受信できる。これをうまく使えないかと思っていろいろ試行錯誤していたところ*1、ふと「SDR受信機を使う」という選択肢に気付いた。

我が家には Raspberry Pi 3 Model B が1台余っていたので、人生初の Ali Express で RTL-SDR v3 ドングル を購入して、セットアップしてみた。この記事はその記録である。

ハードウェア構成

普段 IC-705 に接続して主に430MHz帯運用するのに使っているモービルホイップを、RTL-SDR に接続する。RTL-SDR を Pi3 に挿して、書斎の MacBook からリモート接続する。

ハードウェア構成図

Raspberry Pi 3 のソフトウェア構成

ひとつの RTL-SDR ドングル(デバイス)をオープンできるプロセスはひとつだけなので、こちらもハードウェアと同じく以下のような手動切り替え構成にする。

ソフトウェア構成図

切替パターンは以下の3パターンを用意した。

  1. 通常時
  2. エアバンド受信時
  3. 任意の周波数受信時

通常時 には、FlightRadar24 のフィード提供 を行うためのサービス fr24feed を動かしておく。エアバンド受信時 は、Pi3 上で RTLSDR-airband という OSS のツールを動かして複数の周波数(例: 厚木TWR, 厚木GND, 横田DEP)を一度に受信した上で、同じく Pi3 上で icecast2 サーバを動かして、その音声を宅内ネットワーク上にストリーミング配信する。FMラジオなどの 任意の周波数受信時 は、Pi3 上で rtl_tcp コマンドを実行した上で MacBook では gqrx を動かして、任意の周波数にチューンする。

通常時から別のパターンに切り替えるときは、service fr24feed stop でサービスを止めた上で rtlsdr_airband コマンドもしくは rtl_tcp コマンドを起動する。6時間以上この状態でほったらかすとFR24から「フィード来てねーよ!」という警告メールが来るので、パターン2/3 をやめるときは service fr24feed start で FR24 へのフィードを再開させておく。

導入手順

Raspberry Pi OS の導入

浦島太郎状態だったけど、Mac でも専用の Imager アプリが用意されて、とても簡単に microSD カードに書き込めるようになった。 (昔は dd コマンドで書き込んでたんだけど、バグのせいで書き込みが上手くいかないとか色々大変だった)

セットアップの時だけキーボード・マウス・ディスプレイを接続。キーボードは TrackPoint が付いている ThinkPad USB キーボードを使ったが、あまりに放置しっぱなしだったので TrackPoint のゴムが劣化して千切れた…。これ今代わりのものを入手しにくいんだっけか。

基本的なセットアップが終わったら、 apt update して apt upgrade しておく。

必要なソフトウェアの導入

  • FR24 feeder: 公式サイト から Raspberry Pi 用のフィーダをセットアップする。
  • RTLSDR-airband: ソースからビルドする。依存ライブラリをちゃんと入れておけばOK。README では「Pi3 では不要」と言われている rtl-sdr も入れないとコンパイルできなかった。
  • icecast2: apt install でインストールできる

設定ファイルの作成

rtlsdr-airband の設定はなかなかのくせ者。ポイントは以下。

  • output を icecast2 にするときは destination を8000/tcpにする。8080/tcpに流すと web console に出てこない
  • gain は受信先ごとに結構細かく設定しないと全然受信できない。

以下が設定ファイルの例。gainsquerlch_threshold が重要で、rtlsdr-airband -f -c path/to/conf と、-f オプションを付けてフォアグランド実行し、表示される信号強度を見ながら、ちょうどいい値を試行錯誤する必要がある。

devices:
({
  type = "rtlsdr";
  index = 0;
  gain = 40;
  mode = "scan";
  channels:
  (
    {
      freqs = (340.2, 299.7, 122.1, 363.8, 118.3, 270.6, 123.8, 261.4);
      labels = ("TWR(U)", "GND", "DEP(V)", "DEP(U)","APP-High(V)","APP-High(U)", "APP-Low(V)","APP-Low(U)" );
      squelch_threshold = -33
      outputs: (
        {
      type = "icecast";
      server = "X.X.X.X";
          port = 8000;
          tls = "disabled";
          mountpoint = "yokota-rapcon.mp3";
          name = "Yokota RAPCON";
          genre = "ATC";
          description = "Yokota RAPCON (NJA + OKO APP/DEPP)";
          username = "XXXX";
          password = "XXXX";
      send_scan_freq_tags = false;
        }
      );
    }
  );
 }
);

なお、icecast2 はインストール時に設定ウィザードが表示されるので、そのときパスワードを適切に設定しさえすれば、他に設定を書き換える必要はなかった。

やってみたメモ

ひとことで言うと、かなり使える。

  • rtlsdr-airband で厚木TWR, GND を受信→成功。周波数が40MHz 以上離れているので multichannel 機能は使えない、scan 機能で受信。
  • rtl_tcp でサーバを起動しておいて macOS 上の gqrx で受信→羽田ATISは無理だけど、東京APP/DEP の航空機側や、FM放送局を受信できる。

おまけ: ADS-B Exchange にもフィードできないか試した

世間的には FlightRadar24 (FR24) の知名度が高くて、民間旅客機のフライト情報などは大変にわかりやすいんだけど、横田空域のように軍用機ばかり飛んでいるエリアでは、ADSB-Exchange (ADSBx) のほうがたくさんの飛行機を確認することができる。FR24 は各方面に配慮して、軍用機・政府専用機・個人所有機などの一部の飛行機については ADS-B や MLAT の信号がフィードされていても追跡画面に表示されないようになっているのに対して、ADSBx のほうは容赦なく全機の情報を公開しているからだ(FAQ で「公開情報なんだから非表示になんてしないぜ!」と宣言してる)*2

で、いつもお世話になっているので ADSBx にもフィードできないか試してみた。結論として、現時点では成功していない。 ADS-B Exchange の公式ガイド に従っていれてみたが…。

---------------------
No data available from IP 127.0.0.1 on port 30005!
---------------------
If your data source is another device / receiver, see the advice here:
https://github.com/adsbexchange/wiki/wiki/Datasource-other-device

It looks like you are running FR24 or RB24
This means you will need to install a stand-alone decoder so data are avaible on port 30005!

If you have the SDR connected to this device, we recommend using this script to install and configure a stand-alone decoder:

https://github.com/wiedehopf/adsb-scripts/wiki/Automatic-installation-for-readsb
---------------------

ダメでした。 ちょっと調べたところ、そもそも FR24 をはじめとする ADS-B フィーダは、dump1090 という、1090MHz で受信したバイナリデータから ADS-B データにデコードするソフトウェアからデータを受け取って、それを FR24 や ADSBx のサイトに Post しているんだけど、FR24 公式スクリプトで入る dump1090 (dump1090-mutability という派生版) が出力するデータのフォーマットと、ADSBx が期待するフォーマットが違っているらしい。

FR24 付属の dump1090 は、以下の2種類のフォーマットでデータを提供している。

30002/tcp: AVRフォーマット(16進データのテキスト表記)

*8D71BD245821037D4D53C8896BA5;
*8D71BD2499102F1AC82410F389D2;
*5D71BD241BD113;

30003/tcp: なんか更に一段デコードされてる

MSG,3,333,10,861BEC,110,2023/09/24,18:09:34.660,2023/09/24,18:09:34.660,,9425,,,34.98154,139.87724,,,0,0,0,0
MSG,5,333,14,86E84C,114,2023/09/24,18:09:34.714,2023/09/24,18:09:34.714,,4125,,,,,,,0,,0,0

どうやら ADSBx のフィーダは、beast と呼ばれるバイナリを期待しているらしく、FR24 付属の dump1090 が提供するこれらのフォーマットを読んでくれないようだ。 ログを見ると、Beast TCP input を取りに行ったけどゴミが来るばかりだ、と文句を言っている。

 9月 24 20:52:36 pi3 adsbexchange-feed[343121]: Beast TCP input: Connection established: 127.0.0.1 port 30003
 9月 24 20:52:37 pi3 adsbexchange-feed[343121]: Garbage: Close: 127.0.0.1 port 30003 sample: ||

おそらく、ADSBx の以下のガイドに従って、dump1090 をいろいろ変える必要があるのだろう。このガイドに記されたツールを動かすと、readsb を入れた上で fr24 の dump1090 を設定変更して両フィードに流し込むようにしてくれるようだ。

github.com

そのうちやろうとは思っているものの、ほぼほぼ自分のやりたいことはできてしまっているので、とりあえずこれは今後の課題ということで、やり残し。

Referemce

RTL-SDR 関係

icecast

ADS-B

*1:「受信機の画面をカメラに移し込んだ iPad を寝室においておいてそこに向かって Facetime する」とかも試してみた。意外と使えるが、毎回 iPad を所定位置に設置するのが面倒だった。

*2:もっとも、聞こえてくる航空無線と比較すると、戦闘機や哨戒ヘリはそもそも ADS-B を使っていないらしく、ADSBx といえどもそれらの航空機は表示されない