Stratum1のなんちゃってNTPサーバーを作る

インターネットに繋がらない環境でもPCやMac、マイコンなどで正確な時刻合わせを行いたい(*´ェ`)

GPSから時刻を取得してNTPサーバを作れば良さそう(*゚ェ゚*) ということで作ってみた(*゚ェ゚*)

使用部品は
・GPS受信機 GT-505GGBL5-DR-N 1つ
・マイコンボード W55RP20-EVB-Pico 1つ

GT-505GGBL5-DR-Nは1PPS出力も付いていてUARTで通信する(*゚ェ゚*)
1PPS出力を使用して精度を上げて信号確認用にLEDも付けてみると1Hzでピカピカしている(*´ェ`)

W55RP20-EVB-Pico は Raspberry Pi Pico互換のマイコンボードでRP2040とTCP/IPコントローラーW5500を統合したSoC「W55RP20」を搭載している(*゚ェ゚*)

Raspberry Pi Picoにイーサネット接続機能も使えて便利(*゚ェ゚*)

Raspberry Pi Pico側でNTPサーバを稼働させて各端末からはNTPクライアントで接続してもらえば良い(*´ェ`)

GPS/GNSSやNTPサーバの情報が見られたら良いなと思ったので簡易HTTPサーバも搭載してみた(*゚ェ゚*)

こうなるとネットワーク周りの設定値も変えられると便利かもと思い実装してみた(*´ェ`)

sntpコマンドで確認すると

$ sntp -d 192.168.11.88
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.5F37 (0.371932983)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
            t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t3: EDCE4F6E.E2A76510 (3989720942.885366741)
            t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
        offset: 0000000000000000.666D5CD700000000 (0.400106242)
         delay: 0000000000000000.02FAE79200000000 (0.011641000)
          mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
         error: 0000000000000000.5F37000000000000 (0.371932983)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.695F (0.411605835)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.ECF55EB4 (3989720942.925619048)
            t1: EDCE4F6E.7DC810A5 (3989720942.491333999)
            t2: EDCE4F6E.ECF55EB4 (3989720942.925619048)
            t3: EDCE4F6E.ECF5B297 (3989720942.925624048)
            t4: EDCE4F6E.88432CA5 (3989720942.532274999)
        offset: 0000000000000000.69EFEA0080000000 (0.413817048)
         delay: 0000000000000000.0A7AC81D00000000 (0.040936000)
          mean: 00000000EDCE4F6E.ECF588A580000000 (3989720942.925621510)
         error: 0000000000000000.695F000000000000 (0.411605835)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.7387 (0.451278687)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.F7429FCB (3989720942.965860354)
            t1: EDCE4F6E.885F394B (3989720942.532702999)
            t2: EDCE4F6E.F7429FCB (3989720942.965860354)
            t3: EDCE4F6E.F7430475 (3989720942.965866354)
            t4: EDCE4F6E.928900C5 (3989720942.572402999)
        offset: 0000000000000000.69CEB51800000000 (0.413310355)
         delay: 0000000000000000.0A2962D000000000 (0.039694000)
          mean: 00000000EDCE4F6E.F742D22000000000 (3989720942.965863228)
         error: 0000000000000000.7387000000000000 (0.451278687)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.7DF0 (0.491943359)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.01911558 (3989720942.006120046)
            t1: EDCE4F6E.92B4FA48 (3989720942.573073999)
            t2: EDCE4F6E.01911558 (3989720942.006120046)
            t3: EDCE4F6E.01917A02 (3989720942.006126046)
            t4: EDCE4F6E.9D425F20 (3989720942.614293999)
        offset: FFFFFFFFFFFFFFFF.69959AF900000000 (-0.587560953)
         delay: 0000000000000000.0A8D002E00000000 (0.041214000)
          mean: 00000000EDCE4F6E.019147AD00000000 (3989720942.006123066)
         error: 0000000000000000.7DF0000000000000 (0.491943359)
          addr: 192.168.11.88
}
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.8818 (0.531616211)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.0BDEAA52 (3989720942.046366353)
            t1: EDCE4F6E.9D5A187A (3989720942.614655999)
            t2: EDCE4F6E.0BDEAA52 (3989720942.046366353)
            t3: EDCE4F6E.0BDEED6E (3989720942.046370353)
            t4: EDCE4F6E.A723FEE2 (3989720942.652892999)
        offset: FFFFFFFFFFFFFFFF.699FC03200000000 (-0.587406147)
         delay: 0000000000000000.09C9A34C00000000 (0.038233000)
          mean: 00000000EDCE4F6E.0BDECBE000000000 (3989720942.046368122)
         error: 0000000000000000.8818000000000000 (0.531616211)
          addr: 192.168.11.88
}
selected:
sntp_exchange {
        result: 0 (Success)
        header: 24 (li:0 vn:4 mode:4)
       stratum: 01 (1)
          poll: 00 (1)
     precision: FFFFFFEC (9.536743e-07)
         delay: 0000.0000 (0.000000000)
    dispersion: 0000.5F37 (0.371932983)
           ref: 47505373 ("GPSs")
         t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
            t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
            t3: EDCE4F6E.E2A76510 (3989720942.885366741)
            t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
        offset: 0000000000000000.666D5CD700000000 (0.400106242)
         delay: 0000000000000000.02FAE79200000000 (0.011641000)
          mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
         error: 0000000000000000.5F37000000000000 (0.371932983)
          addr: 192.168.11.88
}
+0.400106 +/- 0.383574 192.168.11.88 192.168.11.88

stratum: 01 (1)というのが確認できる(*´ェ`)自分で作ったのだから当たり前だけど…