Search code examples
autoit

Autoit UDP Request To NTP Timeserver


I need to use autoit to get the time from a local ntp timeserver.

; Function gets time from timeserver to not relay on pc time
Func get_Time_From_Time_Server() 
    Local $iSocket = UDPOpen(TCPNameToIP($s_Time_Server),  123) ; Port 123
    Local $data = ""

    While $data = ""
        $data = UDPRecv($iSocket, 100)
        Sleep(100)
    Wend        
EndFunc

Opening the UDP connection seems to work, but $data stays equal to "".


Solution

  • Where is any request to socket in your code?

    Here is example of receiving data from local ntp (Source):

    #include <Date.au3>
    
    $recv = NTP_Connect("10.24.1.20")
    ConsoleWrite($recv & @CRLF)
    Parse_Time($recv)
    
    Func NTP_Connect($NTP_Server)
        UDPStartup()
        Dim $socket = UDPOpen(TCPNameToIP($NTP_Server), 123)
        $status = UDPSend($socket, MakePacket("1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"))
        $data = ""
        While $data = ""
            $data = UDPRecv($socket, 100)
            Sleep(100)
        WEnd
        UDPCloseSocket($socket)
        UDPShutdown()
        Return $data
    EndFunc   ;==>NTP_Connect
    
    Func MakePacket($d)
        Local $p = ""
        While $d
            $p &= Chr(Dec(StringLeft($d, 2)))
            $d = StringTrimLeft($d, 2)
        WEnd
        Return $p
    EndFunc   ;==>MakePacket
    
    Func Parse_Time($bdata)
        $unsignedHexValue = StringMid($bdata, 83, 8)
        $value = UnsignedHexToDec($unsignedHexValue)
        $TZinfo = _Date_Time_GetTimeZoneInformation()
        $UTC = _DateAdd("s", $value, "1900/01/01 00:00:00")
        ConsoleWrite($UTC & @CRLF)
        If $TZinfo[0] <> 2 Then ; 0 = Daylight Savings not used in current time zone / 1 = Standard Time
            $TZoffset = ($TZinfo[1]) * - 1
        Else ; 2 = Daylight Savings Time
            $TZoffset = ($TZinfo[1] + $TZinfo[7]) * - 1
        EndIf
        $UTC = _DateAdd("n", $TZoffset, $UTC)
        $m = StringMid($UTC, 6, 2)
        $d = StringMid($UTC, 9, 2)
        $y = StringMid($UTC, 1, 4)
        $h = StringMid($UTC, 12, 2)
        $mi = StringMid($UTC, 15, 2)
        $s = StringMid($UTC, 18, 2)
    EndFunc
    
    Func UnsignedHexToDec($n)
        $ones = StringRight($n, 1)
        $n = StringTrimRight($n, 1)
        Return Dec($n) * 16 + Dec($ones)
    EndFunc   ;==>UnsignedHexToDec
    

    Explanation of request packet here.