Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LwIP TCP-сервер и UDP-клиент на одном MCU+LAN8720A?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pridnya
Всем привет!

Проект без операционной системы с LwIP-стеком (low-level "core" / "callback" or "raw" API) на одном микроконтроллере (основная программа + TCP-сервер (Modbus TCP)), работает.

Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?
По отдельности TCP-сервер работает, UDP-клиент работает, а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)? Я еще с такой задачей не сталкивался, поэтому сильно не ругайте.

Если что, то в качестве PHY используется LAN8720A, разъем RJ45 один, проект на STM32, но микроконтроллер пока не важен, меня интересует сама возможность совмещения серера и клиента.
scifi
Цитата(Pridnya @ Oct 21 2016, 09:10) *
Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?

Не представляю, почему вы решили, что нельзя. У меня как раз lwip, no OS, raw API. Имеется веб сервер, агент SNMP, клиент SNTP.
Pridnya
Цитата(scifi @ Oct 21 2016, 10:14) *
Не представляю, почему вы решили, что нельзя. У меня как раз lwip, no OS, raw API. Имеется веб сервер, агент SNMP, клиент SNTP.

Я еще не сталкивался с подобной задачей (совместить сервер и клиент). Все примеры, которые я видел содержат либо сервер, либо клиент. Вот поэтому я и задал вопрос "а будут ли они оба работать и не мешать одно другому". К тому же у некоторых видел в приборах два разъема RJ45, а в описании, что один для синхронизации времени, а второй еще для чего-нибудь. Запутался.
Pridnya
Цитата(scifi @ Oct 21 2016, 10:14) *
Не представляю, почему вы решили, что нельзя. У меня как раз lwip, no OS, raw API. Имеется веб сервер, агент SNMP, клиент SNTP.

scifi, посмотрите личную почту!
kolobok0
Цитата(Pridnya @ Oct 21 2016, 09:10) *
...совмещения серера и клиента.


логическое дробление в данном случае не накладывает никаких ограничений на реализацию.
в Ваших вопросах сквозит просьба увидеть готовый пример.
хочется процитировать один мультик:

- "Вы и есть за меня будете?!"
- "Ага!"

удачи Вам
(круглый)
Pridnya
Цитата(kolobok0 @ Oct 22 2016, 11:33) *
логическое дробление в данном случае не накладывает никаких ограничений на реализацию.
в Ваших вопросах сквозит просьба увидеть готовый пример.

Вы похоже не представляете как выглядит готовый пример в моем случае. У меня основная программа и ModbusTCP сервер уже занимают около 130 килобайт. Мне нужно добавить в программу UDP-клиента (SNTP-клиента). Я ожидал увидеть что-то типа такого. И пояснение "расположите код там-то, не забудьте настроить это".
Цитата
// UDP Server Initialisierung:
upcb = udp_new();
if (upcb)
{
udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
udp_recv(upcb, udp_server_receive_callback, NULL);
}

// TCP Server Initialisierung:
tpcb = tcp_new();
if (tpcb != NULL)
{
tcp_bind(tpcb, IP_ADDR_ANY, TCP_SERVER_PORT);
tpcb = tcp_listen(tpcb);
tcp_accept(tpcb, tcp_callback_accept);
}

Цитата(kolobok0 @ Oct 22 2016, 11:33) *
хочется процитировать один мультик:

- "Вы и есть за меня будете?!"
- "Ага!"

[CENSORED]
HardEgor
Цитата(Pridnya @ Oct 24 2016, 12:25) *
Вы похоже не представляете как выглядит готовый пример в моем случае. У меня основная программа и ModbusTCP сервер уже занимают около 130 килобайт. Мне нужно добавить в программу UDP-клиента (SNTP-клиента). Я ожидал увидеть что-то типа такого. И пояснение "расположите код там-то, не забудьте настроить это".
.... детский сад skip'нут ....

