dump1090-faとPiAwareをVersion 4.0に更新

dump1090-faのWeb-UI SkyAware

FlightAwareのフィーダーさんたちが使っている多数がdump1090-faとPiAwareだと思われるが、そのdump1090-faとPiAwareが2020年9月末にバージョン4.0になった。そこで、アンテナ建て替えの停止ついでに3.8から4.0に半年ぶりに更新することに。3月下旬リリースの3.8.1はスキップ。

dump1090-fa 4.0への更新

2020年10月9日時点でArmbainのarm64のシングルボードコンピュータで利用可能なパッケージではすでにdump1090-faの4.0が提供されている。なので、この記事のように自分でビルドしなくてもapt install dump1090-faでインストールするなりapt upgrade dump1090-faで更新するなりで終わりといえば終わり。
しかし、今回はレシーバの種類をRTL-SDRに限定してビルドした。

基本的なdump1090-faのビルド方法は以前のdump1090-faの記事と同じ。 ただ、RTL-SDRに限るオプションとして dpkg-buildpackage -b --no-sign の代わりに

$ dpkg-buildpackage -b --no-sign --build-profiles=custom,rtlsdr
ビルドしてできたパッケージをインストール。

上の手順だけでは更新の場合はおそらくウェブUIが動かない・dump1090が機能していない?という状態になる。

$ sudo lighty-enable-mod dump1090-fa
$ sudo service lighttpd force-reload

これで更新前と同様に動作するようになる。

dump-1090-faだけを更新した場合は関係ないかもしれませんが、lighttpdを更新したまたは再インストールしたという場合はlighttpdのログファイルのオーナーとパーミッションを確認して下さい。ファイルオーナーがrootになっていてオーナー以外の書き込み権限がないとlighttpdがログを書き込めないエラーで起動できません。/var/log/lighttpdの中です。

dump1090-fa 4.0の起動オプションの見直し

ネットの記事をちょろっと見てチャチャっとインストール〜動作させたようなフィーダーだと起動オプションが不適切なことがある。
今回は見直すことにした。
まずは、使用できるオプションを確認する。

$ dump1090-fa --help
前略
--device-type <type>     Select SDR type (default: rtlsdr)

      rtlsdr-specific options (use with --device-type rtlsdr)

--device <index|serial>  select device by index or serial number
--enable-agc             enable digital AGC (not tuner AGC!)
--ppm <correction>       set oscillator frequency correction in PPM
--direct <0|1|2>         set direct sampling mode

      ifile-specific options (use with --ifile)

--ifile <path>           read samples from given file ('-' for stdin)
--iformat <type>         set sample format (UC8, SC16, SC16Q11)
--throttle               process samples at the original capture speed

      Common options

--gain <db>              Set gain (default: max gain. Use -10 for auto-gain)
--freq <hz>              Set frequency (default: 1090 Mhz)
--interactive            Interactive mode refreshing data on screen. Implies --throttle
--interactive-ttl <sec>  Remove from list if idle for <sec> (default: 60)
--raw                    Show only messages hex values
--net                    Enable networking with default ports unless overridden
--modeac                 Enable decoding of SSR Modes 3/A & 3/C
--no-modeac-auto         Don't enable Mode A/C if requested by a Beast connection
--net-only               Enable just networking, no RTL device or file used
--net-bind-address <ip>  IP address to bind to (default: Any; Use 127.0.0.1 for private)
--net-ri-port <ports>    TCP raw input listen ports  (default: 30001)
--net-ro-port <ports>    TCP raw output listen ports (default: 30002)
--net-sbs-port <ports>   TCP BaseStation output listen ports (default: 30003)
--net-bi-port <ports>    TCP Beast input listen ports  (default: 30004,30104)
--net-bo-port <ports>    TCP Beast output listen ports (default: 30005)
--net-stratux-port <ports>   TCP Stratux output listen ports (default: disabled)
--net-ro-size <size>     TCP output minimum size (default: 0)
--net-ro-interval <rate> TCP output memory flush rate in seconds (default: 0)
--net-heartbeat <rate>   TCP heartbeat rate in seconds (default: 60 sec; 0 to disable)
--net-buffer <n>         TCP buffer size 64Kb * (2^n) (default: n=0, 64Kb)
--net-verbatim           Make Beast-format output connections default to verbatim mode
                         (forward all messages, without applying CRC corrections)
