none
Ceer une horloge d'apres un serveur NTP RRS feed

  • Discussion générale

  • Bonjour,

    Je souhaite Ceer une horloge dans mon application en connection sur un serveur NTP directement sans passer par le poste de travail.

    vendredi 28 juillet 2017 15:23

Toutes les réponses

  • Bonjour,

    Je suis à la recherche d'un exemple de programmation en VB.NET pour récuperer l'heur d'un serveur NTP.

    Merci par avance de votre réponse

    Cordialement

    vendredi 28 juillet 2017 13:37
  • Tu connectes un socket sur le port 123 et décodes la réponse.

    Exemple classique, testé avec le NTP de Google (à mettre dans un Timer ou un Thread si c'est pour une horloge):

    Dim sNtpServer As String = "time.google.com"
    
    Const nDaysTo1900 As Integer = 1900 * 365 + 95
    Const nTicksPerSecond As Long = 10000000L
    Const nTicksPerDay As Long = 24 * 60 * 60 * nTicksPerSecond
    Const nTicksTo1900 As Long = nDaysTo1900 * nTicksPerDay
    
    Dim ntpData = New Byte(47) {}
    ntpData(0) = &H1B
    Dim addresses = Dns.GetHostEntry(sNtpServer).AddressList
    Dim ipEndPoint = New IPEndPoint(addresses(0), 123)
    Dim nPingDuration As Long = Stopwatch.GetTimestamp()
    Using socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        socket.Connect(ipEndPoint)
        socket.ReceiveTimeout = 5000
        socket.Send(ntpData)
        nPingDuration = Stopwatch.GetTimestamp()
        socket.Receive(ntpData)
        nPingDuration = Stopwatch.GetTimestamp() - nPingDuration
    End Using
    
    Dim nPingTicks As Long = nPingDuration * nTicksPerSecond / Stopwatch.Frequency
    Dim nSecondsPart As Long = CLng(ntpData(40)) << 24 Or CLng(ntpData(41)) << 16 Or CLng(ntpData(42)) << 8 Or ntpData(43)
    Dim nFractionsPart As Long = CLng(ntpData(44)) << 24 Or CLng(ntpData(45)) << 16 Or CLng(ntpData(46)) << 8 Or ntpData(47)
    Dim nNetTicks As Long = nSecondsPart * nTicksPerSecond + (nFractionsPart * nTicksPerSecond >> 32)
    
    Dim ntpDateTime = New DateTime(nTicksTo1900 + nNetTicks + nPingTicks / 2)
    ntpDateTime = ntpDateTime.ToLocalTime()
    Console.WriteLine("Heure du serveur NTP " + sNtpServer + " = " + ntpDateTime)


    • Modifié Castorix31 samedi 29 juillet 2017 09:07
    samedi 29 juillet 2017 08:57
  • Vous pouvez créer une classe pour interroger un serveur de temps internet.

    Par exemple:

    avec le code

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Dim myNTPTest As New NTC ' Pratique de mettre le texte formatté pour l'affichage dans un objet Date...
    IciEtMaintenant = myNTPTest.GetTime.ToString

            TextBox1.Text = IciEtMaintenant.ToString End Sub

    et la classe NTC:

    Public Class NTC Private NTPData(47) As Byte '48 bytes de données transmis par le serveur de temps. Private Const OffsetTransmitTime As Byte = 40 'L'offset pour la transmission de l'information. Private Srvr As String = "time.nist.gov" 'Le serveur de temps par défaut. Private Prt As Integer = 123 'Le port utilisé pour la requête par défaut. Private ReceiveTime As DateTime 'L'heure reçue.

    Friend Sub New()
            ' Juste initialisation vide aux valeurs par défaut!
            Srvr = "time.nist.gov" 'Le serveur de temps par défaut.
            Prt = 123 'Le port utilisé pour la requête par défaut.
        End Sub

    ' Créateur pour un serveur spécifique Friend Sub New(ByVal Server As String) Me.Srvr = Server End Sub ' Créateur pour un serveur et un port spécifiques Friend Sub New(ByVal Server As String, ByVal Port As Integer) Me.Srvr = Server Me.Prt = Port End Sub ' La fonction pour obtenir l'heure internet depuis le serveur. Friend Function GetTime() As DateTime Dim UdpSocket As New Sockets.UdpClient Dim Address As IPHostEntry = Dns.GetHostEntry(Me.Srvr) Dim EndPt As New IPEndPoint(Address.AddressList(0), Me.Prt) ' Connection socket UDP avec le serveur UdpSocket.Connect(EndPt) ' Le tableau de byte pour les données, vide initialement: Initialisé à la version 4 en mettant le premier byte à 1B (27) NTPData(0) = &H1B ' Envoi du packet requête au serveur de temps UdpSocket.Send(NTPData, NTPData.Length) ' Réception des données depuis le serveur de temps NTPData = UdpSocket.Receive(EndPt) ' Heure de réception pour le système local. ReceiveTime = Now ' Le retour de la marque de temp NTP est sur 64-bit unsigned, ' en seconde relativement à 0h le 1er janvier 1900. ' La partie intégrale est dans les premiers 32 bits, ' la partie fractionelle dans les derniers 32 bits. ' Dans la partie fractionnelle le non-significant low order peut être mis à 0. Dim IntPart As ULong 'Partie intégrale Dim FractPart As ULong 'Partie fractionnelle 'Calcul du delta de temps de transmission Dim I, J As Integer J = 4 For I = 0 To 3 IntPart <<= 8 ' Shift gauche par 8 bit IntPart += NTPData(OffsetTransmitTime + I) 'Ajout de la partie intégrale FractPart <<= 8 FractPart += NTPData(OffsetTransmitTime + J) 'Ajout de la partie fractionnelle J += 1 Next 'Calcul des millisecondes depuis 1900, 0:0:0 Dim milliseconds As ULong = (IntPart * 1000 + (FractPart * 1000) / &H100000000) 'IntPart <<= 32 += FractPart Dim myTimeSpan As New TimeSpan myTimeSpan = TimeSpan.FromMilliseconds(CDbl(milliseconds))
    ' Date d'origine 1900 0:0:0
            Dim HeureOrigine As New DateTime(1900, 1, 1)
            ' L'heure actuelle est l'heure origine plus le temps écoulé
            Dim HeureActuelle As Date
            HeureActuelle = HeureOrigine.Add(myTimeSpan)

            ' Utilisation de la TimeZone pour le temps local
            Dim offsetAmount As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(HeureActuelle)
            ' L'heure locale est le temps internet retourné + l'offset de la timezone!
            Dim HeureLocale As DateTime = (HeureActuelle + offsetAmount)
            ' La fonction retourne l'heure locale
            GetTime = HeureLocale End Function End Class





    lundi 31 juillet 2017 09:57