Да хоть 500 кБ. Колобок в чем-то прав - вы просто не понимаете как работает TCP/UDP/IP и хотите готовый рецепт. Да там под сотню настроек и все надо не забыть. Возьмите готовые примеры и посмотрите как сделано в нём, совместить дело пяти минут. Или вот на другом процессоре совмещенный.
Pridnya
Цитата(HardEgor @ Oct 24 2016, 09:31) *
Да хоть 500 кБ. Колобок в чем-то прав - вы просто не понимаете как работает TCP/UDP/IP и хотите готовый рецепт. Да там под сотню настроек и все надо не забыть. Возьмите готовые примеры и посмотрите как сделано в нём, совместить дело пяти минут. Или вот на другом процессоре совмещенный.

Упоминание об объеме проекта с TCP-стеком (основная программа + ModbusTCP), который у меня работает, означало, что мне не нужен чей-то пример, как студенту для кусовика. Я тоже могу написать, что вы не понимаете, как работает TCP/UDP/IP, LwIP-стек на STM32F407 без операционной системы т.к. советуте мне почитать AN3966 Application note LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers, которую я уже много раз перечитал и из которой мне уже взять нечего. В этом документе описаны общие сведения о вариантах использования стека (три вида API) и о примерах (9 отдельных примеров). Все примеры по даны для конкретного использования, т.е. там не как в стеке Microchip, когда стек конфигурируется утилитой и мы получае сразу несколько вариантов использования. По отдельности я пробовал запускать все эти примеры, но мне нужно то, что указано в теме (совместить или добавить к TCP-серверу UDP-клиент). В примерах от ST для каждого варианта использования стека (9 примеров) есть свой проект (отдельный) , т.е. там не все варианты сразу, которые можно директивами условной компиляции включить/выключить из кода ( или той сотней настроек, про которую вы упоминаете).
Цитата
This demonstration package contains nine applications running on top of the LwIP stack:

Applications running in standalone mode (without an RTOS):
–A Web server
–A TFTP server
–A TCP echo client application
–A TCP echo server application
–A UDP echo client application
–A UDP echo server application

Applications running with the FreeRTOS operating system:
–A Web server based on netconn API
–A Web server based on socket API
–A TCP/UDP echo server application based on netconn API

Кроме того вы упоминаете о сотне настроек, а из этой сотни менять мало что нужно. Это еще один аргумент в мою пользу.
scifi
Lwip - это такая штука, про которую нужно знать, как она работает. Видимо, говнокодеры из STM сами не очень-то хорошо разбираются в ней, судя по регулярным жалобам горе-юзверей на поведение их кода.
Кстати, вот вам родной клиент SNTP. Читайте, вникайте.
Pridnya
Цитата(scifi @ Oct 24 2016, 10:34) *
Lwip - это такая штука, про которую нужно знать, как она работает. Видимо, говнокодеры из STM сами не очень-то хорошо разбираются в ней, судя по регулярным жалобам горе-юзверей на поведение их кода.
Кстати, вот вам родной клиент SNTP. Читайте, вникайте.

Спасибо! У меня жалоб на LwIP-стек нет. Я перед использованием LwIP разобрал до мелочей как работает TCP-сервер, UDP-клиент, все запросы и ответы (до битов в байтах). Разобрался с протоколами ARP, ICMP, DNS, TCP, UDP, SNTP (основан на UDP). Написал свой клиент на C# для Windows, считал время с публичного NTP-сервера в Интернете (российские и европейские сервера), затем попробовал использовать в качестве NTP-сервера службу времени Windows, все работает. И захотел к своему проекту (STM32F407 плюс LwIP ModbusTCP-сервер )добавить SNTP-клиент. Код клиента, который вы предложили посмотреть я видел, он появился в LwIP v.1.4.1, а у меня LwIP v.1.3.2. Похоже, что придется версию стека менять.
HardEgor
Цитата(Pridnya @ Oct 24 2016, 14:23) *
Упоминание об объеме проекта с TCP-стеком (основная программа + ModbusTCP), который у меня работает, означало, что мне не нужен чей-то пример, как студенту для кусовика.

Мда...., если бы вы знали какие объемы пишут студенты, вы бы не приводили такие аргументы. Объем о качестве специалиста ничего не говорит.
У меня программа в 160 кБ, хотя я написал всего 2кБ и что?

Цитата
По отдельности я пробовал запускать все эти примеры, но мне нужно то, что указано в теме (совместить или добавить к TCP-серверу UDP-клиент).

т.е. второй пример, где всё совмещено, вы даже не открывали? Ну тогда ничем не могу вам помочь.