--forward-mlat           Allow forwarding of received mlat results to output ports
--lat <latitude>         Reference/receiver latitude for surface posn (opt)
--lon <longitude>        Reference/receiver longitude for surface posn (opt)
--max-range <distance>   Absolute maximum range for position decoding (in nm, default: 300)
--fix                    Enable single-bit error correction using CRC
--fix-2bit               Enable two-bit error correction using CRC (use with caution)
--no-fix                 Disable error correction using CRC
--no-crc-check           Disable messages with broken CRC (discouraged)
--mlat                   display raw messages in Beast ascii mode
--stats                  With --ifile print stats at exit. No other output
--stats-range            Collect/show range histogram
--stats-every <seconds>  Show and reset stats every <seconds> seconds
--onlyaddr               Show only ICAO addresses (testing purposes)
--metric                 Use metric units (meters, km/h, ...)
--gnss                   Show altitudes as HAE/GNSS (with H suffix) when available
--snip <level>           Strip IQ file removing samples < level
--quiet                  Disable output to stdout. Use for daemon applications
--show-only <addr>       Show only messages from the given ICAO on stdout
--write-json <dir>       Periodically write json output to <dir> (for serving by a separate webserver)
--write-json-every <t>   Write json output every t seconds (default 1)
--json-location-accuracy <n>  Accuracy of receiver location in json metadata: 0=no location, 1=approximate, 2=exact
--dcfilter               Apply a 1Hz DC filter to input data (requires more CPU)
--version                Show version and build options
--help                   Show this help

バージョンによって使用できるオプションが変わることがあるのでバージョンを更新した場合は設定変更するつもりがなくても確認しておくのが良さそう。 今回4.0では3.8で追加された --fix --fix の2ビット訂正が --fix-2bit に変更になっている。

また、ようやく --version でバージョン表示ができるようになった。
$ dump1090-fa --version
-----------------------------------------------------------------------------
| dump1090 ModeS Receiver                                   dump1090-fa 4.0 |
| build options: ENABLE_RTLSDR                                              |
-----------------------------------------------------------------------------

ところで、dump1090-faでゲインの設定ってどうしているだろうか。

https://discussions.flightaware.com/t/rtl-dongle-gain-question/15588
obj FlightAware Staffの発言の引用

librtlsdrには2つの異なるゲイン設定があり、これらのオプションが制御します
–enable-agc は、RTL2832U内のデジタルAGCを有効にします。実際には、これはあまり役に立ちません(デジタルステージ内でデータをスケーリングするだけなので、追加情報が抽出されることはありません)
–gain -10 は、チューナーチップでアナログAGCを有効にします。これは、有用である可能性が高くなります。
–gain(何か他のもの)はアナログAGCを無効にし、チューナーゲインをdB単位のその値(または近くにあるチューナーがサポートするもの)に直接設定します。
R820Tチューナーでは、チューナーのゲイン設定が実際にはLNA(RF)ゲインとミキサーゲインの両方を制御します。 librtlsdrを介してそれらを個別に制御することはできません。
アナログAGCは、信号が特定の強度にしばらく留まる場合に最適に機能し、フィードバックループを調整するための時間を与えます。これは、バーストが非常に短いため(1090MHz信号では実際には当てはまりません)、ほとんど)そしてあなたは広範囲の信号強度を得るでしょう。
個人的には、R820Tの最大ゲインから1ノッチ下の-ゲイン48で実行します。最大ゲイン(デフォルト)は、不均衡な量のノイズを追加するようです。強い/近い信号の場合、または増幅されたアンテナを使用する場合は、ADCステージでのクリッピングを回避するためにゲインを低くする必要があります。

ゲインは固定なら30〜48程度で設定 (--gain 48 など)、または、AGCを使うなら (--gain -10 AGCはこれ一択)だけど、ADS-BではAGCオンはあまりオススメではないらしい。他の人の意見でも。受信範囲を殆ど航空機が通らなくて1機だけを暫く追跡するような場合には有用らしいが。–enable-agcは問題外ということで。
そこで、「がとらぼ」ではAGC不使用に変更。ただし、固定の場合は環境に合わせた調整は面倒。次のdump1090-exporterのSignal Strengthのグラフを見ながら値を調整したところ、「かとらぼ」の環境(過剰に増幅する怪しいLNA使用)では --gain 30 くらいが一番良さそうな感じということになった。

https://discussions.flightaware.com/t/dump1090-mutability-dcfilter/30584
david.bakerの発言の引用

DCフィルターは、エンコードが振幅エンコードされているため、ADSBには役立ちません。 他の無線システムでは、非常に便利です。
RTLドングルとプロスティックは実際にはソフトウェア無線であり、他の周波数(数MHzから1.8GHz)を聞くために使用できます。 RTLドングルで使用されるテクノロジーは、低IFおよびゼロIF無線変換と呼ばれます。 ゼロIF変換は、ソフトウェアでフィルターで除去できるDC成分を出力に追加します。 一部の無線エンコーディングでは、DCオフセットを削除することが重要です。 ADSBではそれは問題ではありません。
DCフィルターをオフのままにしてください。

