NTP-Clock на ESP8266. Теряется много посылок.
- Войдите на сайт для отправки комментариев
Собственно, это мой первый опыт работы с ESP8266, поэтому возникают непонятки.
Плата такая:
но китайский аналог: немного отличаются шрифты (хотя более или менее подобраны) и строка на обратной стороне "1. Install 340G driver" смещена на 1 позицию вправо по отношению к другим строкам. Расположение деталей идентично.
к IDE подключена как "NodeMCU 1.0 (ESP-12E Module)"
Роутер, к которому подключаются: Asus RT-N12 VP.
Скетч:
/* Udp NTP Client Get the time from a Network Time Protocol (NTP) time server Demonstrates use of UDP sendPacket and ReceivePacket For more on NTP time servers and the messages needed to communicate with them, see http://en.wikipedia.org/wiki/Network_Time_Protocol created 4 Sep 2010 by Michael Margolis modified 9 Apr 2012 by Tom Igoe updated for the ESP8266 12 Apr 2015 by Ivan Grokhotkov This code is in the public domain. */ #include <ESP8266WiFi.h> #include <WiFiUdp.h> #ifndef STASSID #define STASSID "ASUS_Scorpio" #define STAPSK "************************" #endif const char * ssid = STASSID; // your network SSID (name) const char * pass = STAPSK; // your network password unsigned int localPort = 2390; // local port to listen for UDP packets /* Don't hardwire the IP address or we won't get the benefits of the pool. Lookup the IP address for the host name instead */ //IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server IPAddress timeServerIP; // time.nist.gov NTP server address const char* ntpServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets // A UDP instance to let us send and receive packets over UDP WiFiUDP udp; void setup() { Serial.begin(115200); Serial.println(); Serial.println(); // We start by connecting to a WiFi network Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println("Starting UDP"); udp.begin(localPort); Serial.print("Local port: "); Serial.println(udp.localPort()); } void loop() { //get a random server from the pool WiFi.hostByName(ntpServerName, timeServerIP); sendNTPpacket(timeServerIP); // send an NTP packet to a time server // wait to see if a reply is available delay(1000); int cb = udp.parsePacket(); if (!cb) { Serial.println("no packet yet"); } else { Serial.print("packet received, length="); Serial.println(cb); // We've received a packet, read the data from it udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer //the timestamp starts at byte 40 of the received packet and is four bytes, // or two words, long. First, esxtract the two words: unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); // combine the four bytes (two words) into a long integer // this is NTP time (seconds since Jan 1 1900): unsigned long secsSince1900 = highWord << 16 | lowWord; Serial.print("Seconds since Jan 1 1900 = "); Serial.println(secsSince1900); // now convert NTP time into everyday time: Serial.print("Unix time = "); // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: const unsigned long seventyYears = 2208988800UL; // subtract seventy years: unsigned long epoch = secsSince1900 - seventyYears; // print Unix time: Serial.println(epoch); // print the hour, minute and second: Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) Serial.print(':'); if (((epoch % 3600) / 60) < 10) { // In the first 10 minutes of each hour, we'll want a leading '0' Serial.print('0'); } Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) Serial.print(':'); if ((epoch % 60) < 10) { // In the first 10 seconds of each minute, we'll want a leading '0' Serial.print('0'); } Serial.println(epoch % 60); // print the second } // wait ten seconds before asking for the time again delay(10000); } // send an NTP request to the time server at the given address void sendNTPpacket(IPAddress& address) { Serial.println("sending NTP packet..."); // set all bytes in the buffer to 0 memset(packetBuffer, 0, NTP_PACKET_SIZE); // Initialize values needed to form NTP request // (see URL above for details on the packets) packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; // all NTP fields have been given values, now // you can send a packet requesting a timestamp: udp.beginPacket(address, 123); //NTP requests are to port 123 udp.write(packetBuffer, NTP_PACKET_SIZE); udp.endPacket(); }
лог:
Connecting to ASUS_Scorpio ....... WiFi connected IP address: 192.168.200.207 Starting UDP Local port: 2390 sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... packet received, length=48 Seconds since Jan 1 1900 = 3788421294 Unix time = 1579432494 The UTC time is 11:14:54 sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... packet received, length=48 Seconds since Jan 1 1900 = 3788421415 Unix time = 1579432615 The UTC time is 11:16:55 sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... packet received, length=48 Seconds since Jan 1 1900 = 3788421558 Unix time = 1579432758 The UTC time is 11:19:18 sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... packet received, length=48 Seconds since Jan 1 1900 = 3788421624 Unix time = 1579432824 The UTC time is 11:20:24 sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... no packet yet sending NTP packet... packet received, length=48 Seconds since Jan 1 1900 = 3788421745 Unix time = 1579432945 The UTC time is 11:22:25 sending NTP packet... no packet yet sending NTP packet... no packet yet
Из лога видно, что получить время удается довольно редко - в среднем раз в 2 минуты. Это при том, что условия, на мой взгляд, идеальные: менее 2 метров в прямой видимости. А в рабочем режиме он должен будет работать через одну железобетонную стену.
Возникает вопрос: какая из ситуаций имеет место быть:
1. Неисправно конкретное устройство - нужно поменять на аналогичное исправное.
2. Неудачно выбрано устройство - вместо него лучше использовать [ссылка на конкретное устройство].
3. Проблема в скетче/библиотеке - следует за заменить библиотеку на [...], а в скетче поменять строки ... на ...
4. Так и должно быть - смирись и разрабатывай алгоритм работы устройства, исходя из реалий нашего несовершенного Мира.
я поступил неспортивно - пользуюсь библиотекой. Зато работает абсолютно стабильно:
Сережа! Вот мой лог твоего кода без изменений... кроме ссид и пароля ;))))
Вот пациент, мини ближе лежал:
==============================
Все нормально вроде....
смотри свой выход в сеть.
вот такую вставочку сделай (по тексту видно куда)
Это позволит видеть куда стучимся ;)).
Вот лог с пулом ntp.ix.ru. Куда лучше, нет? ;)))
спросил и ушел... я хоть и старый дядька, а все равно обидно.
спросил и ушел... я хоть и старый дядька, а все равно обидно.
Я обычно так планирую свое время, чтобы между отправкой вопроса и первым просмотром откликов прошло некоторое время. Я что, не прав?
Спасибо всем откликнувшимся.
Начал с конца: заменил сервер на ntp.ix.ru и стал возвращаться практически каждый пакет, что по сути говорит, что проблема решена.
В общем, следует признать, что из четырех моих вариантов ответа ни один не оказался правильным (((((
Продолжу данную тему.
Та же ситуация. Имеются часы на ESP8266, которые 1 раз в сутки синхронизировались с NTP. Несколько недель часы валялись без батареи. Пару дней назад включил их - та же картина. Не получают данные от NTP сервера. От слова совсем.
Пробовал скетч с первого поста + правка от wdrakula. Пробовал сервера: ntp.ix.ru, pool.ntp.org, ua.pool.ntp.org, 0.ua.pool.ntp.org, time.nist.gov... и еще несколько. Но результат всегда один и тот же. Связь с WiFi хорошая. Платы ESP пробовал разные. Живу в Украине (не знаю, важно это или нет).
Вот один из логов:
Что можете посоветовать?