Официальный сайт компании Arduino по адресу arduino.cc
ntp по UDP
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 30/09/2015 - 19:41
Здравствуйте
пробую поиграться с получением времени от ntp серверов
примеры, присутствующие в сети, зависают на запросе к серверу ( то есть следующие за ним инструкции не выполняется).
sendNTPpacket(timeServer);
так как пример в сети один и тот же,
ВОПРОС
у кого-нибудь получалось сделать ЭТО? способом из примера , или иным способом.
примеры, присутствующие в сети, зависают на запросе к серверу ( то есть следующие за ним инструкции не выполняется).
То есть условие if ( Udp.parsePacket() ) (строка 66 в примере) не выполняется ?
У меня пару лет работает скетч, где синхронизация времени сделана аналогично приведенному примеру, проблем с ним не было. Вот такая функция
как видите, по сути не отличается от http://wikihandbk.com/wiki/Arduino:Примеры/UdpNtpClient.
А Вы точно уверены, что у Вас отрабатывает
и пакет уходит на сервер, кстати, сервер живой, правильный ?
Поставленная в 63 строку команда вывода в монитор чегонибудь не отрабатывает.
До 66 дело не доходит, сервер живой.
Udp.endPacket(); не отрабатывет, то есть вывод в монитор после него молчит, до него ок.
ну да Ваш код , по крайней мере запроса аналогичен.... Как говорится :" все как настоящее, только не работает :)
интересно, а порт 8888 принципиален и нужно ли по нему что-нибудь специально натить в роутере?
хмм пробросил нат снаружи внутрь по 8888 порту для udp, разрешил по адресу и этому порту входящие udp пакеты, не помогло. В любом случае счетчики не ловят по этому порту активности. Даже открывал полный сквозняк на файрволе, тоже ноль реакции.
Спасибо.
Значит
проходит,а на
Udp.endPacket();
тупо виснет ?
Хм.. Я бы, пожалуй, попробовал бы произвольный UDP-пакет послать себе на компьютер и там его поймать, например, вот этим: http://www.nsauditor.com/network_tools/udp-client-server.html. А потом туда же попробовать NTP-запрос послать.
На роутере специально ничего ни с какими портами я не делал.
Точно так
По идее бегин-енд уже должны сформировать пакет с пустым содержимым...
Убрал между бегино-ендом запись содержимого буфера, по-прежнему енд не проходит...
программу попробую,
Также попробую прохождение пакета посмотреть на файрволе, у мну микротик, там можно тонко настраиваться.
хмм а для чего тогда нужен слушающий порт , это же клиент...
.......и пакет уходит на сервер, кстати, сервер живой, правильный ?
Сервер живой, правильный, я вчера виндой проверял.
И отвечал мгновенно, в отличии от микрософта
нету ничего на выходе по udp протоколу, никто не ловит пакеты...
По tcpdump - видно, что общаются, или "пакет-запрос ушел на сервер и тишина"? Год-полтора назад, помнится, крутили все ntp сервера на предмет запретов на определенные запросы. Вполне возможно, что Ваш запрос как раз под этот запрет и попадает...
не общаются, любые манипуляции с udp заканчиваются на инструкции Udp.endPacket();
насколько я понимаю именно ета инструкция обозначает для контроллера не только завершение засылки пакета в его буфер, но и указание на отсылку пакета.
не общаются, любые манипуляции с udp заканчиваются на инструкции Udp.endPacket();
Ну так распечатайте в 130-й строке пакет в консоль и попробуйте заслать его руками...
как его заслать руками?
что это мне даст? пакет ведь в контроллер засылается, не проходит команда его завершения, в том числе и без содержимого внутри вообще.
продолжение плясок с бубном ...
раз уж с udp не складывается, можно толкнуться по tcp и распарсить страничку, благо серверов много, например
http://www.direct-time.ru/
Для начала надо попробовать стандартный пример... поправил IP, шлюз, маску , вгрузил
.... ФИГВАМ ... коннекта не происходит, причем оно отшивает моментально, хотя должна быть какая то задержка на коннект.
Плата инициализирована, с роутера пингуется. На роутере стоят ловушки на пакеты по всем протоколам с IP платы и на IP платы. Ловушки ничего не фиксируют.
Прямо фантастика, причем, как сервер все работает изюмительно.
Может ли быть аппаратная проблема в железе ?
Похоже она самая,,, у меня роутер-шлюз микротик, у него веб-морда. Зарядил я ее адрес для обращения клиента. Откомпилировал и вгрузил. Выключил питание. Включил... И вдруг получил код страницы в клиенте. Попробовал еще раз - фиг. Короче одна из десяти-пятнадцати попыток успешна, или успешна частично. Похоже w5100 глючная. Кто-нибудь сталкивался ?
странная весчь...
если 2560 и навернутый на нее W5100 выдернуть питание, потом, удерживая ресет, воткнуть питание , дождаться кваканья обнаружения USB-устройства (чтобы сериал монитор работал) и отпустить ресет....\
то коннект случается в 100 случаях из 100 попыток.
Принимается 1034 символа и все нахрен виснет.
что за срань с W5100 ? кто-нибудь сталкивался с подобным ?
короче со странным поведением в связи с ресетом все выяснилось : страрые грабли. Если SD не используется, необходимо ее CS принудительно глушить на 1.
странное поведение клиента.
Все инициализируется, обращаюсь к веб-морде роутера (локальная сеть-локальный адрес) - получаю html страницы полностью и безукоризненно.
Все то-же-самоэ, только IP внешний, НИЧЕГО не происходит, на роутере даже пакеты не видны.
mask,gate мк не отличаются от остальных участников локалки, ip естественно другой. вся локалка в инет ходит, мк нет. сетевые правила для мк пакетов не видят, специально созданный персональный маскарад для мк пакетов не получает.
чудеса да и только. видимо все мои проблемы с udp и ntp-серверами растут оттуда же.
такое ощущение, что , пока пакеты идут в локалке (без участия понятия gateway) все ок, как только за пределы локалки, чип должен отсылать пакеты на gateway, а он этого не делает. При работе сервером пакеты получаются из-под nat с srs ip роутера, находящегося в локалке, и отсылаются пакетв "в ответ" на адрес в локалке, потому все работает.
надо будет мк уташшить к соседу, попробовать через его роутер толкануться.
Маска сети - правильная (/24) или какая-то другая?
Попробуйте принудительный проброс пакетов с мыльницы наружу (куда надо)...
Маска правильная, пакеты вообще в сети отсутствуют, такое ощущение, что на gateway не отсылаются.
то есть Вы предлагаете гнать пакеты по локальному адресу роутера ( ака шлюза), например на порт 9090, а на роутере пробрасывать их наружу на целевой IP, на 80 порт .... ?
Только вот вопрос , позволит ли это сделать. Destination nat ?
Попробую конечно такой выверт, только ведь костыль, оно ведь само должно на указанный gateway. Отправлять , если destination ip не в диапазоне адресов локальной маски.
получается , что в контроллере w5100 засада порыдась ?
Или в библиотеке, обрабатывающей src ip пакета и формирующей ответ... Оно совершенно спокойно может брать последний октет, и отправлять пакеты на адрес, берущийся из первых трех октетов своего ip + последний октет из src ip. :)
Да, но ведь это официальная библиотека и ее типовой пример. Ардуинцы наверно уж проверили работоспособность всего этаго. А то совсем все криво получается, и ntp и http клиенты косячат. Я склоняюсь к мысли, что пооблема все таки в железе. Вот приедет через неделю другую еще одна w5100 тогда отпишусь по результатам...
Я склоняюсь к мысли, что проблема все таки в железе.
Поддерживаю.
Угу ... Чудес не бывает, ...ня случается.
Пришла новая плата w5100. Проблема осталась.
попутно вылезло неполучение IP по DHCP.
Добрый человек также использующий MIKROTIK посоветовал перезагрузить роутер, в связи с рядом его - роутера особенностей кеширования мас-адресов.
после перезагрузки роутера адрес по DHCP стал получаться без проблем. С полученным от DHCP адресом обращение к внешним серверам стало работать. С указанными явно параметрами инициализации шильда по-прежнему не работает.
Копаю дальше.
Вопрос к уважаемому Araris-у.
В посте от Ср, 30/09/2015 - 21:16 Вы написали, что пару лет у Вас все работает по ntp. Там показан гравный цикл.
А как происходит инициализация. IP выделяется явно, как указывается gateway?
Или по DHCP? Что будет, если указать параметры инициялизации явно ?
типа этого
Я слежу за этой темой, отвечаю - все указываю явно.
Прописываю всякие-разные переменные:
Функция resetLAN(), как Вы правильно поняли, вызывается не только из setup(). Если RESET_PIN программно не дергаю, то толку мало. У меня W5100 не шилдом исполнен, а "отдельностоящая" платка, поэтому резать ничего не пришлось.
W5100WatchdogTimer срабатывает, если долго не было обмена данными через W5100, поскольку это скетч центрального контроллера квартиры, обмен есть постоянно.
server.stop(); в моем скетче отсутствует, server.begin только один раз в этой самой resetLAN(). (Скетч 129кБ, там ооочень много понаверчено, по прошествии времени самому уже нелегко разобраться.)
Заглянув в библиотекин ethernet.h, найдем там, помимо localIP(), функции subnetMask(), gatewayIP() и dnsServerIP().
Ответил кратко, занят сейчас. Если что, доспрашивайте ))
Спасибо, в общем понятно.
Так и не получается явно инициализировать, видимо надо хард_ресет шильда добавить, как у Вас...
Добавил синхронизацию RTC по ntp. Получилось.
Одновременно стартованные у меня два сервера и один Udp - клиент, полет нормальный.
W5100WatchdogTimer ... не поделитесь ли кодом :)
результат изысканий
Спасибо.
W5100WatchdogTimer ... не поделитесь ли кодом :)
Дык, там и кода-то особого не надо.
Получили данные - отмечаем "время"
W5100WatchdogTimer = millis();
В loop() ставим проверку
if ( (millis() - W5100WatchdogTimer) > MAXW5100WATCHDOGDELAY ) { resetLAN(); W5100WatchdogTimer = millis(); }
Значение MAXW5100WATCHDOGDELAY - какое пожелаете.
Естественно, это имеет смысл только если данные приходят постоянно и регулярно.
угу, понятно, надо посмотреть где правильнее в сервере воткнуть, и как быть, если к нему никто не обращался.
.... или сделать пингующего клиента на что-нибудь никогда-не-падающее и внутри него сбрасывать миллис.
Вообще мне не нравится с миллис работать, более явным , почти мультизадачным выглядит SimpleTimer, на котором я все и построил.
Работает устойчиво, севера и мат.модель в loop() живут, а запись лога, коррекция ntp и опрос датчиков периодически исполняются по таймеру...
.... или сделать пингующего клиента на что-нибудь никогда-не-падающее и внутри него сбрасывать миллис.
Я об этом тоже думал, но не стал делать, так как отсутствие пинга может означать также и отсутствие Интернета в данный момент. [А может просто поленился..]
Добавил хардресет на шильд w5100.
Так как шильд старой ревизии, на нем кнопка ресета связана с пином ресет на боковой колодке и на SPI. Долго искал в инете схему на него и разводку, не нашел. Плюнул и взялся за кусачки. Откусил длинный пин на ресете боковой колодки под корешок и выкусил миллиметр разрыва на шестом пине разъема SPI. Вызвонил на кнопке ресет шильда ноги на gnd остальные две звонились на ресет. Накинул на них провод с пумпочкой и воткнул пумпочку в боковую колодку на пин 5, который и объявил W5100_RESET_PIN. Инициализацию провел аналогично сделанному у Araris.
Проверил работу клиентов tcp и udp. Все работает. К ремот-серверам стучится, с ntp получает время, работают все стандартные примеры нативной библиотеки.
Получается, что отказ DHCP был вызван особенностями работы роутера микротик.
Отказ работы шильда с gateway связан с ошибкой инициализации из-за кривого ресета шильда старой ревизии.
И конечно, пока не используется SD, cs-sdшный держим в единице, иначе получаем сбой SPI и работы езернета.
Вот и сказочке конец , кто читал, тот молодец.
Уважаемому Araris большое человеческое СПАСИБО.
Люблю хэппиэнды !
Чувствую мне надо менять ENC28 на W5100.... как я с ним напарился :) у меня хардресет не работает, вернее сам ресет работает, а вот переинициализации уже нет :(
Это крик души был. Я Вас понимаю, свой ENC28J60 после серии садо-мазо экзерсисов я уложил в коробочку с утраченными надеждами и разочарованиями.
добрый день.
попробовал сделать по аналогии с Вашим примером
проверку поставил в функции ожидания клиента, MAXW5100WATCHDOGDELAY = 10сек. в итоге 4 раза, нормально срабатывает resetLAN, а на 5 перезагружается ардуина. пробовал на Mege и на Uno. и там и там презагружается на 5 resetLAN. В чем может быть проблема?