아두이노나 ESP8266 관련 프로그래밍을 하다가 보면 가끔 현재 시간 정보가 필요한 경우가 있다. 이럴 경우 쉽게 사용할 수 있는 방법은 예전에 소개한 바 있는 RTC 모듈(Real Time Clock)이라는 장치를 이용하는 것이다. 하지만 장치가 인터넷에 연결되어 있다면 RTC가 필요 없다. 간단하게 현재의 시각을 알 수 있는 방법이 따로 있기 때문이다. 바로 웹서버에 요청(Request)해서 응답(Response)이 오는 HTTP 헤더 정보에 바로 Date, Time 정보가 있는 것이다. 이 정보를 파싱해서 자신의 코드에 삽입해서 이용하면 된다.
■ 예전에 썼던 RTC 관련 글 모음
그럼 HTTP 헤더란?
우리가 사용하는 인터넷은 HTTP (Hyper Text Transfer Protocol) 라는 규약(프로토콜)을 이용해서 서버와 브라우저간에 통신을 하게 되고 정보를 교환하게 되는데 이 때 서버에서 브라우저 쪽으로 덧붙여서 보내주는 정보라고 보면 된다. 이 정보 안에는 Date/Time 정보가 있어서 이 것을 이용하면 현재의 시간을 구할 수 있는 것이다. 실제로 구글 크롬에서 F12 버튼을 누르면 HTTP 헤더 정보를 볼 수 있다.
Chrome 에서 F12 를 눌러서 개발자 도구에서 HTTP 헤더를 보는 모습
ESP8266 을 이용해서 서버에 빈(Empty) 요청을 날리면 위와 같이 웹서버에서 Date 라는 Name 으로 날짜, 시간 정보를 준다. 기준은 그리니치 표준시 기준인 GMT 기준으로 제공하기 때문에 우리나라 시간으로 변환을 원한다면 GMT+9시간을 해야한다.
■ 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | -- retrieve the current time from Google function queryTime() conn=net.createConnection(net.TCP, 0) conn:on("connection",function(conn, payload) conn:send("HEAD / HTTP/1.1\r\n".. "Host: google.com\r\n".. "Accept: */*\r\n".. "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)".. "\r\n\r\n") end) conn:on("receive", function(conn, payload) print('Retrieved in '..((tmr.now()-t)/1000)..' milliseconds.') print('Google says it is '..string.sub(payload,string.find(payload,"Date: ") +6,string.find(payload,"Date: ")+35)) conn:close() end) t = tmr.now() conn:connect(80,'google.com') end tmr.alarm(0, 10 * 1000, 1, function() queryTime() end ) print("Queries every 10 sec the time from Google server") print("Stop this by tmr.stop(0)") | cs |
소스는 간단하다. google.com 으로 요청을 날리고 응답받은 HTTP 헤더 정보인 payload 에서 Date 부분을 추출해서 표시해주는 소스이다. 여기서는 google 에 요청했지만 다른 웹서버 URL 을 사용해도 상관이 없다.
실행결과는 위와 같다. 10초 마다 google 서버의 시간을 받아와서 print 해 주고 있다.
이 정보는 HTTP 헤더 정보인 payload 변수에 담겨져 있는 내용인데 payload 정보도 print 해 보았다. 위와 같이 payload 의 마지막 부분에 Date 가 있는 것을 알 수 있다.
소스에 GMT+9 를 하고 적절한 디스플레이를 연결하면 정확한 시간을 보여줄 수 있는 인터넷 시계도 만들 수 있을 것 같다.
'ESP8266' 카테고리의 다른 글
NodeMCU Lua #16 - 원하는 모듈만 추가해서 펌웨어 만들기 (0) | 2016.08.25 |
---|---|
NodeMCU Lua #15 - 서보(Servo) 제어 (0) | 2016.08.11 |
NodeMCU Lua 사용해보기 #13 - 인터넷을 통한 릴레이 제어 #2 (18) | 2016.07.26 |
NodeMCU Lua 사용해보기 #12 - 인터넷을 통한 릴레이 제어 #1 (7) | 2016.07.26 |
NodeMCU Lua 사용해보기 #11 - dweet.io 온습도 데이터 업로드 (0) | 2016.07.19 |