Как держать сокет открытым при использовании библиотеки Ethernet
- Войдите на сайт для отправки комментариев
Чт, 30/07/2020 - 22:15
Добрый день. Столкнулся с такой проблемой:
Сделал конвертер ethernet в serial. На конвертер через агрегатор "умного дома" отсылаются команды и принимаются состояния с устройств, подключенных к конвертеру.
Но столкнулся с такой проблемой: если интервал опроса устройств более 500 мс, то конвертер сбрасывает подключение (закрывается сокет). Если меньше 500мс - все отлично работает без сбоев.
Теперь вопрос, каким образом можно держать подключение на конвертере максимально открытым для подключенного клиента в виде агрегатора?
А нельзя открывать сокет, когда нужен?
Сделал конвертер ethernet в serial. На конвертер через агрегатор "умного дома" отсылаются команды и принимаются состояния с устройств, подключенных к конвертеру.
Но столкнулся с такой проблемой: если интервал опроса устройств более 500 мс, то конвертер сбрасывает подключение (закрывается сокет). Если меньше 500мс - все отлично работает без сбоев.
Теперь вопрос, каким образом можно держать подключение на конвертере максимально открытым для подключенного клиента в виде агрегатора?
P.s. По большому счёту мне нужен только принцип "на пальцах", код я сам напишу.
Re: А нельзя открывать сокет, когда нужен?
В агрегаторе?
сорри, невнимательно прочитал вопрос, не открывать сокет заново, а заново устанавливать подключение.
Вы же когда подключаетесь в первый раз - вас отсутвие открытого коннекта не смущает? - ну так просто подключайтесь каждый раз, как первый
Если посылать данные чаще, чем производится отключение по тайм-ауту, то коннект не будет сброшен. Keep-Alive пакеты используются не первый десяток лет.
открывать сокет заново ... устанавливать подключение
Чаще всего - это крепко связанные операции.
сорри, невнимательно прочитал вопрос, не открывать сокет заново, а заново устанавливать подключение.
Вы же когда подключаетесь в первый раз - вас отсутвие открытого коннекта не смущает? - ну так просто подключайтесь каждый раз, как первый
с агрегатора не могу каждый раз подключаться как первый раз - т.к. плагин который весь этот процесс реализует, я изменить или переписать не могу, а логика в нем такая, что, если закрывается сокет, то он переподключается. минимальное время переподключения - 1 секунда, и получается так, что задержка с учетом переподключения нарастает, и агрегатор во время переподключения может не среагировать на команду.
Да, это я понял, этим пока и пользуюсь, но если у меня несколько таких конвертеров, и происходит опрос немалого количества датчиков, например, остальные конвертеры успевают сбрасывать подключение
а Keep-Alive функционал есть в библиотеке Ethernet?
Пингом каждые 450мс
каким образом?
Не особо пока понимаю схему взаимодействия - какая из двух сторон закрывает по тайм-ауту коннект, но стоковые ардуино-библиотеки держат их открытыми до посинения.
Закрывается сторона с ардуино. Библиотека стандартная Ethernet.h, контроллер W5500. Таймаут выходит 500 мс.
Пингом каждые 450мс
каким образом?
Не помню у визнета таймаута на коннект. У них есть пример ChatServer : запустите, телнетом подвесьтесь на секунду хотя бы - порвётся разве?
Если прошло 450мс после последней связи, посылать фиктивный, нафиг не нужный запрос только чтобы стаймаут начал снова отсчитываться.
Arduino должна посылать?
Костыль какой-то жесткий получается
А как именно это сделать, Вы же сказали
Код написать, зачастую, куда меньшая проблема, чем понять принципы работы и взаимодействия
Костыль какой-то жесткий получается
А как по-Вашему keep-alive работает?
Если устройство через какое-то время разрывает связь, считая, что на том конце уже никого нет, нужно показать ему, что есть - вот и весь костыль.
а где можно найти это значение по дефолту?
Костыль какой-то жесткий получается
А как по-Вашему keep-alive работает?
Если устройство через какое-то время разрывает связь, считая, что на том конце уже никого нет, нужно показать ему, что есть - вот и весь костыль.
Если не найдётся другого решения, попробую
Если не найдётся другого решения, попробую
зря сомневаетесь, куча профессиональных устройств по такому принципу работает
а где можно найти это значение по дефолту?
Можно поискать, а не найти. В даташите, в исходниках библиотеки.
Но, повторюсь, начните с эксперимента ChatServer, ибо лично я с самостоятельным обрывом коннекта со стороны визнета не сталкивался. Тем более за 1сек.
а где можно найти это значение по дефолту?
Можно поискать, а не найти. В даташите, в исходниках библиотеки.
Но, повторюсь, начните с эксперимента ChatServer, ибо лично я с самостоятельным обрывом коннекта со стороны визнета не сталкивался. Тем более за 1сек.
Установил ЧатСервер - проверил через командную строку, сообщения доходят, и после перерыва в отправке тоже. Но как я могу определить, закрывалось ли подключение за это время?
И ещё, в порт ЧатСервер почему-то выводит: Ethernet cable is not connected. Это как так? Не полностью проходит какая-то инициализация? Кабель взял другой - ничего не изменилось
Через putty сделать коннект на arduino_ip:23, напечатать туды "123", увидеть это в Serial Monitor, оставить на несколько секунд и напечатать ещё раз. Увидеть в Serial Monitor ещё раз и понять, что ардуина ничего сама по себе не рвёт. А определить как... Ну, мультиметром точно не определить. Wireshark поставить, наверное, и фильтрануть по arduino_ip. В логе будет всё понятно - коннект, обрыв, передача.
"Ethernet cable is not connected" на W5100 бывает, по-моему. Потому что в нём нет регистра, через который можно получить состояние PHY-коннекта .
Ребят, всем спасибо за участие, выяснил, что косяк был в плагине агрегатора, всё же это он закрывал соединение.
Arduino держит подключение мертво
Значит надо делать неблокирующий опрос датчика и слать плагину всякую чушь и компот, пока нормальные данные не сгенерируются. Но, если плагин жёстко сессию 500мс держит, то keep-alive не поможет.