Как держать сокет открытым при использовании библиотеки Ethernet

maks.dav
Offline
Зарегистрирован: 13.12.2015

Добрый день. Столкнулся с такой проблемой:
Сделал конвертер ethernet в serial. На конвертер через агрегатор "умного дома" отсылаются команды и принимаются состояния с устройств, подключенных к конвертеру.
Но столкнулся с такой проблемой: если интервал опроса устройств более 500 мс, то конвертер сбрасывает подключение (закрывается сокет). Если меньше 500мс - все отлично работает без сбоев.
Теперь вопрос, каким образом можно держать подключение на конвертере максимально открытым для подключенного клиента в виде агрегатора?

b707
Offline
Зарегистрирован: 26.05.2017

А нельзя открывать сокет, когда нужен?

maks.dav
Offline
Зарегистрирован: 13.12.2015

maks.dav пишет:
Добрый день. Столкнулся с такой проблемой:
Сделал конвертер ethernet в serial. На конвертер через агрегатор "умного дома" отсылаются команды и принимаются состояния с устройств, подключенных к конвертеру.
Но столкнулся с такой проблемой: если интервал опроса устройств более 500 мс, то конвертер сбрасывает подключение (закрывается сокет). Если меньше 500мс - все отлично работает без сбоев.
Теперь вопрос, каким образом можно держать подключение на конвертере максимально открытым для подключенного клиента в виде агрегатора?

P.s. По большому счёту мне нужен только принцип "на пальцах", код я сам напишу.

maks.dav
Offline
Зарегистрирован: 13.12.2015

Re: А нельзя открывать сокет, когда нужен?

В агрегаторе?

b707
Offline
Зарегистрирован: 26.05.2017

сорри, невнимательно прочитал вопрос, не открывать сокет заново, а заново устанавливать подключение.

Вы же когда подключаетесь в первый раз - вас отсутвие открытого коннекта не смущает? - ну так просто подключайтесь каждый раз, как первый

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

Если посылать данные чаще, чем производится отключение по тайм-ауту, то коннект не будет сброшен. Keep-Alive пакеты используются не первый десяток лет.

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

b707 пишет:

открывать сокет заново ... устанавливать подключение

Чаще всего - это крепко связанные операции.

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

maks.dav пишет:
P.s. По большому счёту мне нужен только принцип "на пальцах", код я сам напишу.
Пингом каждые 450мс

maks.dav
Offline
Зарегистрирован: 13.12.2015

b707 пишет:

сорри, невнимательно прочитал вопрос, не открывать сокет заново, а заново устанавливать подключение.

Вы же когда подключаетесь в первый раз - вас отсутвие открытого коннекта не смущает? - ну так просто подключайтесь каждый раз, как первый

с агрегатора не могу каждый раз подключаться как первый раз - т.к. плагин который весь этот процесс реализует, я изменить или переписать не могу, а логика в нем такая, что, если закрывается сокет, то он переподключается. минимальное время переподключения - 1 секунда, и получается так, что задержка с учетом переподключения нарастает, и агрегатор во время переподключения может не среагировать на команду.

maks.dav
Offline
Зарегистрирован: 13.12.2015

sadman41 пишет:
Если посылать данные чаще, чем производится отключение по тайм-ауту, то коннект не будет сброшен

Да, это я понял, этим пока и пользуюсь, но если у меня несколько таких конвертеров, и происходит опрос немалого количества датчиков, например, остальные конвертеры успевают сбрасывать подключение

maks.dav
Offline
Зарегистрирован: 13.12.2015

sadman41 пишет:
Keep-Alive пакеты используются не первый десяток лет.

а Keep-Alive функционал есть в библиотеке Ethernet?

maks.dav
Offline
Зарегистрирован: 13.12.2015

ЕвгенийП пишет:

Пингом каждые 450мс

каким образом?

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

Не особо пока понимаю схему взаимодействия - какая из двух сторон закрывает по тайм-ауту коннект, но стоковые ардуино-библиотеки держат их открытыми до посинения.

maks.dav
Offline
Зарегистрирован: 13.12.2015

sadman41 пишет:
Не особо пока понимаю схему взаимодействия - какая из двух сторон закрывает по тайм-ауту коннект, но стоковые ардуино-библиотеки держат их открытыми до посинения.

Закрывается сторона с ардуино. Библиотека стандартная Ethernet.h, контроллер W5500. Таймаут выходит 500 мс.

 

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