前回のdump1090-faの記事でCPUの使用率として少し触れたDC FilterはADS-Bでは役に立たないらしいので使用しない (--dcfilter は付けない)

2ビット訂正 (--fix --fix)オプションは4.0で --fix-2bit に変更になった。
ただし、2ビット訂正はFR24にフィードするなら使わない方が良いみたい。1ビット訂正 (--fix 1回指定)に留めるのが良さそう。

1ビット訂正 --fix について

https://discussions.flightaware.com/t/fix-parameter-in-dump1090-fa/65791
obj FlightAware Staffの発言の引用

転送中のノイズによって損傷した一部のメッセージに対してエラー訂正を行います。そうでない場合は破棄されます。 これの欠点は、ひどく損傷したメッセージが誤って「修正」され、悪いデータが生成される可能性が高くなることです。 通常、これらの不良メッセージは、後続の処理によって除外されます(これが「シングルトラック」統計の取得元です)

dump1090exporterの更新

dump1090exporterの更新はpipで行う。
$ pip3 install --update dump1090exporter
環境によってはpip3ではなくpip。

更新自体は簡単だが、オプションが変わっていて、動作が怪しいためdump1090 Prometheus ExporterでADS-B受信状況を監視するのようにデータの在り処のURLを未指定にするとaircraft.jsonが取得できなくなってる。他のjsonファイルは/dataに取りに行くのでdump1090exporterのバグ?
そして、データの在り処の指定オプションが変わっているっぽい。
--url=在り処のURL だったのが --resource-path=在り処のURL になった。どのバージョンで変わったかは調べてない。

dump1090-faのWebUIのURLがhttp://127.0.0.1:8080だとすると、データは(初期値では)その/dataにあるので http://127.0.0.1:8080/dataになる。

起動コマンドの例
$ /usr/local/bin/dump1090exporter --resource-path=http://127.0.0.1:8080/data --latitude=-35.xxxxxxxx --longitude=139xxxxxxxx

dump1090exporterのグラフ
Grafanaでチャートを表示してSignal Strengthの折れ線グラフ(下から2番め)を見る。dump1090-faで--gain 30を指定するとこれくらい。(あくまでも「がとらぼ」の中の人の環境で怪しいLNAを使用しての30指定でこれくらい。)
--gain の数値を増やすと3つのグラフが上方向に上がる。「がとらぼ」の環境だと40指定のようにむやみに高い数値を指定すると水色のnoiseが-5 dbFSあたりまで上がる。その結果はとても悪くなる。LNA無しだと先の引用のように48くらいを指定するのも良さそう。

PiAwareの更新

PiAwareもすでに4.0のパッケージが提供されているようなので面倒がイヤなら素直にパッケージを利用する方が簡単。
しかし、「がとらぼ」では前回に引き続きビルドする。
ビルドの基本はFlightAwareにフィードすると変わっていない。ただし、4.0では3.8より依存関係を満たすのが面倒になっている。

足りない
piaware depends on tclx8.4; however:
  Package tclx8.4 is not installed.
 piaware depends on tcllib; however:
  Package tcllib is not installed.
 piaware depends on tcl-tls (>= 1.7.16-1+fa1); however:
  Package tcl-tls is not installed.
 piaware depends on itcl3; however:
  Package itcl3 is not installed.

tclx8.4, tcllib, itcl3は普通に apt install hoge のようにインストールする。(嫌がられる場合は apt install -f hoge

のように-fを付けて強制する)

上の4つの内、piaware 4.0ではtcl-tlsは専用版が要るみたい PiAwareビルド時には要らないけどインストール以降で必要。
そこで、扱いやすいようにパッケージとしてビルドしてインストールする。

$ sudo apt install tcl-dev chrpath
$ cd ~/      (ホームディレクトリで)
$ git clone http://github.com/flightaware/tcltls-rebuild.git
$ cd tcltls-rebuild
$ ./prepare-build.sh buster     (Armbian, Debianのバージョンがbusterの場合)
$ cd package-buster
$ sudo dpkg-buildpackage -b --no-sign
$ cd ../
$ sudo dpkg -i tcl-tls_1.7.16-1+fa1_arm64.deb

PiAwareの更新は /etc/piaware.conf と /var/cache/piaware の中のファイルを消したりしなければ基本的にはトラブらない筈。

dump1090-faやPiAwareのバージョンを最新にしないとFlightAwareからフィードをブロックされるとかはないようなので、最新に保つ必要があるかと問われると「まぁ必要はない」けど、半年放置したので新しくしたい気持ちがあった。今回はアンテナの建て替えついでだからちょうど良かった。そういう機会がないとダウンタイムがそれなりに発生するから更新なんかしたくないしね。