Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F407+LwIP_v.1.3.2+sntp.c из LwIP_v1.4.1 (Raw API)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pridnya
Всем привет!

Есть рабочий проект на STM32F407 с использованием LwIP_v1.3.2 (без RTOS, Raw API).
На нем работают: ModbusTCP-сервер и UDP-клиент (1 раз в 4 секунды отправляет строку на IP, Port).
UDP-клиента нужно заменить на SNTP-клиента.
Есть готовый код - файлы sntp.h и sntp.c из LwIP_v1.3.0\apps\ но он испльзует сокеты, поэтому не подходит,
есть код LwIP_v1.4.1\apps\ этот код для Raw API, но он тестировался с новой версией стека LwIP_v1.4.1
и использует еще файлы timer.h и timers.c, которых нет в LwIP_v1.3.2.
Просто заменить стек один на другой не получается - проект не собирается, в новом стеке все файлы изменились.
Что проще сделать? Ручками переписать UDP-клиента под SNTP-клиента используя LwIP_v1.3.2
или заменить LwIP_v1.3.2 на более новый LwIP_v1.4.1 и использовать из него sntp.c и sntp.h,
которые вроде как должны с ним работать?
scifi
Если боитесь трогать lwip "потому что не собирается", то проще, конечно, заново изобрести клиента SNTP. Вообще, трудно себе представить что-либо проще, чем SNTP. Разве что простой пинг проще, наверное.
Pridnya
Цитата(scifi @ Nov 9 2016, 11:39) *
Если боитесь трогать lwip "потому что не собирается", то проще, конечно, заново изобрести клиента SNTP. Вообще, трудно себе представить что-либо проще, чем SNTP. Разве что простой пинг проще, наверное.

Я не боюсь, просто замучался с переходом от одной версии к другой. Даже не подозревал, что там все исходники заменили, а синтаксис такой ,что черт ногу сломет, куча переопределений, три вида API, а мне самый низкоуровневый нужен, самый простой.
Такое ощущение, что этот LwIP-стек генератором кода написали с какого-то другого языка, или как минимум
обработали исходники для ухудшения чтения и понимания.

SNTP-клиент, если он как клиент работает - запрашивает время у NTP-сервера, то вроде как все просто: запрос-ответ.
Но если в сети много клиентов, то такой режим не удобен.
А если он в режиме получения широковещательных запросов (с метками времени) работает, то ему еще и этот режим добавлять нужно.
Наверное, нужно оба режима реализовывать. Первый я могу чисто алгоритмически, а вот второй режим еще не пробовал,
это ж нужно, чтобы кто-то рассылал метки времени в сеть. Может, какой программный эмулятор есть?
scifi
Цитата(Pridnya @ Nov 9 2016, 11:52) *
Может, какой программный эмулятор есть?

Конечно есть. И не эмулятор, а нормальный NTP сервер. Берём линуксовый компьютер, устанавливаем ntpd, настраиваем - и вперёд.
Сергей Борщ
QUOTE (Pridnya @ Nov 9 2016, 11:52) *
Я не боюсь, просто замучался с переходом от одной версии к другой. Даже не подозревал, что там все исходники заменили,
Неправда, далеко не все. Часть файлов переместили, timers.c b timers.h переименовали в timeouts.c, timeouts.h. Мне исходники править не пришлось. Какая там версия последняя - я даже не знаю. В файлах из репозитория я не нашел упоминания номера версии.

Какой смысл держаться за старую версию?

Добавлено: нашел упоминание о номере версии в lwip/init.h. Она там 2.0.0.
scifi
Цитата(Сергей Борщ @ Nov 9 2016, 12:15) *
Какой смысл держаться за старую версию?

Тогда уж сразу прыгать на v2.0.0 (сейчас Release Candidate 2).
Там есть какие-то изменения семантики. Но это ж надо понимать, что там и как. А человек просто нажал кнопочку - и куб ему что-то выплюнул. Это совсем другая история.
Pridnya
Цитата(scifi @ Nov 9 2016, 12:13) *
Конечно есть. И не эмулятор, а нормальный NTP сервер. Берём линуксовый компьютер, устанавливаем ntpd, настраиваем - и вперёд.

Компьютера с Linux нет. А NTP Time Server Monitor (работает в Windows) от Meinberg это не то же самое?

Цитата(scifi @ Nov 9 2016, 12:19) *
Тогда уж сразу прыгать на v2.0.0 (сейчас Release Candidate 2).
Там есть какие-то изменения семантики. Но это ж надо понимать, что там и как. А человек просто нажал кнопочку - и куб ему что-то выплюнул. Это совсем другая история.

Я CubeMX не использую. У меня был проект, который что-то делал и имел два интерфейса (USB-UART-мост и RS485, протоколы ModbusRTU), я к этому проекту добавил интерфейс Ethernet, добавил tcp-сервер на основе lwip_v1.3.2, затем добавил ModbusTCP. Проект нормально работает.

Затем понадобилось кроме ModbusTCP добавить SNTP и здесь я узнал, что для моей версии стека есть файлы sntp.h и sntp.c (из contrib_v1.3.0), но они для сокетов. Есть файлы для Raw API, но они для другой версии стека - v1.4.1.
Цитата(Сергей Борщ @ Nov 9 2016, 12:15) *
Неправда, далеко не все. Часть файлов переместили, timers.c b timers.h переименовали в timeouts.c, timeouts.h. Мне исходники править не пришлось. Какая там версия последняя - я даже не знаю. В файлах из репозитория я нешел упоминания номера версии.

Какой смысл держаться за старую версию?

