複数のdump1090-faでアンテナとかSDRとか色々比較できる環境をつくる

# この記事のゴール
+ RPi 一個で、実験比較用に複数の RTL-SDRやアンテナを接続できるようにします。
+ 複数のドングルと、複数の dump1090-faが動くようにします。
+ 追加した dump1090-faの結果はフィードされず、何処にもつながりません、dump1090-fa に付属の Web画面で比較できるところまでが、この記事の範囲です。

# キッカケ
最近ではいくつかの正規品から、お値段はお得なちょっと怪しい品まで、多数の SDRが出回っています。アンテナも自作したりして既にいくつかお持ちかと。
飛行機の位置は、絶対同じ場所や状態を再現できないので、色んな設定を変えても比較がむずかしいですね。

これを解決するには、同じ環境かつ同時刻での比較というのが正解だとおもってます。

全てのセットを2個準備すればいいんですよ。
RPiも必要数分を買い込んで・・で準備すれば、ハイもちろんそれは正解です。
しかし、そこそこ高価なものですし、テストが終わったら稼働しなくなってしまいます。ADSBで使われている RPiは稼働率が高くてみんな幸せです。不幸な RPiを増やさないようにしたいです。


# RTL-SDRを複数挿す

RTL-SDR(USBドングル) の複数挿しには少し工夫が必要です。フィーダーのセットでは、1個が原則なので、複数挿しは考慮されていません。
rtl_test コマンドで、SDRがどのように見えているか確認します。
一番左の数字が Device Indexです。一番右側の 8桁が Serial Number。

```
$ rtl_test
Found 3 device(s):
  0:  Realtek, RTL2832U, SN: 00001000
  1:  Realtek, RTL2832U, SN: 00001001
  2:  Realtek, RTL2838UHIDIR, SN: 00000001
```
dump1090-faの設定ファイルでは、RTL-SDRを指名できます。--device-index を探す炉初期値が0 になっています。これを上述のコマンドで確認した Device Indexに変更するのが基本です。

```
$ sudo nano /etc/default/dump1090-fa
:
RECEIVER_OPTIONS="... --device-index 0 ..."
:
```
しかしこの方法だと USBの挿す位置を変えたりすると順番がかわります。また OSはこの順番を保証しないと明言しています。別の指定方法は Serial Numberを使うものです。なんと、--device-index に 8桁の数字を指定した場合、それは Serial Numberという意味となる不思議な仕様です。

```
$ sudo nano /etc/default/dump1090-fa
:
RECEIVER_OPTIONS="... --device-index 00000001 ..."
:
```
ところで、Serial Number と言っても、実はユニークな番号になっているわけではなく Serial Number (SN) の初期値はこうなっています。

| SDR  | Serial Number |
|:-----|:--------|
| FA (blue) | 00001090 |
| FA (orange) | 00001000 |
| RTL-SDR.blog v3  | 00000001 |
| RadarBox 978  | 00000001 |
お気づきとは思いますが、同じ種類のドングルは同じ番号になってしまうので、結局区別ができません。
rtl_eeprom というコマンドでドングルの Serial Numberを書き換えることができます。ドングルの中身を書き換えるので慎重に行ってください。一つだけ挿した状態で行うのをお勧めします。

```
$ rtl_eeprom -s 00000002
```
途中で本当に書き換えるのか確認が入ります。実行後に 抜き差ししないと rtl_test の結果には反映されないみたいです。私自身も少し困惑しましたが、指示通り抜き差しすると確かに書き換わっていました。

# RPi一個で複数の dump1090を動かす

dump1090 は最も高性能と言われる dump1090-faを使います。dump1090-faは、一番メンテされているコードで、かつソースも公開されていますので、まだまだこれから進化するでしょう。これは使わないとダメですね。
複数動かす場合、それらを同じ設定で動かすのは意味がありません。複数の系統のそれぞれで最高の設定を追求したいものです。ということで

+ SN:00001090 と SN:00000001 のドングルをつかう
+ 設定ファイルは分けたい
+ Web表示も別々に見たい

という要求になります。
それでは、まず既存の設定(/etc/default/dump1090-fa)をコピーします。そして、3000x というポートアドレスを、別の数字に変更します。私は 3000x を 3300x としました。--device-indexもドングルのSNに合わせておきます。

