обслуживание нескольких TCP соединений на W5500 или подобном

g8890c
Offline
Зарегистрирован: 18.03.2021

Есть задача сделать с помощью модуля ethernet w5500  TCP сервер к которому можно было бы обращаться по 3-4 портам. Знает кто нить как это сделать с помощью доступных библиотек в ардуино IDE ?

Хорошо бы еще и клиента ТСР поднимать иногда. 

Технически то модуль может поддерживать несколько одновременных коннектов , но не уверен что Ethernet библиотека умеет так работать.  Посоветуйте .

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Это примерно как подвал под домом копать детским совочком. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Это примерно как подвал под домом копать детским совочком. 

Ну, граф Монте-Кристо что-то подобное проделывал :-)

sadman41
Offline
Зарегистрирован: 19.10.2016

Мне кажется, что со штатной библиотекой шанс есть, но небольшой. В ней сервер не умеет подниматься на конкретном сокете, а "путешествует" по всем подряд. Насколько я вижу - в библиотеке от IDE 1.8.9 в LISTEN переводится первый попавшийся в цикле CLOSED-сокет. Т.е. вполне может случиться так, что при большом кол-ве коннектов экземпляры EthernetServer будут обламываться с переводом сокета в LISTEN на своём порту, что наврядли можно считать признаком нормальной работы.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

g8890c пишет:

Посоветуйте .

пишите самостоятельно работу с модулем через регистры, там нет ничего сложного
вот пример простенький
http://arduino.ru/forum/otvlechennye-temy/programmirovanie-32-kh-razryadnykh-mk?page=21#comment-575919

Update: в стандартной библиотеке WizNET для работы с модулем W5500 есть уже готовые функции работы с регистрами, т е чтоб не писать свой велосипед работы через SPI, просто используйте их, но конечно всю логику придется рисовать заново.

g8890c
Offline
Зарегистрирован: 18.03.2021

Да,  я это и имел в виду - ( у модуля есть возможность  поддерживать до 8 по-моему сокетов) Вопрос сводится только к разделению общего буфера на сколько нужно частей (По умолчанию весь буфер принадлежит одному сокету.) на этапе конфигурации модуля и работы с ними потом вручную).  Вот этого то я и надеялся избежать, думал мож есть уже чего готовое, чтоб побыстрому сделать.   А почему ключиком подвал копать? У меня обмен то. не интенсивный ( по 100 байт  раз в две секунды), просто несколько сервисов разных вот и нужно было по разным сокетам их распределить.

Да и главная проблема что я чел в общем далекий от программирования контроллеров. В теории понимаю что нужна делать , но опыта  практического 0 ( потому и искал что нить ардуинообразное ).  Сейчас я пользую чужой контроллер который обеспечивает работу с несколькими портами и перегон TCP  в usart - я на него  подвесился  ардуинкой и  логику делаю на ней. Но. контроллер большой и сильно избыточный под мою задачу , хочу покомпактнее и попроще.

Вот кстати нашел интересную ссылку - https://eax.me/stm32-w5500/

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ссылка, что вы нашли - та же самая стандартная библиотека что и под arduino, а вам надо самостоятельно все программировать. Т е пути два: или изучать или заказывать.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

andycat пишет:
Т е пути два: или изучать или заказывать.

Два пути есть только из безвыходной ситуации)) А ТС может пересмотреть вопрос железа и решить свою задачу малой кровью

sadman41
Offline
Зарегистрирован: 19.10.2016

g8890c пишет:

Вопрос сводится только к разделению общего буфера на сколько нужно частей (По умолчанию весь буфер принадлежит одному сокету.) на этапе конфигурации модуля и работы с ними потом вручную).

Это поверхностное представление. Разделить буфер на 8 частей - это самое начало.

Далее будет необходимо выстраивать обслуживание сокетов, самое важно здесь - это закрепить за группой сокетов один порт. Т.е. конфигурировать сокеты 1 и 5, например, на порт 10500. Либо не открывать на LISTEN порта 10500 более двух закрытых сокетов. Либо как-то иначе.

Штатная библиотека делит буфер, но дальше все сокеты конфигурируются на вход под один порт. Всегда. 

g8890c пишет:

Сейчас я пользую чужой контроллер который обеспечивает работу с несколькими портами и перегон TCP  в usart - я на него  подвесился  ардуинкой и  логику делаю на ней. Но. контроллер большой и сильно избыточный под мою задачу , хочу покомпактнее и попроще.

"Попроще" тут не получится. Лично я таких библиотек, что вам нужно, для Arduino я не встречал. Только самописание.