RTK基地のハンドリングに使っているスクリプト

##RTK基地のハンドリングに使っている小道具メモ

・まえがき
Raspberry PiにRTKLIBやBKG NtripCasterを入れて、RTKに使うデータをハンドリングするための小道具メモ。
間違え等ありましたら、コメントいただけると助かります。

##前提条件
rtklibやntripcasterのインストールは済んでいる

##apt

```bash
$ sudo apt install -y screen
```

##BKG NtripCasterについて

必要最低限の機能しか無いので、使えるだけマシと諦めるのが大事。

・ntripcaster.confの中身が反映されない。
シェルからの起動パスにある./ntripcaster.confというファイル名を参照している環境もあるようです。なので、$HOMEの場所にコピーするとか、shシェルを起動してcd /usr/local/ntripcaster/bin/にコピーして起動するとかの対策が必要。

・ntripcaster.confに書いたテーブルが表示されない。
自動生成なんて便利なものは無いので、sourcetable.datに定義する必要があります。

・sourcetableが表示されないんだけど。
普通にインストールした場合は、

```
/usr/local/ntripcaster/conf/sourcetable.dat.dist
```

に、サンプルがあります。
ファイルをコピーして、中身を自分の環境に合わせて書き換える。

```
/usr/local/ntripcaster/conf/sourcetable.dat
```