```
$ sudo cp /etc/default/dump1090-fa /etc/default/dump1090-fa2
$ sudo nano /etc/default/dump1090-fa2
:
NET_OPTIONS="--net --net-heartbeat 60 --net-ro-size 1300 --net-ro-interval 0.2 --net-ri-port 0 --net-ro-port 33002 --net-sbs-port 33003 --net-bi-port 33004,33104 --net-bo-port 33005"
:
RECEIVER_OPTIONS=".... --device-index 00000001 ...."
:
$ sudo nano /etc/default/dump1090-fa
:
RECEIVER_OPTIONS=".... --device-index 00001090 ...."
:
```
つぎに、起動スクリプトを複製します。/etc/default/dump1090-fa という記述が3か所あるので、全て /etc/default/dump1090-fa2 に書き換えます。

```
$ sudo cp -p /usr/share/dump1090-fa/start-dump1090-fa /usr/share/dump1090-fa/start-dump1090-fa2
$ sudo nano /usr/share/dump1090-fa/start-dump1090-fa2
:
if [ -f /etc/default/dump1090-fa2 ]
then
    . /etc/default/dump1090-fa2
fi
:
```
つぎに、systemdの設定を複製します。起動スクリプトと JSON、Syslog の3か所を dump1090-fa2に変更します。

```
$ sudo cp /lib/systemd/system/dump1090-fa.service /lib/systemd/system/dump1090-fa2.service
$ sudo nano /lib/systemd/system/dump1090-fa2.service
:
xecStart=/usr/share/dump1090-fa/start-dump1090-fa2 --write-json %t/dump1090-fa2 --quiet
SyslogIdentifier=dump1090-fa2
:
```

最後に、webページの設定をします。/usr/share/dump1090-fa 以外の dump1090-fa を -fa2 に書き換えます。また、8080 も 8081などに書き換えておきましょう。

```
$ sudo cp /etc/lighttpd/conf-available/89-dump1090-fa.conf /etc/lighttpd/conf-available/89-dump1090-fa2.conf
$ sudo nano /etc/lighttpd/conf-available/89-dump1090-fa2.conf
:
alias.url += (
  "/dump1090-fa2/data/" => "/run/dump1090-fa2/",
  "/dump1090-fa2/" => "/usr/share/dump1090-fa/html/"
)

# redirect the slash-less URL
url.redirect += (
  "^/dump1090-fa2$" => "/dump1090-fa2/"
)

# Listen on port 8081 and serve the map there, too.
$SERVER["socket"] == ":8081" {
  alias.url += (
    "/data/" => "/run/dump1090-fa2/",
    "/" => "/usr/share/dump1090-fa/html/"
  )
}

# Add CORS header
server.modules += ( "mod_setenv" )
$HTTP["url"] =~ "^/dump1090-fa2/data/.*\.json$" {
:
```

設定は全ておわりました。次にサーバーの起動関連です。
最初に、dump1090-fa (2) をサービスとして起動します。

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable dump1090-fa2
$ sudo systemctl start dump1090-fa2
```
Webも有効にします。

```
$ sudo lighty-enable-mod dump1090-fa2
$ sudo service lighttpd force-reload
```
しばらく経てば、http://piaware:8081 (piawareは、RPiのホスト名またはIPアドレス) に飛行機が飛ぶのが見えるようになっているはずです。http://piaware:8080 には既存の SDRが見えていて、FAにもフィードされています。

# 動作画像

以下のような環境で、実験してみました。実験と言うかこれがやりたかったことでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651488/6722a9e5-46f2-bf31-26f6-4f6edc6cf187.png)
それぞれの SDRでゲインの調整を済ませたところ、以下のようなマップ表示になりました。
アンテナとLNAが共通なので、結果的には差はあまりありませんでした。実は相互補完みたいな状態を期待していましたが、結局は右側の RTL-SDR.blog が完全に優勢でした。ノイズ対策とかが優れているんでしょうかね?
![stick_comp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651488/16a30dfb-3e3f-ea98-5afd-04db21391eb9.png)
最後に、しっかり 2つの dump1090-fa が走ってるキャプチャもつけておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651488/0b010c89-d1e3-9ac5-1d7a-9a3064904a94.png)
# おわりに
ご質問とかありましたら、Twitterの @dsoで呼びかけてください。