インターネット上のNTPサーバから日時を取得したい


インンターネット時間取得には「NTPプロトコル」を使用いたします。 
デバイスサーバ出荷時に搭載されている標準ファームウェアは、
NTPプロトコルは入っておりません。
(XPort EDGE、xPico200シリーズは搭載)
本機能はシリアル側マイコンと連携させる事で実現出来ます。
(NTPプロトコルの詳細は別途お客様でご確認お願いします)

 

NTPプロトコルは「UDP」通信で行います。 

もしシリアルをTCPでご使用ならば、そのままでは時刻取得処理はできません。 

もしWiPortなど2番目のシリアルもお使い頂ける製品の場合ならば、マイコンの
シリアルを切替える回路付き設計にすれば、2番目のシリアルをUDP通信モードに
することで実現できます。 

2番シリアルをUDP設定とし
「Local Port」「Remote Port」はNTP規格「123」にします。
接続先IPはNTPサーバのIPアドレスを示すことになりますが、
ここでは有名なNICTのサーバ「ntp.nict.jp」を使うことにするとします。
UDP設定でDNS解決ができない場合が多いですので、PCでIPアドレスを調べます。
------------------------------------------------------------
C:\>nslookup ntp.nict.jp
Server:  xxx.xxx.co.jp
Address:  xxx.xxx.xxx.xxx

Non-authoritative answer:
Name:    ntp.nict.jp
Addresses:  133.243.238.244, 133.243.238.163,
 133.243.238.164, 133.243.238.243

------------------------------------------------------------
この中から、例えば「133.243.238.163」をRemote Hostにします。
これでNTPサーバとのUDP通信の準備ができました。

シリアルよりNTPプロトコルのデータを送り込む試験をします。
NTPプロトコルに従い、以下のようなデータを送ります。
------------------------------------------------------------
0000   d9 00 0a fa 00 00 0f ff 00 0c be ac 00 00 00 00
0010   ce 4e d1 5a 44 00 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 00 00 ce 51 80 46 1c 00 00 00
------------------------------------------------------------
char NTP_Request[] = {
0xd9, 0x00, 0x0a, 0xfa, 0x00, 0x00, 0x0f, 0xff,
0x00, 0x0c, 0xbe, 0xac, 0x00, 0x00, 0x00, 0x00,
0xce, 0x4e, 0xd1, 0x5a, 0x44, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xce, 0x51, 0x80, 0x46, 0x1c, 0x00, 0x00, 0x00 };
------------------------------------------------------------

そうしますと、シリアルよりNTPサーバからの応答データが
出てくるかと思います。
あとは、このデータをNTP規格に従い処理をすることで時刻が
取得できます。
(時刻計算はマイコン側に時計関係のライブラリがないと
 手間がかかるかもしれません)

また、インターネット経由の遅延する通信で取得するわけですから、
誤差が当然発生することが想定できます。
このあたりは大概プログラマ自身の工夫で対策されるようです。

 

最終更新:
2019-11-28 10:23
改訂:
1.11
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.