Смысл держаться - зачем менять весь стек, если нужно добавить только SNTP-клиента, тем более, что UDP-клиент уже работает.

Да, удобно смотреть разницу между версиями (теоретически) (было просто на бумаге да забыли про овраги), смотрю и вижу, что у всех файлов дата создания одинаковая, делаю вывод, что файлы обрабатывались текстовым процессором, только в этом случае может быть одинаковая дата. Ведь редактировались файлы в разное время. И от версии к версии все файлы разные (справа от имени размер и дата):
Код
// sntp.c из lwip_v1.4.1 (включаемые файлы)
#include "lwip/opt.h"
#include "sntp.h"
#include "lwip/timers.h"
#include "lwip/udp.h"
#include "lwip/dns.h"
#include "lwip/ip_addr.h"
#include "lwip/pbuf.h"
#include <string.h>
#include <time.h>

//lwip_v1.4.1                                                       lwip_v1.3.2
lwip_1.4.1\src\include\lwip\opt.h         58576, 09.02.15 11:31:54  lwip_1.3.2\src\include\opt.h              50583, 02.09.12 21:30:14
lwip_1.4.1\apps\sntp.h                      177, 09.02.15 11:31:54  ---                                       ---
lwip_1.4.1\src\include\lwip\timers.h       3290, 09.02.15 11:31:54  ---                                       ---
lwip_1.4.1\src\include\lwip\udp.h          6046, 09.02.15 11:31:54  lwip_1.3.2\src\include\udp.h               5426, 02.09.12 21:30:14
lwip_1.4.1\src\include\lwip\dns.h          5723, 09.02.15 11:31:54  lwip_1.3.2\src\include\lwip\dns.h          4762, 02.09.12 21:30:14
lwip-1.4.1\src\include\ipv4\lwip\ip_addr.h 9740, 09.02.15 11:31:54  lwip-1.3.2\src\include\ipv4\lwip\ip_addr.h 6884, 02.09.12 21:30:14
lwip-1.4.1\src\include\ipv4\lwip\pbuf.h    6526, 09.02.15 11:31:54  lwip-1.3.2\src\include\ipv4\lwip\pbuf.h    4022, 02.09.12 21:30:14


Цитата(Сергей Борщ @ Nov 9 2016, 12:15) *
Неправда, далеко не все. Часть файлов переместили, timers.c b timers.h переименовали в timeouts.c, timeouts.h. Мне исходники править не пришлось. Какая там версия последняя - я даже не знаю.

Вы про какую версию стека пишете?
Файлов timers.h и timers.c нет в lwip_v1.3.2
Они есть в lwip_v1.4.1.
Файлов timeouts.c, timeouts.h нет ни в lwip_v1.3.2, ни в lwip_v1.4.1.
Все понял с вами (судя по количеству созданных вами тем и тематике на этом форуме).Я такк бы мог спросить и у замначальника по разным вопросам, от клининга до адаптивных цифровых фильтров (должность одного лица).biggrin.gif
Сергей Борщ
QUOTE (Pridnya @ Nov 9 2016, 12:31) *
Смысл держаться - зачем менять весь стек, если нужно добавить только SNTP-клиента, тем более, что UDP-клиент уже работает.
Может стоит заглянуть в баг-трекер, чтобы увидить, сколько и каких ошибок там за это время исправлено? Может вам просто повезло, что вы на них еще не наткнулись в своем устройстве. Я не настолько удачливый, на пару-тройку натыкался.
QUOTE (Pridnya @ Nov 9 2016, 12:31) *
Вы про какую версию стека пишете?
Видимо я сравниваю 1.5.0 и 2.0.0
Pridnya
Цитата(Сергей Борщ @ Nov 9 2016, 12:48) *
Может стоит заглянуть в баг-трекер, чтобы увидить, сколько и каких ошибок там за это время исправлено? Может вам просто повезло, что вы на них еще не наткнулись в своем устройстве. Я не настолько удачливый, на пару-тройку натыкался.
Видимо я сравниваю 1.5.0 и 2.0.0

TCP-сервер у меня работает стабильно, к нему вопросов не было. А те исправления ,которые были добавлены многочисленными соавторами стека возможно, не коснулись используемой мной части. Я спрашиваю про 1.3.2, а вы отвечаете про 1.5.0 и 2.0.0. Это хорошо. Хорошая динамика.
движение к высоким европейским стандартамbiggrin.gif С Русланом Кулабуховым - автором БТГ Кулабухова не знакомы? Он ваш земляк. Там тоже не принято читать, учиться физике, только писать, писать, писать.
Вы вначале тему читайте, пожалуйста и вообще сообщения читайте перед тем, как писать ответ. rolleyes.gif
Pridnya
Цитата(Pridnya @ Nov 9 2016, 11:27) *
Всем привет!
...
Что проще сделать? Ручками переписать UDP-клиента под SNTP-клиента используя LwIP_v1.3.2
или заменить LwIP_v1.3.2 на более новый LwIP_v1.4.1 и использовать из него sntp.c и sntp.h,
которые вроде как должны с ним работать?

Проще ручками переписать. Отправляем пустой NTP-запрос на порт 123 компьютера (Windows),
а NTP-сервер Windows отвечает пакетом с метками времени. Кому интересно, на скришоте обмен из Wireshark, только
Wireshark ошибается в комментариям к меткам времени, NTP TimeStamp отсчитывается не с 1970, а с 1900 года. И запрос к NTP-серверу должен быть не совсем пустой.

Но это первый вариант, когда клиент запрашивает время. Если клиентов в сети много, то нужно добавить прием широковещательных пакетов с метками времени.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.