ESP8266의 ntp 설정은 한 줄로

개요



ntp (네트워크 시간 프로토콜)는 네트워크를 통해 시계를 맞추기위한 통신 규칙이며, 네트워크상의 시간 서버와 동기화하여 정확한 시간을 쉽게 얻을 수 있습니다.

esp8266 Arduino에서도 이용할 수 있지만, ntp 패킷을 작성 및 송수신하는 스케치의 예가 제공되고 있기 때문에, 자신이 해야 한다고 오해하고 있는 사람이 있을지도 모릅니다. 응.

esp8266 Arduino에는 ntp 기능이 내장되어있어 특히 라이브러리를 포함하지 않고도 설정하는 것만으로 ntp 동기화 시간 정보를 얻을 수 있습니다.

추가: 2020/05/24:

esp8266 arduino ver 2.7.0 이후, 이전에 설명한 방법에서는 시간이 18시간 어긋나게 되었습니다. 기존에는 configTime() 함수로 설정을 했지만 2.7.0 이후에는 configTzTime() 함수를 사용하는 것이 좋습니다.

사용법



configTzTime() 함수로 설정합니다. 선언은 Arduino.h에 있으므로 특별히 포함 할 필요가 없습니다.

Arduino.h
// esp32 api compatibility
inline void configTzTime(const char* tz, const char* server1,
    const char* server2 = nullptr, const char* server3 = nullptr)

일본에서 사용하는 경우 tz는 "JST-9"입니다. tz에 지정 가능한 문자열은 TZ.h을 참조하십시오.

ntp의 동기화가 완료되면 time() 함수가 UNIX 시간(1970년 1월 1일 0시 0분 0초부터의 윤초를 포함하지 않는 초수)을 돌려주게 되므로, 이것을 localtime() 함수 등 로 변환하여 이용합니다. 동기화가 완료될 때까지 time() 함수는 0을 반환하므로 이상한 시간을 표시하고 싶지 않은 경우는 비0이 반환될 때까지 기다리는 것이 좋습니다. time() 이나 localtime() 의 사용에는 time.h 를 인클루드 할 필요가 있습니다.

샘플 프로그램



사용 예를 나타냅니다.

clock.ino
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <time.h>

#define WIFI_SSID   "your_wifi_ssid"
#define WIFI_PASSWORD   "your_wifi_password"
#define JST     3600*9

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.print("\n\nReset:\n");

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  // configTime(  JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); // esp8266/arduino ver 2.6.3まで有効
  // configTime( -JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); // 2.7.0, 2.7.1ならこれでも可
  configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");   // 2.7.0以降, esp32コンパチ
}

void loop() {
  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

  t = time(NULL);
  tm = localtime(&t);
  Serial.printf("ESP8266/Arduino ver%s :  %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
        __STR(ARDUINO_ESP8266_GIT_DESC),
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);
  delay(1000);
}

런타임 시리얼 모니터는 다음과 같습니다.



좀 더 자세한 이야기



configTime(), time()등의 소스를 보면(자), 각각 sntp.c 의 대응 함수를 호출하고 있는 것 같고, sntp.c를 보면 1시간에 1회 ntp 패킷을 던지고 있는 것 같습니다.

좋은 웹페이지 즐겨찾기