ネットを使うと、何かと時間が取得したくなる。
時間といえば、NTP。
NTPから時間を取ってくるシンプルな手順が、SNTP。
SNMPとごちゃまぜに覚えてしまっていたのだが、Simple NTPと覚えよう。
ESP8266のRTOS SDKでも時間が取得したくなったので、RFC2030を見たり、他の人のまねをしながら実装したものの、どうやらlwIPのSNTPがあるようだった。
しまった。。。
非同期で時間を取ってくるため、取得できるまではsntp_get_current_timestamp()に0が返ってくるようだった。
これは、while()などで待たせればよいだろう。
lwIPにtime()も持っているのだが、これを使うとlibcの方と競合してしまうので、やめておいた。
#include "lwip/apps/sntp.h" ... sntp_setservername(0, "ntp.nict.jp"); sntp_set_timezone(9); //JST sntp_init(); u32_t t; while ((t = sntp_get_current_timestamp()) == 0) { printf("."); vTaskDelay(1000 / portTICK_RATE_MS); } printf("\ntime=%d\n", (int)t); ...
NTPサーバにsendto()するのはsntp_init()を呼んだ場合のようだから、定期的に実行するならsntp_close()せずにsntp_init()を呼ぶだけでもよさそうだし、毎回sntp_close()してもよいのではなかろうか。
このモジュール自体は、再送などはしてくれるようだが、定期実行はしないように見える。
せっかくSNTPをsocketでやる部分も作ったので、GISTに置いておこう。
sntp client(socket)
Bash on Windowsでビルドして動いたので、Linux系だったら動くんじゃなかろうか(bind()のために実行時はsudoせんといかんが)。
ちょっと変更すれば、RTOS SDKでも動く。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。