Time Server

Mark Schonewille m.schonewille at economy-x-talk.com
Sun Jul 27 16:00:17 EDT 2008

Thanks for the good advice, Gordon.

Although I would like to be able to talk to SNTP server directly, it  
is sufficient for now. Here is the script. I'll probably put a little  
libary on-line on the Economy-x-Talk website later. Mind line wraps.

-- !!! start here !!!
/* simple NTP client over Telnet
Copyright©2008 by Economy-x-Talk
and Mark Schonewille, Nijmegen
the Netherlands

Copy this button (script) to your own project or attach
this stack as a substack. Inser the script of this
button into back - use it as a backscript.

Call the getTime handler as follows:

getTime <callbackMessage>[,server[,port]

- callbackMessage is the name of the handler that will trap
the callback message
- the optional server parameter is the address of a time server
- the port parameter is optional as well and contains the port
number at which the server is contacted; the port number is only
necessary if not included with the server address.


getTime "timeReceived"
getTime "timeReceived","time.nist.gov:13"
getTime "timeReceived","time.nist.gov",13

Above examples need a handler names "timeReceived". The
callback message comes with one parameter. This parameter is
an array with 9 keys.

d-st: a code indicating daylight saving or standart time
julian date: (modified) Julian date
error: any error messages
compensated delay: time adjustment, which makes sure that the time is  
right on arrival
leap: whether a 1 second time adjustment was applied
raw: the original time stamp use to compose the array
server health: whether the server is running without problems
date: date in American format
time: long time

See http://tf.nist.gov/service/its.htm for more information.

The object, card or stack that calls the getTime handler
must have a handler to trap the callback message.

Thanks to Gordon Tillman for the hint to use Telnet and to
whoever made the Telnet.mc stack for MetaCard.

constant kTimeServer = "time.nist.gov:13"

local lCallbackMessage, lButtonID

on getTime theCallbackMessage,theServer,thePort
    if theServer is empty then put kTimeServer into theServer
    if thePort is not empty then put colon & thePort after theServer
    put theCallbackMessage into lCallbackMessage
    put the long id of the target into lButtonID
    open socket to theServer
    if the result is not empty then return false
    read from socket theServer with message "rcvTime"
    if the result is not empty then return false
    else return true
end getTime

on rcvTime theSock,theTime
    put the long id of the target
    filter theTime without empty
    put theTime into myTimeArray["raw"]
    put word 1 of theTime into myTimeArray["julian date"] -- modified  
julian date
    put word 2 of theTime into myTimeArray["date"]
    put word 3 of theTime into myTimeArray["time"]
    put word 4 of theTime into myTimeArray["d-st"] --tt
    put word 5 of theTime into myTimeArray["leap"]
    put word 6 of theTime into myTimeArray["server health"]
    put word 7 of theTime into myTimeArray["compensated delay"] -- msADV
    if not ((word 6 of theTime) is 0 and last char of theTime is "*")  
       put "Error: server may return invalid time" into  
       put empty into myTimeArray["error"]
    end if
    do "send" && quote & lCallbackMessage && "myTimeArray" & quote &&  
"to lButtonID"
    close socket theSock -- normally unnecessary
end rcvTime

-- the following handler is useful
-- of you have your script in a checkbox
on mouseUp
    if the id of the target is the id of me then
       if the long id of me is in the backscripts then
          remove the script of me from back
          set the hilite of me to false
          insert the script of me into back
          set the hilite of me to true
       end if
    end if
end mouseUp

on socketError theSock,theErr
    put "error:" && theErr into myTimeArray["error"]
    do "send" && quote & lCallbackMessage && "myTimeArray" & quote &&  
"to lButtonID"
end socketError

on socketTimeout theSock
    put "error:" && "socket timeout" into myTimeError["error"]
    do "send" && quote & lCallbackMessage && "myTimeArray" & quote &&  
"to lButtonID"
end socketTimeout
-- !!! finish !!! ------------

Best regards,

Mark Schonewille

Economy-x-Talk Consulting and Software Engineering

Benefit from our inexpensive hosting services. See http://economy-x-talk.com/server.html 
  for more info.

On 27 jul 2008, at 16:51, Gordon Tillman wrote:

> Mark I know you can talk to an SNTP server with telnet.  Here I just  
> did the following:
> $ telnet time-a.nist.gov 13
> Trying
> Connected to time-a.nist.gov.
> Escape character is '^]'.
> 54674 08-07-27 14:50:55 50 0 0 340.9 UTC(NIST) *
> Connection closed by foreign host.
> --gordon

More information about the use-livecode mailing list