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 24 23:07:27 2011 +0000
Revision:
1:63ded11b8fa2
Parent:
0:ebea15f18f84
bugfix: re-added timeout handling

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 "mbed.h"
hlipka 0:ebea15f18f84 35
hlipka 0:ebea15f18f84 36 ///NTP Client results
hlipka 0:ebea15f18f84 37 enum NTPResult
hlipka 0:ebea15f18f84 38 {
hlipka 0:ebea15f18f84 39 NTP_OK, ///<Success
hlipka 0:ebea15f18f84 40 NTP_PROCESSING, ///<Processing
hlipka 0:ebea15f18f84 41 NTP_PRTCL, ///<Protocol error
hlipka 0:ebea15f18f84 42 NTP_TIMEOUT, ///<Connection timeout
hlipka 0:ebea15f18f84 43 NTP_DNS ///<Could not resolve DNS hostname
hlipka 0:ebea15f18f84 44 };
hlipka 0:ebea15f18f84 45
hlipka 0:ebea15f18f84 46 __packed struct NTPPacket //See RFC 4330 for Simple NTP
hlipka 0:ebea15f18f84 47 {
hlipka 0:ebea15f18f84 48 //WARN: We are in LE! Network is BE!
hlipka 0:ebea15f18f84 49 //LSb first
hlipka 0:ebea15f18f84 50 unsigned mode : 3;
hlipka 0:ebea15f18f84 51 unsigned vn : 3;
hlipka 0:ebea15f18f84 52 unsigned li : 2;
hlipka 0:ebea15f18f84 53
hlipka 0:ebea15f18f84 54 uint8_t stratum;
hlipka 0:ebea15f18f84 55 uint8_t poll;
hlipka 0:ebea15f18f84 56 uint8_t precision;
hlipka 0:ebea15f18f84 57 //32 bits header
hlipka 0:ebea15f18f84 58
hlipka 0:ebea15f18f84 59 uint32_t rootDelay;
hlipka 0:ebea15f18f84 60 uint32_t rootDispersion;
hlipka 0:ebea15f18f84 61 uint32_t refId;
hlipka 0:ebea15f18f84 62
hlipka 0:ebea15f18f84 63 uint32_t refTm_s;
hlipka 0:ebea15f18f84 64 uint32_t refTm_f;
hlipka 0:ebea15f18f84 65 uint32_t origTm_s;
hlipka 0:ebea15f18f84 66 uint32_t origTm_f;
hlipka 0:ebea15f18f84 67 uint32_t rxTm_s;
hlipka 0:ebea15f18f84 68 uint32_t rxTm_f;
hlipka 0:ebea15f18f84 69 uint32_t txTm_s;
hlipka 0:ebea15f18f84 70 uint32_t txTm_f;
hlipka 0:ebea15f18f84 71 };
hlipka 0:ebea15f18f84 72
hlipka 0:ebea15f18f84 73 /**
hlipka 0:ebea15f18f84 74 The NTP client is a simple UDP client that will update the mbed's RTC
hlipka 0:ebea15f18f84 75 */
hlipka 0:ebea15f18f84 76 class NTPClient
hlipka 0:ebea15f18f84 77 {
hlipka 0:ebea15f18f84 78 public:
hlipka 0:ebea15f18f84 79 /**
hlipka 0:ebea15f18f84 80 Instantiates the NTP client
hlipka 0:ebea15f18f84 81 */
hlipka 0:ebea15f18f84 82 NTPClient();
hlipka 0:ebea15f18f84 83 ~NTPClient();
hlipka 0:ebea15f18f84 84
hlipka 0:ebea15f18f84 85 /**
hlipka 0:ebea15f18f84 86 Updates the time using the server host, blocks until completion
hlipka 0:ebea15f18f84 87 @param host : NTP server
hlipka 0:ebea15f18f84 88 */
hlipka 0:ebea15f18f84 89 NTPResult setTime(const Host& host); //Blocking
hlipka 0:ebea15f18f84 90
hlipka 0:ebea15f18f84 91 void close();
hlipka 0:ebea15f18f84 92
hlipka 0:ebea15f18f84 93 private:
hlipka 0:ebea15f18f84 94 void init();
hlipka 0:ebea15f18f84 95 void open();
hlipka 0:ebea15f18f84 96
hlipka 0:ebea15f18f84 97 /**
hlipka 0:ebea15f18f84 98 Updates the time using the server host
hlipka 0:ebea15f18f84 99 The function returns immediately and calls the previously set callback on completion or error
hlipka 0:ebea15f18f84 100 @param host : NTP server
hlipka 0:ebea15f18f84 101 */
hlipka 0:ebea15f18f84 102 void doSetTime(const Host& host);
hlipka 0:ebea15f18f84 103
hlipka 0:ebea15f18f84 104 void process(); //Main state-machine
hlipka 0:ebea15f18f84 105
hlipka 0:ebea15f18f84 106 void setTimeout(int ms);
hlipka 0:ebea15f18f84 107 void resetTimeout();
hlipka 0:ebea15f18f84 108
hlipka 0:ebea15f18f84 109 void onTimeout(); //Connection has timed out
hlipka 0:ebea15f18f84 110 void onUDPSocketEvent(UDPSocketEvent e);
hlipka 0:ebea15f18f84 111 void onResult(NTPResult r); //Called when exchange completed or on failure
hlipka 0:ebea15f18f84 112
hlipka 0:ebea15f18f84 113 NTPResult blockingProcess(); //Called in blocking mode, calls Net::poll() until return code is available
hlipka 0:ebea15f18f84 114
hlipka 1:63ded11b8fa2 115 UDPSocket* _pUDPSocket;
hlipka 1:63ded11b8fa2 116
hlipka 1:63ded11b8fa2 117
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 1:63ded11b8fa2 125 NTPStep _state;
hlipka 0:ebea15f18f84 126
hlipka 1:63ded11b8fa2 127 NTPPacket _pkt;
hlipka 0:ebea15f18f84 128
hlipka 1:63ded11b8fa2 129 Timer *_watchdog;
hlipka 1:63ded11b8fa2 130 int _timeout;
hlipka 0:ebea15f18f84 131
hlipka 1:63ded11b8fa2 132 bool _closed;
hlipka 0:ebea15f18f84 133
hlipka 1:63ded11b8fa2 134 Host _host;
hlipka 1:63ded11b8fa2 135
hlipka 1:63ded11b8fa2 136 NTPResult _blockingResult; //Result if blocking mode
hlipka 0:ebea15f18f84 137
hlipka 0:ebea15f18f84 138 };
hlipka 0:ebea15f18f84 139
hlipka 0:ebea15f18f84 140 #endif