SNTPClinet

Dependents:   SSD1306_smart_watch smart_watch smart_watch

Committer:
eunkyoungkim
Date:
Mon Jun 29 04:26:32 2015 +0000
Revision:
0:dc5f405fd011
Add SNTPClient

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eunkyoungkim 0:dc5f405fd011 1 /**
eunkyoungkim 0:dc5f405fd011 2 * @author Raphael Kwon
eunkyoungkim 0:dc5f405fd011 3 *
eunkyoungkim 0:dc5f405fd011 4 * @section LICENSE
eunkyoungkim 0:dc5f405fd011 5 *
eunkyoungkim 0:dc5f405fd011 6 * Copyright (c) 2014 WIZnet Co., Ltd.
eunkyoungkim 0:dc5f405fd011 7 *
eunkyoungkim 0:dc5f405fd011 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
eunkyoungkim 0:dc5f405fd011 9 * of this software and associated documentation files (the "Software"), to deal
eunkyoungkim 0:dc5f405fd011 10 * in the Software without restriction, including without limitation the rights
eunkyoungkim 0:dc5f405fd011 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
eunkyoungkim 0:dc5f405fd011 12 * copies of the Software, and to permit persons to whom the Software is
eunkyoungkim 0:dc5f405fd011 13 * furnished to do so, subject to the following conditions:
eunkyoungkim 0:dc5f405fd011 14 *
eunkyoungkim 0:dc5f405fd011 15 * The above copyright notice and this permission notice shall be included in
eunkyoungkim 0:dc5f405fd011 16 * all copies or substantial portions of the Software.
eunkyoungkim 0:dc5f405fd011 17 *
eunkyoungkim 0:dc5f405fd011 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
eunkyoungkim 0:dc5f405fd011 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
eunkyoungkim 0:dc5f405fd011 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
eunkyoungkim 0:dc5f405fd011 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
eunkyoungkim 0:dc5f405fd011 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
eunkyoungkim 0:dc5f405fd011 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
eunkyoungkim 0:dc5f405fd011 24 * THE SOFTWARE.
eunkyoungkim 0:dc5f405fd011 25 *
eunkyoungkim 0:dc5f405fd011 26 * @section DESCRIPTION
eunkyoungkim 0:dc5f405fd011 27 * Simple Network Time Protocol Client
eunkyoungkim 0:dc5f405fd011 28 *
eunkyoungkim 0:dc5f405fd011 29 */
eunkyoungkim 0:dc5f405fd011 30
eunkyoungkim 0:dc5f405fd011 31 #ifndef SNTPCLIENT_H
eunkyoungkim 0:dc5f405fd011 32 #define SNTPCLIENT_H
eunkyoungkim 0:dc5f405fd011 33
eunkyoungkim 0:dc5f405fd011 34 #include "mbed.h"
eunkyoungkim 0:dc5f405fd011 35 #include "UDPSocket.h"
eunkyoungkim 0:dc5f405fd011 36
eunkyoungkim 0:dc5f405fd011 37 /*
eunkyoungkim 0:dc5f405fd011 38 * @brief Define it for Debug & Monitor DNS processing.
eunkyoungkim 0:dc5f405fd011 39 * @note
eunkyoungkim 0:dc5f405fd011 40 */
eunkyoungkim 0:dc5f405fd011 41 //#define _SNTP_DEBUG_
eunkyoungkim 0:dc5f405fd011 42
eunkyoungkim 0:dc5f405fd011 43 #define MAX_SNTP_BUF_SIZE sizeof(ntpformat) ///< maximum size of DNS buffer. */
eunkyoungkim 0:dc5f405fd011 44 #define ntp_port 123 //ntp server port number
eunkyoungkim 0:dc5f405fd011 45 #define SECS_PERDAY 86400UL // seconds in a day = 60*60*24
eunkyoungkim 0:dc5f405fd011 46 #define UTC_ADJ_HRS 9 // SEOUL : GMT+9
eunkyoungkim 0:dc5f405fd011 47 #define EPOCH 1900 // NTP start year
eunkyoungkim 0:dc5f405fd011 48
eunkyoungkim 0:dc5f405fd011 49 /* for ntpclient */
eunkyoungkim 0:dc5f405fd011 50 typedef signed char s_char;
eunkyoungkim 0:dc5f405fd011 51 typedef unsigned long long tstamp;
eunkyoungkim 0:dc5f405fd011 52 typedef unsigned int tdist;
eunkyoungkim 0:dc5f405fd011 53
eunkyoungkim 0:dc5f405fd011 54 typedef struct _ntpformat
eunkyoungkim 0:dc5f405fd011 55 {
eunkyoungkim 0:dc5f405fd011 56 uint8_t dstaddr[4]; /* destination (local) address */
eunkyoungkim 0:dc5f405fd011 57 char version; /* version number */
eunkyoungkim 0:dc5f405fd011 58 char leap; /* leap indicator */
eunkyoungkim 0:dc5f405fd011 59 char mode; /* mode */
eunkyoungkim 0:dc5f405fd011 60 char stratum; /* stratum */
eunkyoungkim 0:dc5f405fd011 61 char poll; /* poll interval */
eunkyoungkim 0:dc5f405fd011 62 s_char precision; /* precision */
eunkyoungkim 0:dc5f405fd011 63 tdist rootdelay; /* root delay */
eunkyoungkim 0:dc5f405fd011 64 tdist rootdisp; /* root dispersion */
eunkyoungkim 0:dc5f405fd011 65 char refid; /* reference ID */
eunkyoungkim 0:dc5f405fd011 66 tstamp reftime; /* reference time */
eunkyoungkim 0:dc5f405fd011 67 tstamp org; /* origin timestamp */
eunkyoungkim 0:dc5f405fd011 68 tstamp rec; /* receive timestamp */
eunkyoungkim 0:dc5f405fd011 69 tstamp xmt; /* transmit timestamp */
eunkyoungkim 0:dc5f405fd011 70 } ntpformat;
eunkyoungkim 0:dc5f405fd011 71 typedef struct _datetime
eunkyoungkim 0:dc5f405fd011 72 {
eunkyoungkim 0:dc5f405fd011 73 int yy;
eunkyoungkim 0:dc5f405fd011 74 int mo;
eunkyoungkim 0:dc5f405fd011 75 int dd;
eunkyoungkim 0:dc5f405fd011 76 int hh;
eunkyoungkim 0:dc5f405fd011 77 int mm;
eunkyoungkim 0:dc5f405fd011 78 int ss;
eunkyoungkim 0:dc5f405fd011 79 } datetime;
eunkyoungkim 0:dc5f405fd011 80 /*
eunkyoungkim 0:dc5f405fd011 81 typedef struct _datetime
eunkyoungkim 0:dc5f405fd011 82 {
eunkyoungkim 0:dc5f405fd011 83 uint16_t yy;
eunkyoungkim 0:dc5f405fd011 84 uint8_t mo;
eunkyoungkim 0:dc5f405fd011 85 uint8_t dd;
eunkyoungkim 0:dc5f405fd011 86 uint8_t hh;
eunkyoungkim 0:dc5f405fd011 87 uint8_t mm;
eunkyoungkim 0:dc5f405fd011 88 uint8_t ss;
eunkyoungkim 0:dc5f405fd011 89 } datetime;
eunkyoungkim 0:dc5f405fd011 90 */
eunkyoungkim 0:dc5f405fd011 91 /** SNTPClient client Class.
eunkyoungkim 0:dc5f405fd011 92 *
eunkyoungkim 0:dc5f405fd011 93 * Example (ethernet network):
eunkyoungkim 0:dc5f405fd011 94 * @code
eunkyoungkim 0:dc5f405fd011 95 * #include "mbed.h"
eunkyoungkim 0:dc5f405fd011 96 * #include "EthernetInterface.h"
eunkyoungkim 0:dc5f405fd011 97 * #include "SNTPClient.h"
eunkyoungkim 0:dc5f405fd011 98 *
eunkyoungkim 0:dc5f405fd011 99 * int main() {
eunkyoungkim 0:dc5f405fd011 100 * EthernetInterface eth;
eunkyoungkim 0:dc5f405fd011 101 * eth.init(); //Use DHCP
eunkyoungkim 0:dc5f405fd011 102 * eth.connect();
eunkyoungkim 0:dc5f405fd011 103 * printf("IP Address is %s\n\r", eth.getIPAddress());
eunkyoungkim 0:dc5f405fd011 104 *
eunkyoungkim 0:dc5f405fd011 105 * SNTPClient ws("ws://sockets.mbed.org:443/ws/demo/rw");
eunkyoungkim 0:dc5f405fd011 106 * ws.connect();
eunkyoungkim 0:dc5f405fd011 107 *
eunkyoungkim 0:dc5f405fd011 108 * while (1) {
eunkyoungkim 0:dc5f405fd011 109 * int res = ws.send("SNTPClient Hello World!");
eunkyoungkim 0:dc5f405fd011 110 *
eunkyoungkim 0:dc5f405fd011 111 * if (ws.read(recv)) {
eunkyoungkim 0:dc5f405fd011 112 * printf("rcv: %s\r\n", recv);
eunkyoungkim 0:dc5f405fd011 113 * }
eunkyoungkim 0:dc5f405fd011 114 *
eunkyoungkim 0:dc5f405fd011 115 * wait(0.1);
eunkyoungkim 0:dc5f405fd011 116 * }
eunkyoungkim 0:dc5f405fd011 117 * }
eunkyoungkim 0:dc5f405fd011 118 * @endcode
eunkyoungkim 0:dc5f405fd011 119 */
eunkyoungkim 0:dc5f405fd011 120
eunkyoungkim 0:dc5f405fd011 121
eunkyoungkim 0:dc5f405fd011 122 class SNTPClient
eunkyoungkim 0:dc5f405fd011 123 {
eunkyoungkim 0:dc5f405fd011 124 public:
eunkyoungkim 0:dc5f405fd011 125 /**
eunkyoungkim 0:dc5f405fd011 126 * Constructor
eunkyoungkim 0:dc5f405fd011 127 *
eunkyoungkim 0:dc5f405fd011 128 * @param url The SNTPClient host
eunkyoungkim 0:dc5f405fd011 129 */
eunkyoungkim 0:dc5f405fd011 130 SNTPClient(char * url, uint8_t time_zone);
eunkyoungkim 0:dc5f405fd011 131
eunkyoungkim 0:dc5f405fd011 132 /**
eunkyoungkim 0:dc5f405fd011 133 * Connect to the SNTPClient url
eunkyoungkim 0:dc5f405fd011 134 *
eunkyoungkim 0:dc5f405fd011 135 *@return true if the connection is established, false otherwise
eunkyoungkim 0:dc5f405fd011 136 */
eunkyoungkim 0:dc5f405fd011 137 bool connect();
eunkyoungkim 0:dc5f405fd011 138
eunkyoungkim 0:dc5f405fd011 139 /**
eunkyoungkim 0:dc5f405fd011 140 * Read a SNTPClient message
eunkyoungkim 0:dc5f405fd011 141 *
eunkyoungkim 0:dc5f405fd011 142 * @param message pointer to the string to be read (null if drop frame)
eunkyoungkim 0:dc5f405fd011 143 *
eunkyoungkim 0:dc5f405fd011 144 * @return true if a SNTPClient frame has been read
eunkyoungkim 0:dc5f405fd011 145 */
eunkyoungkim 0:dc5f405fd011 146 bool getTime(datetime *time);
eunkyoungkim 0:dc5f405fd011 147
eunkyoungkim 0:dc5f405fd011 148 /**
eunkyoungkim 0:dc5f405fd011 149 * Close the SNTPClient connection
eunkyoungkim 0:dc5f405fd011 150 *
eunkyoungkim 0:dc5f405fd011 151 * @return true if the connection has been closed, false otherwise
eunkyoungkim 0:dc5f405fd011 152 */
eunkyoungkim 0:dc5f405fd011 153 bool close();
eunkyoungkim 0:dc5f405fd011 154
eunkyoungkim 0:dc5f405fd011 155 /*
eunkyoungkim 0:dc5f405fd011 156 * Accessor: get host from the SNTPClient url
eunkyoungkim 0:dc5f405fd011 157 *
eunkyoungkim 0:dc5f405fd011 158 * @return host
eunkyoungkim 0:dc5f405fd011 159 */
eunkyoungkim 0:dc5f405fd011 160 char* getHost();
eunkyoungkim 0:dc5f405fd011 161
eunkyoungkim 0:dc5f405fd011 162 private:
eunkyoungkim 0:dc5f405fd011 163
eunkyoungkim 0:dc5f405fd011 164 uint16_t port;
eunkyoungkim 0:dc5f405fd011 165 char host[32];
eunkyoungkim 0:dc5f405fd011 166
eunkyoungkim 0:dc5f405fd011 167 UDPSocket socket;
eunkyoungkim 0:dc5f405fd011 168 Endpoint sntp_server;
eunkyoungkim 0:dc5f405fd011 169
eunkyoungkim 0:dc5f405fd011 170 ntpformat NTPformat;
eunkyoungkim 0:dc5f405fd011 171 datetime Nowdatetime;
eunkyoungkim 0:dc5f405fd011 172 uint8_t ntpmessage[48];
eunkyoungkim 0:dc5f405fd011 173 uint8_t tz; // Time Zone
eunkyoungkim 0:dc5f405fd011 174
eunkyoungkim 0:dc5f405fd011 175 void get_seconds_from_ntp_server(uint8_t *buf, uint16_t idx);
eunkyoungkim 0:dc5f405fd011 176 tstamp changedatetime_to_seconds(void);
eunkyoungkim 0:dc5f405fd011 177 void calcdatetime(tstamp seconds);
eunkyoungkim 0:dc5f405fd011 178 };
eunkyoungkim 0:dc5f405fd011 179
eunkyoungkim 0:dc5f405fd011 180 #endif