2016/12/25

[esp8266][rtos]lwIPのSNTPを使う

ネットを使うと、何かと時間が取得したくなる。

時間といえば、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。