NTRIP CasterServer の構築

# はじめに

RTKと呼ばれるcm単位精度で測位可能なGNSS(全球測位衛星システム：一般にGPSと呼ばれることが多い)の測位方法がある。このRTKは、「相対測位」と呼ばれる測定方法で、固定局と移動局の2つの受信機の間で情報をやりとりして補正することで、単独測位よりも精度の高い位置情報を得ることができ、農機や建設機械、ドローンの自動航行など、正確な位置情報を求められる分野で活用が期待されています。

このRTK測位では基準局からのデータを移動局で利用しますが、このデータを中継する Casterサーバを用いることで、より効率的・安定定的に測位が可能となります。このCasterサーバとして、無料の[rtk2go](http://www.rtk2go.com/)を利用する以外に、自ら設置することができます。

Ntrip Casterと呼ばれるCasterサーバのソースは、有償で[BKG Professional Caster](https://igs.bkg.bund.de/ntrip/bkgcaster)が購入できるほか、[github](https://github.com/)にいくつかのプロジェクトがあり、[dockerに対応したもの](https://github.com/charlesquick/ntripcaster-containerised)、や、[goによる実装](https://github.com/go-gnss/ntrip)などが入手可能です。このメモでは、Recentry updated で一番上に表示された、[T.Suenaga氏のプロジェクト](
https://github.com/tomohirosuenaga/ntripcaster)を利用しました。

BKG社の有償のソースはバージョンが上がってますが、同等の手順で構築可能です。具体的にソースのどの部分が改良されているかは把握していません。

## 動作環境

- UbuntuServer 20.04LTS
- NtripCaster Version 0.1.5 (githubから取得）

# Ubuntuの設定

## OSのバージョン確認

```
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
```

## パッケージ類のアップデートと必要なパッケージのインストール

```
$ apt update
$ apt upgrade
```

一時的なものだと思うが、glibの依存関係で g++ のインストールに失敗していたので、glibc6をロールバック。
emacsは省略可

```
$ apt install emacs
$ apt install git make gcc rtk-lib
$ apt install g++
----エラー----
$ apt install libc6=2.31-0ubuntu9.2
$ apt install g++
```

## 作業用ユーザアカウントの作成

```
$ adduser foo
```

$HOME/.ssh/　に公開鍵を保存。対応する秘密書を用いてSSHアクセスできる様にしておく。

## sshの設定

/etc/ssh/sshd_configの以下の３箇所を修正。port変更は省略可。

```
Port 65522
PermitRootLogin no
PasswordAuthentication no
```

sshd を再起動すると、**秘密公開鍵を設定していないとログインできないので、事前に動作確認しておくこと**。

```
systemctl restart sshd
```

## ファイヤーウォールの設定

ポート10050は、Zabbix監視用なので省略可。

```
＄ sudo ufw status
Status: inactive
$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$ sudo ufw allow 2101/tcp
Rules updated
Rules updated (v6)
$ sudo ufw allow 10050/tcp
Rules updated
Rules updated (v6)
$ sudo ufw allow 65522/tcp
Rules updated
Rules updated (v6)
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
```

設定内容の確認

```
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
2101/tcp                   ALLOW       Anywhere                  
10050/tcp                  ALLOW       Anywhere                  
65522/tcp                  ALLOW       Anywhere                  
2101/tcp (v6)              ALLOW       Anywhere (v6)             
10050/tcp (v6)             ALLOW       Anywhere (v6)  
65522/tcp (v6)             ALLOW       Anywhere (v6)             
```

別途、利用しているネットワーク環境でポート2101への通信ができることを確認し、さくらのVPSならばコントロールパネルで「パケットフィルタ」の設定で2101を開放、などの必要な設定を行う。

# NtripCasterの導入

## ソースの取得

今回は、githubで公開されているソースを利用

```
$ https://github.com/tomohirosuenaga/ntripcaster.git
```

## コンパイル

```
$ cd ntripcaster
$ ./configure  --prefix=/usr/local/ntripcaster
[snip]
Ok, everything seems ok. Now do 'make'.
You can then run make install to install as you specified
$ make
[snip]
gcc  -g -O2 -Wall  -o ntripcaster  main.o client.o source.o connection.o log.o sock.o threads.o utility.o avl.o timer.o ntrip_string.o  -lm  -lpthread
[snip]
make[2]: Leaving directory '/home/foo/work/ntripcaster'
```

## インストール

```
$ sudo make install
[snip]
```

正常すれば、--prefix で指定したディレクトリに以下の４ファイルが配置される
```
bin/ntripcaster
conf/mountpos.conf.dist
conf/ntripcaster.conf.dist
conf/sourcetable.dat.dist
```

# NtripCasterの設定

## 設定ファイルのコピー

```
$ cd /usr/local/ntripcaster
$ sudo cp mountpos.conf.dist mountpos.conf
$ sudo cp ntripcaster.conf.dist ntripcaster.conf
$ sudo cp sourcetable.dat.dist  sourcetable.dat
```

## NTRIP caster の設定 ntripcaster.conf 

以下の部分を修正

```
location JPTEST
rp_email info@example.com
server_url http://[host]

port 2101
#port 8000
```

## NTRIP serverリスト sourcetable.dat 

u-blox ZED-F9Pを接続する場合は以下の行を追加

```
STR;MYPOINT;myref;RTCM3.0;.....;2;GPS+GLONASS+Galileo+Beidou;;JPN;34.40;135.50;0;0;u-bloxZED-F9P;none;N;N;8000;Demo
```

マウントポイント、及び緯度軽度は適当です。

# 動作確認

## Ntirp キャスターの起動

サービスの起動

```
$ cd /usr/local/ntripcaster/bin
$ ./ntripcaster 
NtripCaster Version 0.1.5 Initializing...
NtripCaster comes with NO WARRANTY, to the extent permitted by law.
  :
```

ポート2101のプロセスを確認

```
$ lsof -i:2101 -P
COMMAND     PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ntripcast 10370      foo    5u  IPv4  48966      0t0  TCP *:2101 (LISTEN)
```

継続運用するなら、systemctlで管理できるservice化をしておく方が良い。

## Ntirp サーバからの接続

テスト用に善意の基準局サーバを使わせていただく場合、下記コマンドの -in を ntrip://RTK2go.com:2101/XXXX （XXXXは要修正）とし、登録先のパスワードは、ntripcaster.confで設定したもの、ホスト名はキャスターが動いているサーバに変更。

```
$ str2str -in [ntrip uri] -out ntrips://:[password]@[host]:2101/MYPOINT
stream server start
2021/05/12 00:20:29 [-----]          0 B       0 bps 
2021/05/12 00:20:34 [CC---]       1620 B    2628 bps (0) [utrip uri] (1) [host]/MYPOINT
  :
```

**これは一時的なテスト用**であり、実際にはタイムラグによりRTK測位ができない可能性が高い。

## Ntrip クライアントからの接続 

```
$ str2str -in ntrip://www.geortk.jp:2101/MYPOINT -out file://./ntriptest.log
stream server start
2021/05/12 00:54:36 [-C---]          0 B       0 bps 
2021/05/12 00:54:41 [CC---]       1475 B    2400 bps (0) www.geortk.jp/MYPOINT 
2021/05/12 00:54:46 [CC---]       3062 B    2745 bps (0) www.geortk.jp/MYPOINT 
```

## マウントポイントの確認

以下のコマンドで、sourcetable.dat の内容が確認できるが、httpプロトコルが古いため、ほとんどのブラウザでは表示できない。

```
curl http://[host]：２０２１
```

# 参考

## 参考リンク
* [Ntrip - Networked Transport of RTCM via Internet Protocol](https://igs.bkg.bund.de/ntrip/)
* https://github.com/tomohirosuenaga/ntripcaster
* [RTKに必要な基準局を設置してみよう！](https://qiita.com/Ogawa_AITOYA/items/cd3fc1b8bb86700dafe5)
* [自分用のNTRIP caster をたてる](https://qiita.com/XPT60/items/29d2d3575d3e42462387)
* [NTRIPのSourcetable](https://blog.goo.ne.jp/osqzss/e/6b2892e46515b30bb3a3dcea5f6221c0)