Синхронизация. Получить время от NTP сервера (GPRS, SIM900, UDP?)
- Войдите на сайт для отправки комментариев
Добрый день,
прошу помочь с кодом для первоначальной установки часов и дальнейшей синхронизации Arduino Mega 2560 по GPRS.
SIM900 подключен через HWSerial к Mega. На шилде есть часы. Прошивка на SIM900 обновлена до последней (1137B06SIM900M64_ST_ENHANCE).
Пробовал два варианта:
1) расширенные команды от SIMCOM - "AT+CNTP" и "AT+CIPGSMLOC". первая с большой задежкой возвращает ошибку сети +CNTP:61 (хотя сначала отвечает OK), вторая ничего не возвращает кроме OK.
2) Подключиться к NTP серверу по UDP, отправить пакет и распарсить ответ. Также ничего не получилось, так как во всех примерах синхронизации по GPRS в и-нете все заканчивается отправкой пакета. А как его получить и распарсить нигде не нашел. То есть, в данном варианте у меня все заканчивается успешной отправкой пакета.
коды первого варианта:
это второй вариант:
библиотеку для модема какую используете?
Без библиотек. Управляю только AT-командами. Шилд пристегнут по HWserial на Serial2.
Без библиотек. Управляю только AT-командами. Шилд пристегнут по HWserial на Serial2.
функция sendATcommand() - ваша самописная?
Я не вижу в вашем коде - вы ответы на команды хоть где-то анализируете?
функцию позаимствовал. Оказалась очень удобной.
функцию позаимствовал. Оказалась очень удобной.
Ага, удобная. Только вы, похоже, даже не пытались разобраться, как с ней работать.
Эта функция имеет возвращаемое значение - при успехе возвращает ноль, а при ошибке или таймауте - ненулевой код ошибки. Вы его где-то проверяете? - имхо нет.
Во-вторых, в функцию уже встроен таймаут (последний параметр в скобках). Нафига ж вы еще delay() после каждого вызова этой функции навтыкали?
Для дальнейшего обсуждения ответьте на вопрос - каков ваш опыт программирования на Си? Например, исходный код функции sendATCommand() - это китайская грамота или вы в нем что-то понимаете?
уровень = "продвинутый новичок"
Респонс на AT команды я проверял на отладку. По всем командам прилетали "0".
Переписал первую конструкцию с командами AT+CNTP. Ответы с нулями, но синхронизации по прежнему нет.
Переписал первую конструкцию с командами AT+CNTP. Ответы с нулями, но синхронизации по прежнему нет.
По первому варианту ничего не подскажу - не знаю. А во втором вам нужно не только передать запрос, но и принять ответ. В вашем скетче нет даже намека на это. Модем сам не умеет принимать ответ от NTP сервера. Вам нужно сделать жто вручную и распарсить принятый пакет. Как распарсить NTP-пакет - я не разбирался. а пример приема данных от GPRS вы можете найти в любом скетче, получающем данные с HTTP-сервера.
В примерах (в основном это Ethernet-шилды) используют библиотеки и механизм парсинга не виден. я пробовал разобраться, но моих мозгов не хватает.
когда поймаете нужный ответ/пакет - тогда уже думайте как парсить / разбирать данные.
А так конечно delay и вообще логика никуда не годиться, впрочем мой первый проект с gsm был чем то подобным.
Для того, чтобы что-то поймать в ответ, нужно что-то послать... а я не понимаю что нужно посылать на NTP. Многие пишут, что достаточно послать пустой пакет и сервер ответит. Пакет, судя по ответам модема, я посылаю удачно. Но что делать дальше не знаю.
Поэтому и прошу помочь.
Для того, чтобы что-то поймать в ответ, нужно что-то послать... а я не понимаю что нужно посылать на NTP. Многие пишут, что достаточно послать пустой пакет и сервер ответит. Пакет, судя по ответам модема, я посылаю удачно.
По-моему, вы ничего не посылаете вообще.
Послать NTP серверу "пустой пакет" - это не значит послать в сеть пакет нулевых байт или вообще ничего. Это должен быть UDP пакет, длиной, если не изменяет память - 48 байт, сформированный по формату NNTP. с правильным заголовком, но не содержащий текущего времени.
В вашем коде вы явно никакого "пустого пакета" не формируете и я даже не вижу, где бы вы его передавали.
Вообще, формат общения по NTP подробно описан в соответсвующий документах (RFC), в библиотеке Time.h и во многих местах в инете. Вопрос это довольно специфический и я не думаю. что у нас на форуме тут куча народу может вот так прямо выдать вам подробную инстукцию. Я с год назад разбирался с этим - но столкнулся с тем, что на используемом мной модеме (А6) оказалось. нет поддержки UDP. - поэтому готовых кодов у меня нет. ИМХО, вы значительно быстрее добьетесь успеха, если начнете копать инет сами.
решил вопрос парсингом любой входящей смс.
решил вопрос парсингом любой входящей смс.
Не слишком надежно. Входящую СМС можно несколько дней ждать.
Как я уже писал - когда я делал похожий проект, столкнулся с тем, что на модеме А6 отсутсвует поддержка UDP. Поэтому я не смог сделать запрос времени по NTP. Зато практически на любом веб-сервере в заголовке ответа есть локальное время. Для синхронизации достаточно послать серверу запрос HTTP HEAD и распарсить его.
но на вашем месте я б NTP домучил....
Вернусь к этой теме позже. С сервером, на сколько я понимаю, тоже не так просто. У меня в проекте устройства на базе Arduino должны будут сами время для себя определять, находясь по всей территории страны. На какой мне HTTP-сервер в этом случае идти? Какое поясное время он мне вернет? а в СМС вроде как должно приходить местное время автоматом.
С другой стороны, освоив пасинг СМС, ответ от сервера, надеюсь, обработаю. Спасибо вам за отзыв и советы.