Arduino – UdpNtpClient – Bien choisir son serveur d impression
Udp NTP Client
Obtenir l'heure à partir d'un serveur de temps NTP (Network Time Protocol)
Montre comment utiliser UDP sendPacket et ReceivePacket
Pour plus d'informations sur les serveurs de temps NTP et les messages nécessaires pour communiquer avec eux,
voir http://en.wikipedia.org/wiki/Network_Time_Protocol
créé le 4 sept. 2010
par Michael Margolis
modifié le 9 avril 2012
par Tom Igoe
modifié le 2 septembre 2015
par Arturo Guadalupi
Ce code est dans le domaine public.
* /
#comprendre
#comprendre
#comprendre
// Entrez une adresse MAC pour votre contrôleur ci-dessous.
// L'adresse MAC des boucliers Ethernet plus récents est indiquée sur un autocollant.
octet Mac[[[[] =
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
;
non signé int port local = 8888; // port local pour écouter les paquets UDP
const carboniser timeServer[[[[] = "time.nist.gov"; // serveur NTP time.nist.gov
const int NTP_PACKET_SIZE = 48; // l'horodatage NTP est dans les 48 premiers octets du message
octet packetBuffer[[[[NTP_PACKET_SIZE]; // tampon pour contenir les paquets entrants et sortants
// Une instance UDP pour nous permettre d'envoyer et de recevoir des paquets via UDP
EthernetUDP Udp;
vide installer()
// Vous pouvez utiliser Ethernet.init (pin) pour configurer la broche CS
//Ethernet.init(10); // La plupart des boucliers Arduino
//Ethernet.init(5); // Bouclier ETR MKR
//Ethernet.init(0); // Teensy 2.0
//Ethernet.init(20); // Teensy ++ 2.0
//Ethernet.init(15); // ESP8266 avec Adafruit Featherwing Ethernet
//Ethernet.init(33); // ESP32 avec Adafruit Featherwing Ethernet
// Ouvrez les communications série et attendez que le port s'ouvre:
En série.commencer(9600);
tandis que (!En série)
; // attend que le port série se connecte. Nécessaire pour le port USB natif uniquement
// démarrer Ethernet et UDP
si (Ethernet.commencer(Mac) == 0)
En série.imprimer("Échec de la configuration d'Ethernet avec DHCP");
// Vérifier la présence de matériel Ethernet
si (Ethernet.état du matériel() == EthernetNoHardware)
En série.imprimer("Le bouclier Ethernet n'a pas été trouvé. Désolé, impossible de fonctionner sans matériel. :(");
autre si (Ethernet.linkStatus() == LinkOFF)
En série.imprimer("Le câble Ethernet n'est pas connecté.");
// inutile de continuer, alors ne faites rien pour toujours:
tandis que (vrai)
retard(1);
Udp.commencer(port local);
vide boucle()
sendNTPpacket(timeServer); // envoie un paquet NTP à un serveur de temps
// attend de voir si une réponse est disponible
retard(1000);
si (Udp.parsePacket())
// nous avons reçu un paquet, lis les données
Udp.lis(packetBuffer, NTP_PACKET_SIZE); // lit le paquet dans le tampon
// l'horodatage commence à l'octet 40 du paquet reçu et compte quatre octets,
// ou deux mots, long. Tout d’abord, extrayez les deux mots:
non signé longue HighWord = mot(packetBuffer[[[[40], packetBuffer[[[[41]);
non signé longue lowWord = mot(packetBuffer[[[[42], packetBuffer[[[[43]);
// combine les quatre octets (deux mots) en un entier long
// c'est l'heure NTP (secondes depuis le 1er janvier 1900):
non signé longue secondesdepuis1900 = HighWord << 16
// attend dix secondes avant de demander à nouveau l'heure
retard(10000);
Ethernet.maintenir();
// envoie une requête NTP au serveur de temps à l'adresse indiquée
vide sendNTPpacket(const carboniser * adresse)
// met tous les octets du tampon à 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialise les valeurs nécessaires pour former une requête NTP
// (voir URL ci-dessus pour plus de détails sur les paquets)
packetBuffer[[[[0] = 0b11100011; // LI, Version, Mode
packetBuffer[[[[1] = 0; // strate ou type d'horloge
packetBuffer[[[[2] = 6; // Intervalle d'interrogation
packetBuffer[[[[3] = 0xEC; // Précision d'horloge homologue
// 8 octets de zéro pour le délai et la dispersion des racines
packetBuffer[[[[12] = 49;
packetBuffer[[[[13] = 0x4E;
packetBuffer[[[[14] = 49;
packetBuffer[[[[15] = 52;
// tous les champs NTP ont reçu des valeurs, maintenant
// vous pouvez envoyer un paquet demandant un horodatage:
Udp.beginPacket(adresse, 123); // Les requêtes NTP doivent porter le port 123
Udp.écrire(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
Commentaires
Laisser un commentaire