реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F407+LwIP_v.1.3.2+sntp.c из LwIP_v1.4.1 (Raw API)
Pridnya
сообщение Nov 9 2016, 08:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Всем привет!

Есть рабочий проект на 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,
которые вроде как должны с ним работать?

Сообщение отредактировал Pridnya - Nov 9 2016, 08:30
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 9 2016, 08:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Если боитесь трогать lwip "потому что не собирается", то проще, конечно, заново изобрести клиента SNTP. Вообще, трудно себе представить что-либо проще, чем SNTP. Разве что простой пинг проще, наверное.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 9 2016, 08:52
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(scifi @ Nov 9 2016, 11:39) *
Если боитесь трогать lwip "потому что не собирается", то проще, конечно, заново изобрести клиента SNTP. Вообще, трудно себе представить что-либо проще, чем SNTP. Разве что простой пинг проще, наверное.

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

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

Сообщение отредактировал Pridnya - Nov 9 2016, 08:57
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 9 2016, 09:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Pridnya @ Nov 9 2016, 11:52) *
Может, какой программный эмулятор есть?

Конечно есть. И не эмулятор, а нормальный NTP сервер. Берём линуксовый компьютер, устанавливаем ntpd, настраиваем - и вперёд.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 9 2016, 09:15
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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

Добавлено: нашел упоминание о номере версии в lwip/init.h. Она там 2.0.0.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 9 2016, 09:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Nov 9 2016, 12:15) *
Какой смысл держаться за старую версию?

Тогда уж сразу прыгать на v2.0.0 (сейчас Release Candidate 2).
Там есть какие-то изменения семантики. Но это ж надо понимать, что там и как. А человек просто нажал кнопочку - и куб ему что-то выплюнул. Это совсем другая история.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 9 2016, 09:31
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(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

Сообщение отредактировал Pridnya - Nov 9 2016, 09:56
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 9 2016, 09:48
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Pridnya @ Nov 9 2016, 12:31) *
Смысл держаться - зачем менять весь стек, если нужно добавить только SNTP-клиента, тем более, что UDP-клиент уже работает.
Может стоит заглянуть в баг-трекер, чтобы увидить, сколько и каких ошибок там за это время исправлено? Может вам просто повезло, что вы на них еще не наткнулись в своем устройстве. Я не настолько удачливый, на пару-тройку натыкался.
QUOTE (Pridnya @ Nov 9 2016, 12:31) *
Вы про какую версию стека пишете?
Видимо я сравниваю 1.5.0 и 2.0.0


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 9 2016, 09:52
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(Сергей Борщ @ 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 - Nov 9 2016, 09:55
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 9 2016, 11:59
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(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-серверу должен быть не совсем пустой.

Но это первый вариант, когда клиент запрашивает время. Если клиентов в сети много, то нужно добавить прием широковещательных пакетов с метками времени.

Сообщение отредактировал Pridnya - Nov 9 2016, 12:01
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016