Цитата
Кроме того вы упоминаете о сотне настроек, а из этой сотни менять мало что нужно. Это еще один аргумент в мою пользу.

В какую пользу? Это вам надо разобраться, а не мне....
Pridnya
Цитата(HardEgor @ Oct 24 2016, 10:56) *
т.е. второй пример, где всё совмещено, вы даже не открывали? Ну тогда ничем не могу вам помочь.


Если вы про TFTP-сервер, то я этот пример не открывал и вообще с FTP протоколом еще не работал. Я запускал по отдельности UDP-клиент, UDP-сервер, TCP-клиент, TCP-сервер. Мне нужно то, что указано в теме. А так вообще интересный путь: есть 6 примеров
1) –A Web server
2) –A TFTP server
3) –A TCP echo client application
4) –A TCP echo server application
5) –A UDP echo client application
6) –A UDP echo server application
чтобы совместить 4-й и 5-й, нужно разобраться как работает 2-й. Хоть бы кто ссылку дал на TCP-сервер плюс UDP-клиент.

PS: Так на ум приходит тоже пример STM32F4 USB RNDIS драйвер (управление устройством через Web-интерфейс), там Сергей Фетисов через USB работает по WEB-интерфейсу. Его пример рабочий, использует LwIP, Я его код проверял в работе на STM32F4DISCOVERY. Или его же Ethernet поверх USB на STM32F4.

PPS: А я хотел бы видеть
7) –A TCP echo server application + A UDP echo client application
Pridnya
Цитата(HardEgor @ Oct 24 2016, 10:56) *
т.е. второй пример, где всё совмещено, вы даже не открывали? Ну тогда ничем не могу вам помочь.

Вот спасибо! Этого примера (IAP over Ethernet) не было на CD-диске к моей отладочной плате (DevKit407). Пример с сайта ST вообще для другой отладочной платы, на которой установлен PHY DP83848, она подключена по MII-интерфейсу, а у меня только RMII (LAN8720A). Но все равно спасибо! laughing.gif В примере TFTP работает поверх UDP, а HTTP поверх TCP. Есть что посмотреть. rolleyes.gif
Сергей Борщ
QUOTE (Pridnya @ Oct 24 2016, 11:32) *
Я запускал по отдельности UDP-клиент, UDP-сервер, TCP-клиент, TCP-сервер.
Если у вас в программе была поддержка DHCP, то UDP-сервер и UDP-клиент, работающие одновременно с вашим TCP-сервером, у вас были. Странно, что вы этого не заметили. После этого слабо верится в:
QUOTE (Pridnya @ Oct 24 2016, 10:46) *
Я перед использованием LwIP разобрал до мелочей как работает TCP-сервер, UDP-клиент, все запросы и ответы (до битов в байтах). Разобрался с протоколами ARP, ICMP, DNS, TCP, UDP, SNTP (основан на UDP).

kolobok0
Цитата(Pridnya @ Oct 21 2016, 09:10) *
...можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?
... а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)?...меня интересует сама возможность совмещения серера и клиента.


1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО.
2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным,
можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка.
3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько
угодно функций-адресов) Поверьте - у Вас много кода сократиться... wink.gif

я всё правильно ответил на поставленные Вами вопросы?
только боюсь Вам от этого вряд-ли полегчало...

удачи Вам
(круглый)
mantech
Цитата(Pridnya @ Oct 24 2016, 11:32) *
Сергей Фетисов через USB работает по WEB-интерфейсу. Его пример рабочий, использует LwIP, Я его код проверял в работе на STM32F4DISCOVERY. Или его же Ethernet поверх USB на STM32F4.


Сорри за оффтоп, не понял, зачем это нужно вообще, вот интересно было б посмотреть на обратный пример (USB over Ethernet) rolleyes.gif
Pridnya
Цитата(mantech @ Oct 25 2016, 15:16) *
Сорри за оффтоп, не понял, зачем это нужно вообще, вот интересно было б посмотреть на обратный пример (USB over Ethernet) rolleyes.gif

Чтобы управлять через WEB-интерфейс устройствами с интерфейсом USB. Один человек хорошо знает WEB, второй написал прокладку для управления через WEB-интерфейс какой-либо платформой без Ethernet MAC и PHY, только через USB.

