The extracted NTP client from Segundos NetServices library, for use with the [[http://mbed.org/users/hlipka/libraries/NetServicesMin|NetServicesMin]] library. The only fixed bug is the memory leak / OOM problem. Needs the [[http://mbed.org/users/hlipka/libraries/DNSResolver|DNSResolver]] library as well.

Dependents:   SPIVFDclock LPC1768_AppBoard_Internet_LCD_Clock

Committer:
hlipka
Date:
Mon Jan 10 22:38:49 2011 +0000
Revision:
0:ebea15f18f84
Child:
1:63ded11b8fa2
initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 0:ebea15f18f84 1
hlipka 0:ebea15f18f84 2 /*
hlipka 0:ebea15f18f84 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
hlipka 0:ebea15f18f84 4
hlipka 0:ebea15f18f84 5 Permission is hereby granted, free of charge, to any person obtaining a copy
hlipka 0:ebea15f18f84 6 of this software and associated documentation files (the "Software"), to deal
hlipka 0:ebea15f18f84 7 in the Software without restriction, including without limitation the rights
hlipka 0:ebea15f18f84 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
hlipka 0:ebea15f18f84 9 copies of the Software, and to permit persons to whom the Software is
hlipka 0:ebea15f18f84 10 furnished to do so, subject to the following conditions:
hlipka 0:ebea15f18f84 11
hlipka 0:ebea15f18f84 12 The above copyright notice and this permission notice shall be included in
hlipka 0:ebea15f18f84 13 all copies or substantial portions of the Software.
hlipka 0:ebea15f18f84 14
hlipka 0:ebea15f18f84 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
hlipka 0:ebea15f18f84 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
hlipka 0:ebea15f18f84 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
hlipka 0:ebea15f18f84 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
hlipka 0:ebea15f18f84 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
hlipka 0:ebea15f18f84 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
hlipka 0:ebea15f18f84 21 THE SOFTWARE.
hlipka 0:ebea15f18f84 22 */
hlipka 0:ebea15f18f84 23
hlipka 0:ebea15f18f84 24 /** \file
hlipka 0:ebea15f18f84 25 NTP Client header file
hlipka 0:ebea15f18f84 26 */
hlipka 0:ebea15f18f84 27
hlipka 0:ebea15f18f84 28 #ifndef NTP_CLIENT_H
hlipka 0:ebea15f18f84 29 #define NTP_CLIENT_H
hlipka 0:ebea15f18f84 30
hlipka 0:ebea15f18f84 31 #include "core/net.h"
hlipka 0:ebea15f18f84 32 #include "core/netservice.h"
hlipka 0:ebea15f18f84 33 #include "api/UDPSocket.h"
hlipka 0:ebea15f18f84 34 #include "api/DNSRequest.h"
hlipka 0:ebea15f18f84 35 #include "mbed.h"
hlipka 0:ebea15f18f84 36
hlipka 0:ebea15f18f84 37 ///NTP Client results
hlipka 0:ebea15f18f84 38 enum NTPResult
hlipka 0:ebea15f18f84 39 {
hlipka 0:ebea15f18f84 40 NTP_OK, ///<Success
hlipka 0:ebea15f18f84 41 NTP_PROCESSING, ///<Processing
hlipka 0:ebea15f18f84 42 NTP_PRTCL, ///<Protocol error
hlipka 0:ebea15f18f84 43 NTP_TIMEOUT, ///<Connection timeout
hlipka 0:ebea15f18f84 44 NTP_DNS ///<Could not resolve DNS hostname
hlipka 0:ebea15f18f84 45 };
hlipka 0:ebea15f18f84 46
hlipka 0:ebea15f18f84 47 __packed struct NTPPacket //See RFC 4330 for Simple NTP
hlipka 0:ebea15f18f84 48 {
hlipka 0:ebea15f18f84 49 //WARN: We are in LE! Network is BE!
hlipka 0:ebea15f18f84 50 //LSb first
hlipka 0:ebea15f18f84 51 unsigned mode : 3;
hlipka 0:ebea15f18f84 52 unsigned vn : 3;
hlipka 0:ebea15f18f84 53 unsigned li : 2;
hlipka 0:ebea15f18f84 54
hlipka 0:ebea15f18f84 55 uint8_t stratum;
hlipka 0:ebea15f18f84 56 uint8_t poll;
hlipka 0:ebea15f18f84 57 uint8_t precision;
hlipka 0:ebea15f18f84 58 //32 bits header
hlipka 0:ebea15f18f84 59
hlipka 0:ebea15f18f84 60 uint32_t rootDelay;
hlipka 0:ebea15f18f84 61 uint32_t rootDispersion;
hlipka 0:ebea15f18f84 62 uint32_t refId;
hlipka 0:ebea15f18f84 63
hlipka 0:ebea15f18f84 64 uint32_t refTm_s;
hlipka 0:ebea15f18f84 65 uint32_t refTm_f;
hlipka 0:ebea15f18f84 66 uint32_t origTm_s;
hlipka 0:ebea15f18f84 67 uint32_t origTm_f;
hlipka 0:ebea15f18f84 68 uint32_t rxTm_s;
hlipka 0:ebea15f18f84 69 uint32_t rxTm_f;
hlipka 0:ebea15f18f84 70 uint32_t txTm_s;
hlipka 0:ebea15f18f84 71 uint32_t txTm_f;
hlipka 0:ebea15f18f84 72 };
hlipka 0:ebea15f18f84 73
hlipka 0:ebea15f18f84 74 /**
hlipka 0:ebea15f18f84 75 The NTP client is a simple UDP client that will update the mbed's RTC
hlipka 0:ebea15f18f84 76 */
hlipka 0:ebea15f18f84 77 class NTPClient
hlipka 0:ebea15f18f84 78 {
hlipka 0:ebea15f18f84 79 public:
hlipka 0:ebea15f18f84 80 /**
hlipka 0:ebea15f18f84 81 Instantiates the NTP client
hlipka 0:ebea15f18f84 82 */
hlipka 0:ebea15f18f84 83 NTPClient();
hlipka 0:ebea15f18f84 84 ~NTPClient();
hlipka 0:ebea15f18f84 85
hlipka 0:ebea15f18f84 86 /**
hlipka 0:ebea15f18f84 87 Updates the time using the server host, blocks until completion
hlipka 0:ebea15f18f84 88 @param host : NTP server
hlipka 0:ebea15f18f84 89 */
hlipka 0:ebea15f18f84 90 NTPResult setTime(const Host& host); //Blocking
hlipka 0:ebea15f18f84 91
hlipka 0:ebea15f18f84 92 void close();
hlipka 0:ebea15f18f84 93
hlipka 0:ebea15f18f84 94 private:
hlipka 0:ebea15f18f84 95 void init();
hlipka 0:ebea15f18f84 96 void open();
hlipka 0:ebea15f18f84 97
hlipka 0:ebea15f18f84 98 /**
hlipka 0:ebea15f18f84 99 Updates the time using the server host
hlipka 0:ebea15f18f84 100 The function returns immediately and calls the previously set callback on completion or error
hlipka 0:ebea15f18f84 101 @param host : NTP server
hlipka 0:ebea15f18f84 102 */
hlipka 0:ebea15f18f84 103 void doSetTime(const Host& host);
hlipka 0:ebea15f18f84 104
hlipka 0:ebea15f18f84 105 void process(); //Main state-machine
hlipka 0:ebea15f18f84 106
hlipka 0:ebea15f18f84 107 void setTimeout(int ms);
hlipka 0:ebea15f18f84 108 void resetTimeout();
hlipka 0:ebea15f18f84 109
hlipka 0:ebea15f18f84 110 void onTimeout(); //Connection has timed out
hlipka 0:ebea15f18f84 111 void onDNSReply(DNSReply r);
hlipka 0:ebea15f18f84 112 void onUDPSocketEvent(UDPSocketEvent e);
hlipka 0:ebea15f18f84 113 void onResult(NTPResult r); //Called when exchange completed or on failure
hlipka 0:ebea15f18f84 114
hlipka 0:ebea15f18f84 115 NTPResult blockingProcess(); //Called in blocking mode, calls Net::poll() until return code is available
hlipka 0:ebea15f18f84 116
hlipka 0:ebea15f18f84 117 UDPSocket* m_pUDPSocket;
hlipka 0:ebea15f18f84 118
hlipka 0:ebea15f18f84 119 enum NTPStep
hlipka 0:ebea15f18f84 120 {
hlipka 0:ebea15f18f84 121 NTP_PING,
hlipka 0:ebea15f18f84 122 NTP_PONG
hlipka 0:ebea15f18f84 123 };
hlipka 0:ebea15f18f84 124
hlipka 0:ebea15f18f84 125 NTPStep m_state;
hlipka 0:ebea15f18f84 126
hlipka 0:ebea15f18f84 127 NTPPacket m_pkt;
hlipka 0:ebea15f18f84 128
hlipka 0:ebea15f18f84 129 Timer *m_watchdog;
hlipka 0:ebea15f18f84 130 int m_timeout;
hlipka 0:ebea15f18f84 131
hlipka 0:ebea15f18f84 132 bool m_closed;
hlipka 0:ebea15f18f84 133
hlipka 0:ebea15f18f84 134 Host m_host;
hlipka 0:ebea15f18f84 135
hlipka 0:ebea15f18f84 136 DNSRequest* m_pDnsReq;
hlipka 0:ebea15f18f84 137
hlipka 0:ebea15f18f84 138 NTPResult m_blockingResult; //Result if blocking mode
hlipka 0:ebea15f18f84 139
hlipka 0:ebea15f18f84 140 };
hlipka 0:ebea15f18f84 141
hlipka 0:ebea15f18f84 142 #endif