◆Raspi3でGPS-NTPサーバ
シリーズ「GPS-NTP」
- ◆Raspi3でGPS-NTPサーバ〇
- ◇電波時計用NTPリピータ
- ◇GPS+PPSでNTPサーバを立てる
- ◇自動GPS-システム時計強制同期
- ◇GPS,PPSとインターネット上のNTPサーバの比較
- ◇GPS,GPS+PPSを使うNTPサーバの調整
ー - -
Raspi3をGPSを用いたntpサーバにします。
- USB接続のGPSレシーバを接続
- GPSツールの導入
- ntpd(クライアント&サーバ)の導入
- 別raspiマシンから参照する
- 別マシン(Windows)から参照する
- 電波時計用NTPリピータから参照する
- 残項目:pts時刻を手動でGPSに合わせる
- PPSについて
設定ファイル
USB接続のGPSレシーバを接続
USB接続のGPSレシーバ「GLOBALSAT BU-353S4」を購入しました。
Windows用のドライバDVDなどが付いていますが今回はこれをRaspberryPi3に繋ぎます。
RaspberryPi3はNOOBS_v2_4_4のデフォルトOSで立ち上げました。
とりあえず、USBポートに挿しlsusbで確認します。
$ lsusb
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 005: ID 1c4f:0027 SiGma Micro
Bus 001 Device 004: ID 0557:8021 ATEN International Co., Ltd
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 10月 25 22:09 /dev/ttyUSB0
cuコマンドでアクセスするとNMEA-0183フォーマットのデータが得られます。
なおcuコマンドの終了は~.(チルダドット)です。
$ sudo chmod 0666 /dev/ttyUSB0 $ cu -s 4800 -l /dev/ttyUSB0 Connected. ,N,#経度データ#,E,0.77,202.78,291017,,,A*6E $GPGGA,060352.000,#緯度データ#,N,#経度データ#,E,1,06,1.5,78.1,M,39.3,M,,0000*6B $GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A $GPRMC,060352.000,A,#緯度データ#,N,#経度データ#,E,0.71,202.78,291017,,,A*69 $GPGGA,060353.000,#緯度データ#,N,#経度データ#,E,1,06,1.5,78.2,M,39.3,M,,0000*69 $GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A $GPRMC,060353.000,A,#緯度データ#,N,#経度データ#,E,0.94,202.78,291017,,,A*63 $GPGGA,060354.000,3542.1872,N,#経度データ#,E,1,06,1.5,78.3,M,39.3,M,,0000*60 $GPGSA,A,3,13,05,15,02,29,21,,,,,,,2.5,1.5,2.0*3A $GPRMC,060354.000,A,#緯度データ#,N,#経度データ#,E,1.15,202.78,291017,,,A*63 $GPGGA,060355.000,#緯度データ#2,N,#経度データ#,E,1,06,1.5,78.4,M,39.3,M,,0000*6
GPSツールの導入
インストール
$ sudo apt-get update
$ sudo apt-get install gpsd gpsd-clients python-gps
$ sudo reboot
gpsd設定
dpkg-reconfigureはうまく動作しないため、設定ファイル(/etc/default/gpsd)を直接編集します。
$ sudo vi /etc/default/gpsd --- # Default settings for the gpsd init script and the hotplug wrapper. # Start the gpsd daemon automatically at boot time START_DAEMON="true" # Use USB hotplugging to add new USB devices automatically to the daemon USBAUTO="false" # Devices gpsd should collect to at boot time. # They need to be read/writeable, either by user gpsd or the group dialout. DEVICES="/dev/ttyUSB0" # Other options you want to pass to gpsd GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n" ---
gpsdサービスの起動と確認
$ sudo systemctl enable gpsd $ sudo systemctl start gpsd $ sudo systemctl status gpsd ● gpsd.service - GPS (Global Positioning System) Daemon Loaded: loaded (/lib/systemd/system/gpsd.service; indirect; vendor preset: en Active: active (running) since Sun 2017-10-29 16:15:22 JST; 5min ago Main PID: 1393 (gpsd) CGroup: /system.slice/gpsd.service mq1393 /usr/sbin/gpsd -N 10月 29 16:15:22 raspi01 systemd[1]: Started GPS (Global Positioning System) Daem
gpsdデータ取得確認
$ cgps -s
+----------------------------------------++---------------------------------+
| Time: 2017-10-29T07:26:19.587Z ||PRN: Elev: Azim: SNR: Used: |
| Latitude: ##.###### N || 5 46 114 17 Y |
| Longitude: ###.###### E || 24 39 206 17 Y |
| Altitude: 93.7 m || 18 15 308 16 Y |
| Speed: 3.6 kph || 2 02 167 05 N |
| Heading: 31.7 deg (true) || 21 33 297 06 N |
| Climb: 0.0 m/min || 20 77 332 00 N |
| Status: 3D FIX (14 secs) || 15 63 315 00 N |
| Longitude Err: n/a || 13 57 030 00 N |
| Latitude Err: n/a || 4 44 045 00 N |
| Altitude Err: +/- 73 m || 28 14 063 00 N |
| Course Err: n/a || 30 07 040 00 N |
| Speed Err: n/a || 144 00 306 00 N |
| Time offset: -2.525 || |
| Grid Square: PM95sq || |
+----------------------------------------++---------------------------------+
(終了はq)
または
$ gpsmon
tcp://localhost:2947 NMEA0183>
+---------------------------------------------------------------------------+
|Time: 2017-10-29T07:28:09.587Z Lat: ## ##' ##.###" N Lon: ### ##' ##.###" E|
|--------------------------------- Cooked TPV ------------------------------|
+---------------------------------------------------------------------------+
| GPGSV GPRMC GPGGA GPGSA |
+--------------------------------- Sentences -------------------------------+
+------------------++----------------------------++-------------------------+
|Ch PRN Az El S/N ||Time: 072814.587 ||Time: 072815.587 |
| 0 2 167 1 4 ||Latitude: ####.#### N ||Latitude: ####.#### |
| 1 5 115 45 10 ||Longitude: #####.#### E ||Longitude: #####.#### |
| 2 13 31 56 4 ||Speed: 0.004 ||Altitude: 101.0 |
| 3 15 318 64 5 ||Course: 338.43 ||Quality: 0 Sats: 00 |
| 4 24 207 40 25 ||Status: V FAA: N ||HDOP: 1.6 |
| 5 20 333 78 0 ||MagVar: ||Geoid: 39.3 |
| 6 4 45 43 0 |+----------- RMC ------------++----------- GGA ---------+
| 7 21 296 34 0 |+----------------------------++-------------------------+
| 8 18 309 16 0 ||Mode: A1 Sats: ||UTC: RMS: |
| 9 28 62 14 0 ||DOP: H=1.6 V=2.7 P=3.1 ||MAJ: MIN: |
|10 30 40 6 0 ||TOFF: -2.522070403 ||ORI: LAT: |
|11 144 306 0 0 ||PPS: ||LON: ALT: |
+------ GSV -------++-------- GSA + PPS ---------++----------- GST ---------+
(終了はq)
不思議なことに途中からNMEA0183ではなくSiRFとなった
$ gpsmon
/dev/ttyUSB0 SiRF>
+----------- X ------ Y ------ Z --------- North ---- East --- Alt ---------+
|Pos: -####### ####### ####### m ##.##### ###.##### 234 m |
|Vel: -0.4 -0.1 -0.2 m/s -0.3 0.3 0.0 climb m/s|
|Time: 2017-11-12T07:50:00.000Z Leap: ?? Heading: 133.6f 0.5 speed m/s|
|Fix: 5 = 24 15 18 21 10 HDOP:2.6 M1: 84 M2: 02|
+----------------------- Packet type 2 (0x02) ------------------------------+
l Measured Tracker ----------++ Firmware Version ---------------------------+
|Ch PRN Az El Stat C/N ? SF|| |
| 0 20 157 62 00ad 16.8 |+------- Packet Type 6 (0x06) ----------------+
| 1 21 253 30 00bf 35.7 T |l CPU Throughput -----------------------------+
| 2 24 244 77 00ad 23.3 ||Max: 0.000 Lat: 0.000 Time: 0.000 MS: 0 |
| 3 18 309 45 00ad 24.7 |+------- Packet type 9 (0x09) ----------------+
| 4 5 139 14 00ad 19.2 |l Clock Status -------------------------------+
| 5 15 45 62 00ad 17.2 ||SVs: Drift: Bias: |
| 6 13 67 31 0000 0.0 ||GPS Time: PPS: |
| 7 10 315 15 00bf 27.4 T |+------- Packet type 7 (0x07) ----------------+
| 8 193 307 7 002d 22.2 |+ Visible List -------------------------------+
| 9 12 162 19 0000 0.0 || |
|10 28 33 5 0000 0.0 |+------- Packet type 13 (0x0D) ---------------+
|11 128 249 18 00bf 37.8 T |l DGPS Status --------------------------------+
+--- Packet Type 4 (0x04) ---+| |
+------- Packet type 27 (0x1B) ---------------+
(終了はq)
良く見るとNMEA0183はtcp://localhost:2947となっており、
SiRFは/dev/ttyUSB0となっています。
gpsdサービスの自動起動
本来はsystemctlの設定でシステムboot時に自動起動されるか、ntpからのアクセス時に起動されるはずですが、起動されないので/etc/rc.localで強制起動させます。
$ sudo vi /etc/rc.local --- ... systemctl start gpsd exit 0 --- $ sudo reboot .. $ ps -ea | grep gbs (確認)
なお、次の操作を行うと/etc/rc.localの設定なしで起動することは確認できましたが、動作が不安定となりました。
sudo ln -s /lib/systemd/system/gpsd.service \ /etc/systemd/system/multi-user.target.wants/
ntpd(クライアント&サーバ)の導入
ntpdはクライアントとサーバの両機能を持ちます。
クライアントとして他のサーバに問い合わせる設定は外し、
クライアントとしてGPSの情報で時刻を取得する設定と、サーバとして他からの問い合わせに答える設定を追加します。
インストール
$ sudo apt-get install ntp $ sudo reboot
クライアント基本動作の確認
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== 0.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.001 1.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.001 2.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.001 3.debian.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.001 2404:1a8:1102:: .STEP. 16 u - 64 0 0.000 0.000 0.000 2404:1a8:1102:: .STEP. 16 u - 64 0 0.000 0.000 0.000 +y.ns.gin.ntt.ne 249.224.99.213 2 u 1 64 77 16.458 6.536 12.531 *marisa.jp.futa. 103.1.106.69 2 u 66 64 37 27.350 -11.807 9.745 +chobi.paina.net 131.113.192.40 2 u 9 64 37 8.355 10.494 15.562 +marisa.jp.futa. 103.1.106.69 2 u 53 64 37 44.904 -15.457 8.640 $ date 2017年 10月 29日 日曜日 17:16:32 JST
ntpdでGPSのデータを参照する設定
/etc/ntp.confを編集します。デフォルトのserver指定は全て削除します。
$ sudo cp /etc/ntp.conf /etc/ntp.conf.org $ sudo vi /etc/ntp.conf --- 以下6行で全てです driftfile /var/lib/ntp/ntp.drift server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 refid GPS stratum 3 restrict 127.0.0.1 restrict ::1 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap --- $ sudo reboot127.127.28.0がGPSとやり取りをする共有メモリを表す表現らしいです。
fudge指定のstratum 3はGPSを信頼するレベルの指定です。
restrictはntpサーバとしての設定です。
ntpdがGPSデータを参照しているか確認
$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*SHM(0) .GPS. 3 l 3 16 201 0.000 253.731 253.731
2404:1a8:1102:: .STEP. 16 u - 64 0 0.000 0.000 0.000
2404:1a8:1102:: .STEP. 16 u - 64 0 0.000 0.000 0.000
SHM(0)の前に'*'が付いていれば正常に動作しています。詳細なstatusはsystemctl status ntpで得られます。
$ sudo systemctl status ntp ● ntp.service - LSB: Start NTP daemon Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled) Active: active (running) since Sun 2017-10-29 18:11:47 JST; 2min 44s ago Docs: man:systemd-sysv-generator(8) Process: 636 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS) Process: 648 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS) CGroup: /system.slice/ntp.service mq661 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -c /run/ntp.conf.dhcp -u 10月 29 18:11:47 raspi01 systemd[1]: Started LSB: Start NTP daemon. 10月 29 18:11:47 raspi01 ntpd[661]: proto: precision = 1.458 usec (-19) 10月 29 18:11:47 raspi01 ntpd[661]: Listen and drop on 0 v6wildcard [::]:123 10月 29 18:11:47 raspi01 ntpd[661]: Listen and drop on 1 v4wildcard 0.0.0.0:123 10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 2 lo 127.0.0.1:123 10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 3 lo [::1]:123 10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 4 eth0 [2001:240:2193:6300 10月 29 18:11:47 raspi01 ntpd[661]: Listen normally on 5 eth0 [fe80::c9d1:7089:42 10月 29 18:11:47 raspi01 ntpd[661]: Listening on routing socket on fd #22 for int 10月 29 18:11:52 raspi01 ntpd[661]: Listen normally on 6 eth0 192.168.1.40:123
別raspiマシンから参照する
別マシンのntpdから参照するようにします。
なお、GPSntpdサーバマシンはホスト名:raspi01、ipアドレス:192.168.1.40となっています。
ntpd設定
/etc/ntp.confのserver指定を置き換えます。
$ sudo cp /etc/ntp.conf /etc/ntp.conf.org $ sudo vi /etc/ntp.conf --- 変更部のみ載せます #server 0.debian.pool.ntp.org iburst #server 1.debian.pool.ntp.org iburst #server 2.debian.pool.ntp.org iburst #server 3.debian.pool.ntp.org iburst #pool ntp.nict.jp iburst server raspi01.local iburst --- $ sudo reboot
確認
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.1.40 SHM(0) 4 u 43 64 377 0.581 -4.549 3.296 $ date 2017年 10月 29日 日曜日 20:15:09 JST
念のためntpdateで確認
$ sudo apt-get install ntpdate # インストール $ sudo systemctl stop ntp # このマシンのntpdを一旦止める $ sudo ntpdate raspi01.local # ntpdateで確認 29 Oct 19:34:39 ntpdate[1249]: adjust time server 192.168.1.40 offset 0.002053 sec
別マシン(Windows)から参照する
Windowsの時刻管理でGPSntpdサーバマシンを参照する形にできます。
田 ギア 時刻と言語 日付と時刻 日付、時刻、地域の追加設定 日付と時刻の設定 インターネット時刻 設定の変更 「サーバ指定」 今すぐ更新(U)なお、日本の標準ntpサーバに接続するにはntp.nict.jpを指定します。
電波時計用NTPリピータから参照する
###2017/11/2
電波時計用NTPリピータからも参照できることを確認しました。
残項目:pts時刻を手動でGPSに合わせる
###
起動時に強制的に同期させることはできました。
記事:◇自動GPS-システム時計強制同期
###
Raspiはバッテリーバックアップされた時計を持ちませんのでshutdown後しばらくして起動すると、内蔵時刻がずれます。
サーバー(ここではGPS)から得られる時刻とのずれが大きい場合ntpはこのサーバーを信頼せず、時刻の修正を行いません。
時刻をdateで設定することにより時刻のずれが減ると、ntpがGPSを信頼するようになります。
$ date 2017年 10月 31日 火曜日 02:22:49 JST $ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== SHM(0) .GPS. 1 l - 16 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 1024 0 0.000 0.000 0.000 2404:1a8:1102:: .INIT. 16 u - 1024 0 0.000 0.000 0.000 # SHM(0)に'*'が付いておらず、GPSのデータが採用されていないことが分かる
$ gpsmon # GPSのデータを表示させ、時刻部をコピー $ sudo date -s 2017-10-31T08:16:06.000Z 2017年 10月 31日 火曜日 17:16:06 JST # dateコマンドでコピーした時刻をペーストしセット
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *SHM(0) .GPS. 1 l 16 16 77 0.000 0.820 1.197 2404:1a8:1102:: .STEP. 16 u - 128 0 0.000 0.000 0.000 2404:1a8:1102:: .STEP. 16 u - 128 0 0.000 0.000 0.000 # 少し時間をおくとGPSが参照されている $ date 2017年 10月 31日 火曜日 17:18:32 JST
自動的に行う方法はまだ見つけていません。
stratumを1にする、0にするなどをやってみましたがだめでした。
PPSについて
今回はUSB接続を用いました。
情報は4600bpsのテキストベースのNMEAフォーマットで得るため、時間がかかります。
GPS装置ではこのNMEAとは別に秒の変わり目ごとにPPS(PulsePerSecond)と呼ぶパルスを出す機能があるものがあります。
PPS得ることができれば時刻管理をより精密にすることができます。
折角のRaspiなので、PPS端子を持つGPSモジュールを使った精密サーバも検討しています。
###
PPSを用いたNTPサーバも立ち上げてみました。
◇GPS+PPSでNTPサーバを立てる参照
| 固定リンク