Цитата(Сергей Борщ @ Oct 24 2016, 13:00) *
Если у вас в программе была поддержка DHCP, то UDP-сервер и UDP-клиент, работающие одновременно с вашим TCP-сервером, у вас были. Странно, что вы этого не заметили. После этого слабо верится в:

Я нигде не упоминал, что у меня была поддержка DHCP.
Pridnya
Цитата(kolobok0 @ Oct 25 2016, 03:03) *
1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО.
2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным,
можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка.
3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько
угодно функций-адресов) Поверьте - у Вас много кода сократиться... wink.gif

я всё правильно ответил на поставленные Вами вопросы?
только боюсь Вам от этого вряд-ли полегчало...

удачи Вам
(круглый)

Можно было так с самого начала и написать.
На счет Modbus: я примерно к этому и пришел, вот кусочек для ModbusRTU, он упрощает процесс: достаточно добавить в файл новую функцию и зарегистрировать её в таблице:
Код
// *************************************************************************** //
typedef  uint16_t  (* FUNC)(int8_t *Buf);

typedef struct {
    int8_t const idx; // Индекс функции таблице.
    int8_t const cmd; // Код функции.
    FUNC    func;     // Функция.
}COMMAND;
// *************************************************************************** //
uint16_t Exception(int8_t *Buf);
uint16_t WriteMultipleRegisters(int8_t *Buf);
uint16_t ReadHoldingRegisters(int8_t *Buf);

// Индекс, код функции, функция.
const COMMAND    cmds[] =
    {
    { 0, 0x00, Exception},   // Функция не поддерживается.
    { 1, 0x03, ReadHoldingRegisters},  // Чтение регистров.
    { 2, 0x10, WriteMultipleRegisters},  // Запись регистров.
};
// *************************************************************************** //
void Process(int8_t *Buf)
{  
    int8_t code = Buf[1];       // Код функции.
    int8_t i = FindIdx(code);   // Индекс.
    ...
    Size = cmds[i].func(Buf);
    ...
}
// *************************************************************************** //


Всем спасибо! Т.е. запустить на одном микроконтроллере TCP-сервер и UDP-клиент можно и примеры есть.
Pridnya
Оказалось все проще простого: достаточно добавить два файла:
udp_client.h
void udp_echoclient_connect(void); // с прототипом функции

udp_client.c
с двумя функциями (функции из примера udp_echo_client):
void udp_echoclient_connect(void){...}
void udp_receive_callback(...){...}

В настройках проекта указать IP-адрес и порт UDP-сервера на стороне компьютера (IP=192.168.1.10, #define UDP_SERVER_PORT 7).

В файле main.c (или в любом другом) периодически, например через 4 секунды, вызываем функцию void udp_echoclient_connect(void);

Собираем проект, прошиваем микроконтроллер.
На стороне компьютера запускаем:
1) для проверки работы UDP-клиента в командной строке программу echotool с параметрами: echotool.exe /p udp /s 7
2) для проверки работы ModbusTCP-сервера - любой ModbusTCP-клиент (соединяемся с IP 192.168.1.101, TCP-порт 502).
Оба работают и не мешают друг другу.

Остался вопрос: как теперь заменить UDP-клиент на SNTP-клиент (SNTP-клиент работает как UDP-клиент, но есть свои особенности).
krounis
Цитата(Pridnya @ Oct 21 2016, 13:10) *
Всем привет!

Проект без операционной системы с LwIP-стеком (low-level "core" / "callback" or "raw" API) на одном микроконтроллере (основная программа + TCP-сервер (Modbus TCP)), работает.

Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?
По отдельности TCP-сервер работает, UDP-клиент работает, а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)? Я еще с такой задачей не сталкивался, поэтому сильно не ругайте.

Если что, то в качестве PHY используется LAN8720A, разъем RJ45 один, проект на STM32, но микроконтроллер пока не важен, меня интересует сама возможность совмещения серера и клиента.

Извините за некропостинг, но не могли бы вы скинуть мне проект без операционной системы с LwIP-стеком Raw API на МК. У меня stm32 nucleo-f767zi и как раз стоит подобная задача, никак не могу разобраться. Заранее спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.