Работа с Ethernet (отследить линк на порту)
- Войдите на сайт для отправки комментариев
Пт, 29/11/2013 - 13:11
В проекте используется библиотека EtherCard http://mk90.blogspot.ru/2013_02_01_archive.html, и соответственно Ethernet Shield от Arduino на микросхеме Wiznet W5100.
Проблема: не могу нормально отследить наличие связи по сети, т.к. элементарное отключение сетевого кабеля в стандартных функциях (типа client.connected и др.) или в статусе сокета никак не отображается. Подскажите (кто сталкивался) пожалуйста способ однозначного определения состояния связи по Ethernet.
Заранее спасибо всем отозвавшимся.)
В проекте используется библиотека EtherCard http://mk90.blogspot.ru/2013_02_01_archive.html, и соответственно Ethernet Shield от Arduino на микросхеме Wiznet W5100.
Есть универсальный способ, подойдет для любого контроллера, но в то же время это колхозный способ - припаяться к выводу на светодиод наличия подключенного кабеля.
Библиотека http://arduino.cc/en/Reference/Ethernet - эта, если уточнить.
Собственно мне кажется, что дело не в библиотеке, хотя, конечно же фукции такой ей не хватает.
Можно дописать, если кто подскажет где лежит та самая сокровенная инфо о реальном состоянии подключения. Я недавно столкнулся с ардуино, поэтому мне несколько сложно самому разбираться с железом, но С знаю. Может моих знаний языка мне не достаточно, т.к. найти в коде библиотеки нужные вещи касаемо сосояния порта/сокета мне не удалось. Да и еще вопрос времени.))
У W5100 отсутствуют регистры с состоянием светодиодов, которые мигают/горят на шилде, так что остается только паять.
Но вопрос еще остается следующий - а зачем вам это?
Вопрос странный)))) У меня работает телнет клиент, и вполне естественно моё желание знать все ли у меня впорядке со связью. Но в случае элементарного отключения кабеля (особенно если это произошло после успешного подключения) - я ничего, получается, об этом не знаю. Функция connected "молчит", состояние сокета ESTABLISHED, и т.п.
Вот и вопрос: как отследить реальное состояние связи в ран-тайме.
Да нет вопрос то как раз не странный. Во-первых не всегда причиной отсутствия связи является обрыв провода, а во вторых - почитайте http://www.rsdn.ru/article/net/keep_alive.xml. А вот keepalive у W5100 реализован.
Толчем воду в ступе....
Во-первых: отсутствие связи - это отсутствие связи, не зависимо от причин. Если эту самую причину можно конкретизировать - это великолепно, если нет - не так уж и важно. Главное - ЗНАТЬ ЧТО СВЯЗЬ БЫЛА И ЕЕ НЕ СТАЛО, ИЛИ НЕБЫЛО И НЕТ ЕЁ ВОВСЕ, ИЛИ ПОЯВИЛАСЬ.
Во-вторых: что такое keep-alive я прекрасно знаю, но что/как это реализовано в w5100 не знаю, поэтому и задаю вопрос, на который стараюсь получить конкретный ответ. Если таковой у Вас имеется - будь-те добры, если нет - извольте.
ENC28J60 может информировать о линке....
"ENC28J60 может информировать о линке...."(с)
А конкретнее?
Ну так если знаете о существовании keep-alive и знаете что причин отсутствия связи множество, то почему сразу нельзя было задаться вопросом как реализовать в библиотеке Ethernet keep-alive ?
Если таковой у Вас имеется - будь-те добры, если нет - извольте.
В файл w5100.h в enum SockCMD добавляете строку Sock_SEND_KEEP = 0x22, (если отсутствует);
В файл socket.h добавьте строку extern uint8_t keep_alive(SOCKET s);
В файл socket.cpp добавьте:
В файл EthernetClient.h добавьте строку uint8_t keepalive();
В файл EthernetClient.cpp добавьте
Как пользоваться, думаю разберетесь, если не изменяет память таймаут 30 секунд.
В библиотеке EtherCard
можно так
Если я правильно понимаю обьединение классов из ENC28J60
Огромное всем спасибо. Завтра проверяю, т.к. девайс не под рукой, и обязательно отпишусь.