maks.dav пишет:

ЕвгенийП пишет:

Пингом каждые 450мс

каким образом?

Если прошло 450мс после последней связи, посылать фиктивный, нафиг не нужный запрос только чтобы стаймаут начал снова отсчитываться. А как именно это сделать, Вы же сказали
ЕвгенийП пишет:
код я сам напишу.

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

Не помню у визнета таймаута на коннект. У них есть пример ChatServer : запустите, телнетом подвесьтесь на секунду хотя бы - порвётся разве?

maks.dav
Offline
Зарегистрирован: 13.12.2015

ЕвгенийП пишет:

Если прошло 450мс после последней связи, посылать фиктивный, нафиг не нужный запрос только чтобы стаймаут начал снова отсчитываться.

Arduino должна посылать? 
Костыль какой-то жесткий получается

maks.dav
Offline
Зарегистрирован: 13.12.2015

ЕвгенийП пишет:

 А как именно это сделать, Вы же сказали

ЕвгенийП пишет:
код я сам напишу.

Код написать, зачастую, куда меньшая проблема, чем понять принципы работы и взаимодействия

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

maks.dav пишет:

Костыль какой-то жесткий получается

А как по-Вашему keep-alive работает?

Если устройство через какое-то время разрывает связь, считая, что на том конце уже никого нет, нужно показать ему, что есть - вот и весь костыль.

maks.dav
Offline
Зарегистрирован: 13.12.2015

sadman41 пишет:
Не помню у визнета таймаута на коннект.

а где можно найти это значение по дефолту?

maks.dav
Offline
Зарегистрирован: 13.12.2015

ЕвгенийП пишет:

maks.dav пишет:

Костыль какой-то жесткий получается

А как по-Вашему keep-alive работает?

Если устройство через какое-то время разрывает связь, считая, что на том конце уже никого нет, нужно показать ему, что есть - вот и весь костыль.

Если не найдётся другого решения, попробую

b707
Offline
Зарегистрирован: 26.05.2017

maks.dav пишет:

Если не найдётся другого решения, попробую

зря сомневаетесь, куча профессиональных устройств по такому принципу работает

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

maks.dav пишет:

sadman41 пишет:
Не помню у визнета таймаута на коннект.

а где можно найти это значение по дефолту?

Можно поискать, а не найти. В даташите, в исходниках библиотеки.

Но, повторюсь, начните с эксперимента ChatServer, ибо лично я с самостоятельным обрывом коннекта со стороны визнета не сталкивался. Тем более за 1сек. 

maks.dav
Offline
Зарегистрирован: 13.12.2015

sadman41 пишет:

maks.dav пишет:

sadman41 пишет:
Не помню у визнета таймаута на коннект.

а где можно найти это значение по дефолту?

Можно поискать, а не найти. В даташите, в исходниках библиотеки.

Но, повторюсь, начните с эксперимента ChatServer, ибо лично я с самостоятельным обрывом коннекта со стороны визнета не сталкивался. Тем более за 1сек. 

Установил ЧатСервер - проверил через командную строку, сообщения доходят, и после перерыва в отправке тоже. Но как я могу определить, закрывалось ли подключение за это время?

И ещё, в порт ЧатСервер почему-то выводит: Ethernet cable is not connected. Это как так? Не полностью проходит какая-то инициализация? Кабель взял другой - ничего не изменилось

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

Через putty сделать коннект на  arduino_ip:23, напечатать туды "123", увидеть это в Serial Monitor, оставить на несколько секунд и напечатать ещё раз. Увидеть в Serial Monitor ещё раз и понять, что ардуина ничего сама по себе не рвёт. А определить как... Ну, мультиметром точно не определить. Wireshark поставить, наверное, и фильтрануть по arduino_ip. В логе будет всё понятно - коннект, обрыв, передача.

"Ethernet cable is not connected" на W5100 бывает, по-моему. Потому что в нём нет регистра, через который можно получить состояние PHY-коннекта .

maks.dav
Offline
Зарегистрирован: 13.12.2015

Ребят, всем спасибо за участие, выяснил, что косяк был в плагине агрегатора, всё же это он закрывал соединение.
Arduino держит подключение мертво

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

Значит надо делать неблокирующий опрос датчика и слать плагину всякую чушь и компот, пока нормальные данные не сгенерируются. Но, если плагин жёстко сессию 500мс держит, то keep-alive не поможет.