Kuinka käyttää NTP:tä Aduino Leonardon kanssa
Asetettu päälleMiten NTP toimii?
NTP käyttää UDP/IP-paketteja tiedonsiirtoon nopeiden yhteysasetusten ja vastausaikojen vuoksi. NTP:n virallinen porttinumero (jolle ntpd ja ntpdate kuuntelevat ja puhuvat) on 123. Aikayksikkö on sekunneissa ja aikakausi on 1. tammikuuta 1900.
NTP-aikaleima on 64-bittinen binääriarvo, joka on rakennettu etumerkittömästä 32-bittisen sekunnin arvosta ja 32-bittisestä murto-osasta. Tässä merkinnässä arvoa 3,5 edustaa 64-bittinen merkkijono:
0000|0000|0000|0000|0000|0000|0000|0011 . 1000|0000|0000|0000|0000|0000|0000|0000
Jos otat kaikki bitit 64-bittisenä etumerkittömänä kokonaislukuna, tallennat sen liukulukumuuttujaan, jossa on vähintään 64 bittiä mantissaa (yleensä kaksinkertainen) ja teet liukulukujaon 2^32:lla, saat oikea vastaus. Valitettavasti tavallisessa Arduino meillä ei ole 64-bittisiä tuplauksia, mutta useimmissa RTC:issä on vain toisen tason tiedot, joten toista puoliskoa (tai ensimmäistä tavua mahdollisesti) ei tarvitse saada. Vain lähtevän NTP-paketin neljä ensimmäistä tavua tarvitsee olla asetettu sille, mitä haluamme saavuttaa
sopivasti loput voivat olla mitä tahansa.
NTP-viestin otsikkokentät ovat seuraavat:
- LI-hypyn ilmaisin (2 bittiä)
- Tämä kenttä osoittaa, käytetäänkö kuluvan päivän viimeiseen minuuttiin karkaussekuntia. Kenttien arvot ovat seuraavat:
- 0: Ei karkaussekunnin säätöä
- 1: Päivän viimeisellä minuutilla on 61 sekuntia
- 2: Päivän viimeisellä minuutilla on 59 sekuntia
- 3: Kelloa ei ole synkronoitu
- Tämä kenttä osoittaa, käytetäänkö kuluvan päivän viimeiseen minuuttiin karkaussekuntia. Kenttien arvot ovat seuraavat:
- VN NTP -versionumero (3 bittiä) (nykyinen versio on 4).
- Mode NTP-pakettitila (3 bittiä)
- Tila-kentän arvot ovat seuraavat:
- 0: Varattu
- 1: Symmetrinen aktiivinen
- 2: Symmetrinen passiivi
- 3: Asiakas
- 4: Palvelin
- 5: Lähetys
- 6: NTP-ohjausviesti
- 7: Varattu yksityiskäyttöön
- Tila-kentän arvot ovat seuraavat:
- Aikalähteen kerrostaso (8 bittiä)
- Stratum-kentän arvot ovat seuraavat:
- 0: Määrittelemätön tai virheellinen
- 1: Ensisijainen palvelin
- 2–15: Toissijainen palvelin
- 16: Ei synkronoitu
- 17–255: Varattu
- Stratum-kentän arvot ovat seuraavat:
- Poll Poll-väli (8-bittinen etumerkillinen kokonaisluku)
- Peräkkäisten NTP-viestien välisen enimmäisajan log2-arvo sekunneissa.
- Tarkkuuskellon tarkkuus (8-bittinen etumerkillinen kokonaisluku)
- Järjestelmän kellon tarkkuus, log2 sekuntia.
- NTP ensimmäiset neljä tavua 0xEC0600E3
Tämä on NTP-pyynnön otsikko, mutta tarvitsemme vain ensimmäiset 32 bittiä. Määritämme NTP PAKETIN KOON, joka on 48 tavua, koska NTP-aikaleima on viestin ensimmäisissä 48 tavussa onnistuneen kyselyn jälkeen, saamme 48 tavun vastauksen NTP-palvelimelta.
Jos haluat ymmärtää NTP-kyselyn ja vastauksen rakenteen, katso http://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-58/154-ntp.html
Joten jos haluamme lukea "Transmit Timestamp", meidän on luettava kokonaisluku, joka on tavua 40, 41, 42, 43, jos haluamme pyöristää lähimpään sekuntiin, jos haluamme jonkin verran tarkkuutta, murto-osa on tavu 44, 45,46,47 jos se on suurempi kuin 500 ms, tavu 44 on > 128 ja näin ollen vain tarkistamalla vastauksen tavu 44, voimme pyöristää seuraavaan sekuntiin; 90 prosentilla NTP-palvelimista verkkoviiveet ovat alle 100 ms
Voimme myös ottaa huomioon oletetun 50 ms:n keskimääräisen verkon viiveen, joten 128:aan vertaamisen sijaan voit verrata arvoon (0,5 s - 0,05 s) * 256 = 115;