中身は受信機の出しているRTCM3と[仕様](https://software.rtcm-ntrip.org/wiki/Sourcetable)を確認しながら書くのが筋だろうけども、面倒なのでrtk2go.comに一旦データを流してソーステーブル表示させてから、コピペという手もあり。

・ブラウザで開いてもsource table見れないんだけど？
http/0.9という太古の昔(Netscapeとかの時代)に使われていたプロトコルを使ってるせい。
srctblbrows.exeではちゃんと表示されます。
Raspberry Pi等で確認したい場合は、古式ゆかしいこんな感じで。

```sh
echo -e "GET /\r\n" | nc localhost 2101
```

IDとPassが必要な場合はこんな感じ。

```
curl -u user:pass http://ntrip-caster:2101/
```

##自動起動
・str2strやNtripCasterを自動起動するには？
/etc/rc.localを使う。

```sh:/etc/rc.local

/usr/loca/ntripcaster/bin/ntripcaster

exit 0 ←これの前に入れる
```

ubuntu20の場合はrc.localがない場合があるのでこちら
・[Ubuntu 20.04 LTS でも rc.local は使える](https://qiita.com/taraijpn/items/2ec3acead27be2f7bd50)


##localhostでntripcaster
###ローカルハードウェアは、いったんNTRIP Casterにまとめる
GPS受信機→シリアルUSB→と接続している場合、localにNTRIP Casterを立てて、sourcelist.datもちゃんと書く。

```/usr/local/bin/ntripcaster/bin/ntripcaster.conf
抜粋
encoder_password pass
/myrtk
```

最下部に追記

```sh:/etc/rc.local
screen -AmdS ntrip-myrtk str2str \
-in serial://ttyACM0:115200 \
-out ntrips://:pass@localhost:2101/myrtk &

exit 0
```

##データ取り
後処理したいubxのデータを、自動でファイルに保存する方法。

/dev/ttyACM0に接続されていて、１時間ごとに前後30秒プラスして、国土地理院風のファイル名にして分ける場合。


```sh:/etc/rc.local

# root権限で動かしたくない場合はsu -u pi をscreenの前に入れる。
screen -AmdS log-myrtk str2str \
-in ntrip://localhost:2101/myrtk \
-out file:///mnt/[your-storage-here]/gps/%Y%m%d%H_myrtk.ubx::S=1 \
-f 30 & > /dev/null 2>&1

```

###ハードウェア構成がカオス化してきた
F9Pだけでも色々実験したくてRTCM3とUBXをUART1,2で出したりしていると、ハードウェアの構成がカオス化しますよね、わかります。
バシッと解決する方法がなかなかありませんが、小技をいくつか貼っておきます。

####USBポートを固定する
https://s-taka.org/identification-of-usb-serial-ports-on-linux/

####F9PにはUARTがせっかく2つあるので使いたい

USBケーブル増えるのでこれオススメ。
https://strawberry-linux.com/catalog/items?code=50028

 F9PのUART2には制約があります

* UART2にUBXは出ない
* 38400bps以下にしちゃダメ。

SimpleRTK2Bの場合

* IOREFを3v3に接続する必要があります。
* TXD2とRXD2が刻印とは逆
* 中央にあるコネクタはxbee互換接続っぽいです。
* 参考:http://nanoappli.com/blog/archives/4191

###IPアドレスを固定したい
いくつか方法がありますが、どれも一長一短。

・AWS
Elastic IPで1個タダで使えるので、EC2のt3.nano（Linux約3700円windows約8000円、投稿時の東京リージョン価格。）あたりの仮想マシンに割り当ててNtripcaster動かす。

・myIPでVPN
https://www.interlink.or.jp/service/myip/
一発でうまく動けばいいけれど、ネットワーク設定の周りでハマると泥沼。

・固定IPプロバイダと契約する
高い。プロバイダによってはタダで付いてくる所もありますが、探さないと出てこない。

・DDNS
昔はたくさんあったけれども、最近ほとんど見なくなったような？
netvolante買えばタダで使えます。

AWS以外の方法は自宅鯖運用になるので色々大変。
自宅の電源や回線トラブル等で簡単に落ちるので、運用難易度は高め。
RaspberryPiでシリアルUSBを使う場合、電源容量不足で悩まされるのでPi3,Pi4をオススメします。（強調）

###UBXデータをRTCM3に変換してRTCM1005を混ぜる
Facebookで教えてもらった方法。なぜかF9Pモジュールから出てくるRTCM3の出力にはQZSSが含まれないので、UBXから変換してQZSSのデータをRTCM3に入れこみます。
・ntripcasterでmyrtk-rtcm3を作っておきます。
UBXフォーマットの中にはRTCM1005が含まれないので、-pで付与します。

```sh
/str2str -in ntrip://user:pass@localhost:2101/ubxdata:#ubx \
-out ntrips://:pass@localhost:2101/myrtk-rtcm3#rtcm3 \
-msg "1005(10),1019(1),1020(2),1042(2),1044(2),1046(1),1077(1),1087(1),1097(1),1117(1),1127(1),1227(1)" \
-p 42.88 141.61 53.10
```

一部の人にはRTCM1008が必要。使う人は1005(10)のあとあたりに、1008(10),を書き足してください。

###リバースプロキシ経由にしたい
ネットワークの都合とかでバーチャルホストやhttpsで通したいとかの場合。
https://cpoint-lab.co.jp/article/201711/251/

##「NTRIP Caster」 と 「tcpsvr」 どっちがいい？
結論から言うと自分のおすすめはNTRIP Casterです。
最初から使おうとすると混乱するので、tcpsvrで慣れてからNTRIP Casterをオススメします。

###tcpsvr

|良い点|悪い点|
|:---:|:--:|
|str2strで設定するだけで使える|外部から使おうとすると、ルーターのポート開放が面倒くさい|
LANとかで一時的に実験として使うなら便利ですが、しばらくするとどの番号に何割り振ったのかわからなくなる。

###Ntrip Caster

|良い点|悪い点|
|:---:|:--:|
|１つのポートで送受信できる|構築が面倒くさい|
繰り返しになりますが、BKG NtripCasterが必要最低限の機能しか無いので、使えるだけマシ。
str2strにも一応は機能として入っていますが、2ポート使うので微妙に使いにくい。
古いソースの~/RTKLIB/app/str2str/run_cast.shに起動スクリプトあるので、中身見てみると使い方はわかると思います。
（なんだかんだ言っても、SNIPは商用ソフトだけあって流石に便利です。）


##inject RTCM1008
一部界隈の人には必要なRTCM1008を挿入するプログラム。

https://agopengps.discourse.group/t/injekt-rtcm-1008/454/30

上記フォーラムからのコピペ

<details><summary>addrtcm1008.py</summary><div>

```python
#!/usr/bin/python3

    import sys

    while True:
    data = sys.stdin.buffer.read(1)
    while (data != b'\xd3'):
        data = sys.stdin.buffer.read(1)

    length_data = sys.stdin.buffer.read(2)
    length = ((length_data[0] & 0b00000011) << 8) + length_data[1]
    packet_data = sys.stdin.buffer.read(length)
    crc24_data = sys.stdin.buffer.read(3)

    if length >= 2:
        message_number = (packet_data[0] << 8) + packet_data[1]
        message_number >>= 4

    sys.stdout.buffer.write(b'\xd3')
    sys.stdout.buffer.write(length_data)
    sys.stdout.buffer.write(packet_data)
    sys.stdout.buffer.write(crc24_data)
    sys.stdout.flush()

    if message_number == 1005:
        # 1008 message: ADVNULLANTENNA (station id =0)
        sys.stdout.buffer.write(bytes([0xd3,0x00,0x14,0x3f,0x00,0x00,0x0e,0x41,0x44,0x56,0x4e,0x55,0x4c,0x4c,0x41,0x4e,0x54,0x45,0x4e,0x4e,0x41,0x00,0x00,0x79,0x06,0x89]))

        sys.stdout.flush()
```

</div></details>

使い方はこんな感じらしい。（まだ実験できてないので人柱募集中）

```sh
./str2str -in serial://ttyACM0 | ./addrtcm1008.py | ./str2str -out ntrips://:testi@raspberrypi:2101/WITH1008
```