|
LwIP TCP-сервер и UDP-клиент на одном MCU+LAN8720A? |
|
|
|
Oct 21 2016, 06:10
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Всем привет!
Проект без операционной системы с LwIP-стеком (low-level "core" / "callback" or "raw" API) на одном микроконтроллере (основная программа + TCP-сервер (Modbus TCP)), работает.
Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом? По отдельности TCP-сервер работает, UDP-клиент работает, а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)? Я еще с такой задачей не сталкивался, поэтому сильно не ругайте.
Если что, то в качестве PHY используется LAN8720A, разъем RJ45 один, проект на STM32, но микроконтроллер пока не важен, меня интересует сама возможность совмещения серера и клиента.
|
|
|
|
|
 |
Ответов
|
Oct 25 2016, 00:03
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Pridnya @ Oct 21 2016, 09:10)  ...можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом? ... а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)?...меня интересует сама возможность совмещения серера и клиента. 1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО. 2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным, можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка. 3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько угодно функций-адресов) Поверьте - у Вас много кода сократиться...  я всё правильно ответил на поставленные Вами вопросы? только боюсь Вам от этого вряд-ли полегчало... удачи Вам (круглый)
|
|
|
|
|
Nov 3 2016, 07:59
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(kolobok0 @ Oct 25 2016, 03:03)  1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО. 2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным, можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка. 3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько угодно функций-адресов) Поверьте - у Вас много кода сократиться...  я всё правильно ответил на поставленные Вами вопросы? только боюсь Вам от этого вряд-ли полегчало... удачи Вам (круглый) Можно было так с самого начала и написать. На счет 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 - Nov 3 2016, 08:02
|
|
|
|
|
Nov 3 2016, 12:10
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Оказалось все проще простого: достаточно добавить два файла: 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-клиент, но есть свои особенности).
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
Pridnya LwIP TCP-сервер и UDP-клиент на одном MCU+LAN8720A? Oct 21 2016, 06:10 scifi Цитата(Pridnya @ Oct 21 2016, 09:10) Меня... Oct 21 2016, 07:14 Pridnya Цитата(scifi @ Oct 21 2016, 10:14) Не пре... Oct 21 2016, 08:01 Pridnya Цитата(scifi @ Oct 21 2016, 10:14) Не пре... Oct 21 2016, 13:23 kolobok0 Цитата(Pridnya @ Oct 21 2016, 09:10) ...с... Oct 22 2016, 08:33 Pridnya Цитата(kolobok0 @ Oct 22 2016, 11:33) лог... Oct 24 2016, 05:25  HardEgor Цитата(Pridnya @ Oct 24 2016, 12:25) Вы п... Oct 24 2016, 06:31   Pridnya Цитата(HardEgor @ Oct 24 2016, 09:31) Да ... Oct 24 2016, 07:23    HardEgor Цитата(Pridnya @ Oct 24 2016, 14:23) Упом... Oct 24 2016, 07:56     Pridnya Цитата(HardEgor @ Oct 24 2016, 10:56) т.е... Oct 24 2016, 08:32      mantech Цитата(Pridnya @ Oct 24 2016, 11:32) Серг... Oct 25 2016, 12:16       Pridnya Цитата(mantech @ Oct 25 2016, 15:16) Сорр... Oct 31 2016, 11:01     Pridnya Цитата(HardEgor @ Oct 24 2016, 10:56) т.е... Oct 24 2016, 09:36 scifi Lwip - это такая штука, про которую нужно знать, к... Oct 24 2016, 07:34 Pridnya Цитата(scifi @ Oct 24 2016, 10:34) Lwip -... Oct 24 2016, 07:46  Сергей Борщ QUOTE (Pridnya @ Oct 24 2016, 11:32) Я за... Oct 24 2016, 10:00 krounis Цитата(Pridnya @ Oct 21 2016, 13:10) Всем... Jan 25 2018, 11:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|