2016年6月19日日曜日

ESP-WROOM-02 : SNTPのAPIで大ハマリ


ESP8266 NON OS SDKには、sntp_get_current_timestamp() というapiが用意されています。その名の通り、ntpサーバにアクセスして時間をもらってくるものです。

ところが。

これが全然値を返してくれません。0ばっかりです。sntp_init()の順番が悪いのだろうか、time zoneを設定しなければいけないのか、upd local portが必要なのだろうか、DNSが動いていないのだろうか…など、2時間ほど試したのですが、ダメでした。

が。

ふと見ると、参考にしていたReferenceはver 1.1と書いてありまして。最新の1.5.4を見ると多少サンプルが違います。1.1と違って、waitが入ってます。

… sntp_get_current_timestampでは、パケット待ってくれないんですね…。referenceにそんなこた何にも書いてねーぞー(血の叫び

以下のコードで普通に動きました。はい、お疲れ様。

uint32_t getTimestamp() {
  configTime(9 * 3600, 0, "ntp.nict.jp", NULL, NULL);

  uint32_t result = 0;
  int cnt = 0;
  while (result == 0) {
    result = sntp_get_current_timestamp();
    delay(100);
    if (++cnt > 10) {
      break;
    }
  }
  return result;
}
ESP8266のサンプルとしてESP8266WiFi/NTPClientなんてのがあるせいか、スクラッチでUDPのntpパケットを扱っている作例が多いのですが、これ使うと簡単です(ハマらなければね)

ご活用くださいませ。

0 件のコメント:

コメントを投稿