自分用のNTRIP caster をたてる

# はじめに

RTKで必要となる補正情報ですが、データ形式はRTCMv3、プロトコルではNTRIPを使うのが一般的です。
NTRIPでは　基準局(=NTRIP server) --> 中継 (= NTRIP caster) --> 移動局 (= NTRIP client) とデータを送ります。
NTRIP server やNTRIP client は、[RTKLIB](https://github.com/tomojitakasu/RTKLIB)というオープンソースで利用できます。が、NTRIP caster を自分で用意するための情報は少ない感じがします。（なぜトラ技とかで紹介されないんですか）。よくある情報は、以下の通りです。

- rtk2go([http://www.rtk2go.com/](http://www.rtk2go.com/)) に基準局を登録できるらしい
- [SNIP](https://www.use-snip.com/download/)のお試し版をダウンロードして、Windowsソフトを利用する

SNIPは動かしてみましたが、Windows マシンでずっと動かすのは何となく面倒です。一方で、BKGのopen source があるようです。
今回、それを使ってNTRIP caster を立てたので、メモです。

なお、NTRIP などについては、いろいろな説明の記事があります。

- [RTKに必要な基準局を設置してみよう！](https://qiita.com/Ogawa_AITOYA/items/cd3fc1b8bb86700dafe5)
- [NTRIPのSourcetable](https://blog.goo.ne.jp/osqzss/e/6b2892e46515b30bb3a3dcea5f6221c0)
- https://igs.bkg.bund.de/ntrip/bkgcaster

## 作業の概要

Linuxマシンを用意します。Raspberry Pi4, Jetson Nano, WSLで動かしました。すべてubunu18.04ですが、クラウドでも動くと思います。
作業は以下の流れです。

- ソースをダウンロードしてビルドする。
- 設定ファイル(ntripcaster.conf)を編集する
- 接続する基準局のリスト(sourcetable.dat)を編集する
- ntripcaster を起動する

Linuxとしてはサービスに登録するとかできると思いますが、とりあえず起動させたところまでしか動作確認できていません。

- ntripcaster.git の README.md の内容
- メモ(https://zhuanlan.zhihu.com/p/74739525)

などに書いている手順で動きます。以下は自分が行ったメモです。

## 動作確認

### 動作確認の環境（というか注意...）

ここでは、git repository から持ってきたソースをコンパイルし、```/opt/ntripcaster/```以下にインストールして使いました。

先にファイルの配置は、以下のようになるイメージです。。

```
$ tree /opt/ntripcaster/
/opt/ntripcaster/
├── bin
│   └── ntripcaster
├── conf
│   ├── mountpos.conf
│   ├── ntripcaster.conf
│   ├── sourcetable.dat
...
```

また、プログラムの都合上、実行するときは、所定のディレクトリで実行させました。デフォルトの設定ファイルを相対パスでハードコーディングしているので、実行する位置が関係するようです。

```
$ cd /opt/ntripcaster/bin
$ sudo ./ntripcaster
```
 
### 動作確認：インストール

- ここではインストールするフォルダを /opt/ntripcaster にしている。

```
$ sudo mkdir /opt/ntripcaster
```

- ソースを入手してビルドする。/opt/ntripcaster/bin にインストールされます。

```
$ git clone https://github.com/baidu/ntripcaster.git
$ cd ntripcaster
$ ./configure  --prefix=/opt/ntripcaster
$ make
$ sudo make install
```

make install したときのログは下記の通りで、一式、/opt/ntripcaster にコピーされるようです。

```
$ sudo make install
/bin/sh ../mkinstalldirs /opt/ntripcaster/bin
mkdir /opt/ntripcaster
mkdir /opt/ntripcaster/bin
  /usr/bin/install -c  ntripcaster /opt/ntripcaster/bin/ntripcaster
make[2]: Nothing to be done for 'install-data-am'.
Making install in conf
make[2]: Nothing to be done for 'install-exec-am'.
/bin/sh ../mkinstalldirs /opt/ntripcaster/conf
mkdir /opt/ntripcaster/conf
 /usr/bin/install -c -m 644 ./ntripcaster.conf.dist /opt/ntripcaster/conf/ntripcaster.conf.dist
 /usr/bin/install -c -m 644 ./sourcetable.dat.dist /opt/ntripcaster/conf/sourcetable.dat.dist
 /usr/bin/install -c -m 644 ./mountpos.conf.dist /opt/ntripcaster/conf/mountpos.conf.dist
mkdir -p /opt/ntripcaster/logs
```

### 動作確認：設定

- NTRIP caster の設定 (ntripcaster.conf)

```
cd /opt/ntripcaster/conf
sudo cp ntripcaster.conf.dist ntripcaster.conf
```

コピーして、編集します。

基本的に書いてある通りに編集すればよいです。サーバのアドレス(server_url, server_name)とポート番号を2101に設定しました。本当は、それ以外も編集すべきですが、横着してここだけでとりあえず動かしました。どこかにご迷惑をおかけしていたら申し訳ありません。

- NTRIP server として受け付ける基準局(sourcetable.dat)
  サンプルをコピーして編集します。

```
cd /opt/ntripcaster/conf
sudo cp sourcetable.dat.dist sourcetable.dat
```

例えば、u-blox ZED-F9Pを接続したかったら、

```
STR;MYPT;myref;RTCM3.0;.....;2;GPS+GLONASS+Galileo+Beidou;;JPN;35.00;140.00;0;0;u-bloxZED-F9P;none;N;N;8000;Demo
```

のように書けばよいです。mountpoint 名、緯度経度の概略値など適当です。自分はＣＱ出版社様が提供してくださっている善意の基準局を転送してテストしました。

### 動作確認：Ntrip caster を実行

NTRIP caster のbin ディレクトリに移動してから実行します。

```
$ cd /opt/ntripcaster/bin
$ ./ntripcaster
[05/Jan/2021:19:53:12] WARNING: Could not open logfile ./ntripcaster.log for writing, damn!
NtripCaster Version 0.1.5 Initializing...
NtripCaster comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of NtripCaster under the terms of the
GNU General Public License.
For more information about these matters, see the file named COPYING.
Starting thread engine...
[05/Jan/2021:19:53:12] NtripCaster Version 0.1.5 Starting..
[05/Jan/2021:19:53:12] Using stdout as NtripCaster logging window
[05/Jan/2021:19:53:12] Starting main connection handler...
[05/Jan/2021:19:53:12] WARNING: Resolving the server name [testntrip] does not work!
[05/Jan/2021:19:53:12] Listening on port 2101...
[05/Jan/2021:19:53:12] Using 'testntrip' as servername...
[05/Jan/2021:19:53:12] Server limits: 100 clients, 100 clients per source, 40 sources
[05/Jan/2021:19:53:12] Starting Calender Thread...
[05/Jan/2021:19:53:12] Bandwidth:0.000000KB/s Sources:0 Clients:0
```

### 接続確認(1) source table の取得

別のターミナル（ここではWAL1のubuntu18.04)を立ち上げて、ローカルサーバであるNTRIP casterにアクセスする。

```
$ curl -v http://127.0.0.1:2101
* Rebuilt URL to: http://127.0.0.1:2101/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 2101 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:2101
> User-Agent: curl/7.58.0
> Accept: */*
>
SOURCETABLE 200 OK
Server: NTRIP NtripCaster 0.1.5/1.0
Content-Type: text/plain
Content-Length: 633

CAS;www.euref-ip.net;2101;EUREF-IP;BKG;0;DEU;50.12;8.69;http://www.euref-ip.net/home
CAS;rtcm-ntrip.org;2101;NtripInfoCaster;BKG;0;DEU;50.12;8.69;http://www.rtcm-ntrip.org/home
NET;EUREF;EUREF;B;N;http://www.epncb.oma.be/euref_IP;http://www.epncb.oma.be/euref_IP;http://igs.ifag.de/index_ntrip_reg.htm;none
NET;IGS;BKG;B;N;http://igscb.jpl.nasa.gov/;none;http://igs.ifag.de/index_ntrip_reg.htm;none
STR;BUCU0;Bucharest;RTCM 2.0;1(1),3(60),16(60);0;GPS;EUREF;ROU;44.46;26.12;0;0;Ashtech Z-XII3;none;B;N;520;TU Bucharest
STR;MYPT;myref;RTCM3.0;.....;2;GPS+GLONASS+Galileo+Beidou;;JPN;35.00;140.00;0;0;u-bloxZED-F9P;none;N;N;8000;Demo
ENDSOURCETABLE
* Connection #0 to host 127.0.0.1 left intact
```

最後の一行で、編集した sourcetable.dat が読まれていることが分かる。

### 接続確認(2) NTRIP serverをつなぐ

RTKLIB に含まれている str2str というコマンドラインツールを使って接続確認をしました。

ntripcaster.conf でデフォルトのパスワードのままでローカルで動かしたので、以下でできました。フリーで提供されているNTRIP caster にNTRIP client として受信したものを、今回立てたNTRIP caster にNTRIP server として送っています。

```
$ str2str -in ntrip://XXX.XXX.XXX.XXX:2101/CQ-F9P -out ntrips://:password@127.0.0.1:2101/MYPT
stream server start
2021/01/05 11:06:31 [-----]          0 B       0 bps
2021/01/05 11:06:36 [CC---]       4684 B    7560 bps (0) 160.16.134.72/CQ-F9P (1) 127.0.0.1/MYPT
2021/01/05 11:06:41 [CC---]       9372 B    7560 bps (0) 160.16.134.72/CQ-F9P (1) 127.0.0.1/MYPT
2021/01/05 11:06:46 [CC---]      14107 B    7760 bps (0) 160.16.134.72/CQ-F9P (1) 127.0.0.1/MYPT
```

と、確かにMYPT というアクセスポイントにつながります。なお、ここでパスワードを password としているのは、ntripcaster.conf にそのように書いてあるからです。

./ntripcaster しているほうには、

```
[05/Jan/2021:20:06:12] Accepted encoder on mountpoint /MYPT from 127.0.0.1. 1 sources connected
[05/Jan/2021:20:06:31] Bandwidth:0.000000KB/s Sources:1 Clients:0
```

とログが出力されます。

### 接続確認(3) 作ったマウントポイントにNTRIP client を接続する

```
$ str2str -in ntrip://127.0.0.1:2101/MYPT -out file://./ntriptest.log
stream server start
2021/01/05 11:12:47 [-C---]          0 B       0 bps
2021/01/05 11:12:52 [CC---]       4656 B    7549 bps (0) 127.0.0.1/MYPT
2021/01/05 11:12:57 [CC---]       9344 B    7553 bps (0) 127.0.0.1/MYPT
```

ここでは、きちんと ntriptest.log にNTRIP client として受信したデータが保存されています。（バイナリなので、表示してもあれですが。。^^;)

```./ntripcaster```しているほうでは、NTRIP cleint を接続してから切る(Ctrl-Cでいきなり遮断)まで、以下のようなログが出力されました。

```
[05/Jan/2021:20:17:13] Accepted client 3 [(null)] from [127.0.0.1] on mountpoint [/MYPT]. 1 clients connected
[05/Jan/2021:20:17:31] Bandwidth:0.950000KB/s Sources:1 Clients:1
[05/Jan/2021:20:18:07] Kicking client 3 [(null)] [127.0.0.1] [Client signed off] [listener], connected for 54 seconds, 50892 bytes transfered. 0 clients connected
```

上記のログで(null)が気になりますが、null pointer を printf しようとしているのでしょうか。なんだか怖い気も。。。

以上で、NTRIP caster を立てて、独自にマウントポイントを定義し、実際にNTRIP server と NTRIP client が接続できることを確認しました。

# NTRIP Caster に関連した情報メモ

いつも必要になるたびに調べては、それらの内容もリンクも亡失してしまうので、ここでメモします。

### NTRIP Caster 

フリーで提供されているNTRIPは、以下から適当なものを使えます。公開していただいている皆様に感謝です。

- [Real-Time GNSS Data Streams From IGS-IP Ntrip Broadcaster at www.igs-ip.net:80](https://igs.bkg.bund.de/root_ftp/NTRIP/streams/streamlist_igs-ip.htm)
- [善意の基準局掲示板](http://rtk.silentsystem.jp/index.php)

### source table 

http で接続すると返されてくる、あのsource tableです。これ見ると分かるけれど、別にデータはRTCMでなくても良い仕様になっている。

- https://blog.misatowater.com/entry/tech/ntrip/sourcetable-format
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/3b4b7fee-5e4c-e66b-4510-021cb3e012dd.png)

- http://epncb.oma.be/_documentation/guidelines/guidelines_data_centres.pdf


# まとめ

とりあえず動かせているのですが、何かと不安定です。パスに依存するファイルを参照するプログラムになっているような気がします（違うかも）ので、ソースを見ないと正しく使いこなせない気もします。ソースを再接続したときなど、source の数がインクリメントされているので何か変な気もします。

- 設定ファイルを正しく使う
- 認証機能を正しく使う

が次のステップですが、これ以外にも


- hanoi404さんの [https://github.com/sevensace/ntrip](https://github.com/sevensace/ntrip)これからをこれを薦めたい気がする。テストコードはそのまま全て動いた。caster/server/client 全てこみこみ。
- go でのNTRIP 実装 (https://github.com/go-gnss/ntrip/)
- 先程使用したBKGのntripcasterをdocker にしたもの(https://github.com/goblimey/ntripcaster)

もあるので、こちらも見てみたいと思います。GOでの実装か。わかる人には軽くできる作業なのかな。
とりあえず以上です。
(2020/10/20)

### 編集

- 2020/10/24 source table に関するリンクを追加。
- 2021/1/2 その後、しっかりとした実装としてhanoi404さんの　https://github.com/sevensace/ntrip　を追記。
- 2021/1/5 NTRIP caster の接続テストを書き直した。再度テストを行い、出力ログも掲載。