Ethernet W5100 + DHCP server
- Войдите на сайт для отправки комментариев
Пт, 19/07/2013 - 09:35
Собственно, есть Ethernet shield на W5100 и arduino uno.
Пытаюсь "поковырять" примеры работы с данным шилдом.
Всё это дело подключено к серверу, имеющему свой DHCP (isc-dhcp-server). Все работает, адреса выдает и т.д.
С ардуиной же получается, что конструкция вида
Ethernet.begin(mac);
работает чудесно. Сервак назначает IP, происходит соединение ну и далее запрос.
А вот конструкция вида:
Ethernet.begin(mac, ip);
Уже не работает и соединения нет.
IP пытался указывать как:
byte ip[] = {192,168,1,200};
и как
IPAddress ip(192,168,1,200);
Не работает ни одна конструкция.
Кто сталкивался, может есть какие-то грабли?
а вы как определяете что нет соединения?
и можно на код целиком посмотреть?... а то из вашего описания следует только рекомендация обрызгать все святой водой и прочитать молитву... а то духи злобные в коде поселились :)
Код целиком вот такой в данный момент:
Полагаю, что в моём случае неробходимо использовать конструкцию вида
Поправьте, если не прав.
То есть в моем случае (сервак имеет адрес 192.168.1.100) код должен выглядеть так, наверное:
Пока нет возможности проверить. Приду домой - проверю.
Насколько я понимаю Вы пытаетесь обратиться из своей подсети (и на ней же висит сервер) через dyndns к самому себе - вот тут собака и порылась
Ну вероятнее всего так. Но вот задача как раз в том и состоит, чтобы явно задать IP в своей сети, а обратиться (послать GET запрос) уже к хосту в интернете.
Поскажите, как сие сделать?
Заведите сервер на бесплатном хостинге, у него будет постоянный айпишник. Самый простой вариант.
У моего тоже выделенный IP, однако хочется обращаться по имени, поэтому и через dyndns.org
И как тогда будет выглядеть код для внешнего IP? Что-то я запутался...
Причем тут "обращаться по имени" и dyndns? Если у сервера выделенный айпи НЕ из зарезервированных подсетей для личного пользования (192.168.*/12, 10.*/8, 172.16.*/12)то и прописывайте его айпи, но в этом случае надо (если он идин из виртуальных серверов) чтобы он был прописан по дефолту в апачи
В случае данного сервера, не представляется возможным в папку дефолтного виртуального положить скрипты. Но это легко решается строкой:
после GET запроса.
ТО есть, если я правильно понимаю, я меняю строку
на примерно такую?
Однако, ИМХО, это две одинаковых строчки. В чем смысл?
del. Дубль.
Вы неправильно понимаете. DNS превращает имя хоста в айпи, никакой другой смысловой нагрузки DNS не несет. Вашей заменой Вы просто разгружаете DNS, но Вашему серверу непонятно какой сайт отображать и поэтому он возьмет дефолтный. Что у вас в dyndns прописано?
Не совсем так. DNS перенаправляет запрос на определенный IP. А уже сервак, стоящий на данном IP перенаправляет запрос (по адресу сайта) в определенную папку соответствующего виртуального сервера (на конкретном сервере). Так вот, виртуальных на данном серваке много. Дефолтный тоже есть (кстати, если именно по IP обратиться к серваку, он именно на дефолтный и направит), но будем считать (в силу определенных обстоятельств), что на дефолтный нет доступа. Если я к серверу по имени обращусь, я попаду в папку одноименного виртуального сервера (что мне и нужно), если по IP - непосредственно в папку default.
P.S. В настройках dyndns прописан урл (пусть будет srv.dyndns.org) и соответственно, IP (пусть будет 173.194.35.168) с галкой "Host with IP address", в принципе, как и везде на любом dns.
DNS перенаправляет запрос? Очень интересно :) DNS это не что иное как текстовый файл в формате ключ-значение (разбивку по зонам мы опустим для простоты как и прочие настройки типа срока хранения). Я так понимаю что у вас страшно засекреченные данные на сервере хранятся, иначе к чему бы такая секретность? :) Ну а если Вы на самом деле прописали в dyndns что искомый домен находится на нем же, то конечно он ничего не найдет (Но я и не исключаю вариант что Вам выделили субдомен на dyndns, что не исключает предложенный вначале вариант завести бесплатный сервер чтобы исключить мое первое предположение) :)
и в догонку - Вы проверяли подсеть правильная? IP не занят кемто еще?
Извиниите, про DNS неверно выразился. Хотел передать общий смысл. Но вы меня корректно исправили. Спасибо. ))
В общем, мы ушли от темы. Как раз эта часть работает нормально. Читайте выше, не работает не отправка или обработка сервером запроса, а именно жесткая привязка IP адреса _ в локальной сети_. При получении адреса сервером DHCP, все запросы доходят туда, куда им нужно.
И в догонку, IP никем не занят еще 200%
что пишет
Serial
.println(Ethernet.localIP());? при автоматическом присвоении ip
что пишет
Serial
.println(Ethernet.localIP());? при автоматическом присвоении ip
Присвоенный IP. 192,168,1,22
в скрипте dns поменяйте (см. выше)
Спассибо. Попробую дома. Я как-то не подумал об этом.
По результатам напишу - может ещё кто сталкиваться будет.
P.S. Отвлеченная тема от DHCP, но касающаяся самого ethernet шилда.
Хорошо греется основной чип W5100. Где-то в районе 60-70 градусов (не замерял, но палец не удержишь).
Данный "бутерброд" питается пока по USB. Проблема в питании? То есть, хотелось бы узнать опыт других, кто "ковырял" данную железку.
Как и обещал, отписываюсь.
Да - все работает изумительно. Читаю (как и многие другие) DHT22 и пишу в БД. Работает как с локальным сервером, так и с URL-ом.
Кому нужно, код ниже:
Вот это
не есть гут. лучше их по одиночке проверяйте - лучше записать одно значение (если есть) чем ни одного
Вот это
не есть гут. лучше их по одиночке проверяйте - лучше записать одно значение (если есть) чем ни одного
Ну с такой позиции уж лучше так:
Неа :) Так NULL по одному из значений может в БД попасть
Согласен. Не подумал. Хотя, ИМХО если NULL по одному из значений, скорее всего будет нулл и по второму ;)
Подниму старую тему дабы не плодить новую.
Появился еще один вопрос по ethrenet - шилду.
В коде для установления связи шилда с сервером используется строка вида:
Ну и после отправки показаний на сервер закрывается соединение:
Все бы ничего, но прикручиваю к данной связке nRF24L01, которая на той же SPI (периодически дергаю "ногами" chip select для выбора активного slave) и появляется проблема - если закрывать каждый раз соединение, то как я полагаю (может и неправильно) пока нет соединения, буфер приема будет недоступен (в буфер ничего "сыпаться" не будет). А буфер нужен, чтоб не пропустить команду с сервера.
Вопрос в следущем - можно ли (кто-нибудь работал так) не закрывать соединение (client.stop();) - то есть открыть его один раз, допустим, при инициализации шилда и не закрывать и чем это чревато?
Может есть другой выход?
Ага... Разобрался почти. Для инициализации входящих подклчений есть EthernetServer
Однако, пока много чего не понятно.
Допустим, инициализирую я его как клиента EthernetClient client; в сетапе делаю Ethernet.begin(mac, ip, mydns, gateway); и в основном цикле client.connect(server,80) для передачи данных удаленному серверу.
Могу ли я параллельно в том же коде сделать EthernetServer myserver(80); в сетапе (опять же - в сетапе по идее должны быть другие данные - айпи уже этого как я понимаю сервера-ардуино) написать server.begin(); и в основном коде EthernetClient clientsrv = server.available();?
Походу нет. Поправьте, если не прав, но полагаю что сервер и клиент на одном и том же шилде не запустить.
Мысли вслух: Опять-таки, после запроса сервак обязательно ответ пришлет... Кто ловить этот ответ будет на ардуине? Сервер? Клиент?
Или каждый раз когда хочется отправить чего-то переинициализировать (как в сетапе) этот эзернет? Ethernet.begin(mac, ip, mydns, gateway);
P.S. Эх, блин... Все совсем не так... Поправлю этот пост, когда полностью разберусь и напишу рабочий скетч.
Мысли вслух: Опять-таки, после запроса сервак обязательно ответ пришлет... Кто ловить этот ответ будет на ардуине? Сервер? Клиент?
Какая разница? Кто поймал - тот и клиент. :)
На самом деле - хорошо бы хоть азы tcpip знать: ответ приходит на тот порт, с которого уходил запрос. А кто там слушает (или уже никого нет) - это дело десятое.
Мысли вслух: Опять-таки, после запроса сервак обязательно ответ пришлет... Кто ловить этот ответ будет на ардуине? Сервер? Клиент?
Какая разница? Кто поймал - тот и клиент. :)
На самом деле - хорошо бы хоть азы tcpip знать: ответ приходит на тот порт, с которого уходил запрос. А кто там слушает (или уже никого нет) - это дело десятое.
Понимание данных процессов есть. Я прекрасно понимаю, что "Кто поймал - тот и клиент". Очень не хотелось ковырять библиотеку - совсем нет на это времени. Спрашивал потому как думал, может кто-то уже интересовался данным вопросом, пототму как неизвестно как поведет себя данная библа в этом случае.
Ну а уж что ответ придет по тому же порту на котором установлено соединение (мало того, на данном, прикладном уровне он привязывается именно к порту) - и сомнений нет. Вопрос заключался именно в том, кто ж слушать-то будет в данный момент.
Но вы невнимательно читали прошлый пост (как бы я написал, что разобрался, просто не реализовал).
Однако, спасибо за отзыв и помощь.
Кстати, по этой теме понравилась очень данная статья - подробно и очень просто изложено про библиотеку Ethernet - кто не сталкивался настоятельно рекомендую к прочтению для понимая.
Ну а уж что ответ придет по тому же порту на котором установлено соединение (мало того, на данном, прикладном уровне он привязывается именно к порту) - и сомнений нет. Вопрос заключался именно в том, кто ж слушать-то будет в данный момент.
Я исходил из двух простых вещей: по-умолчанию, web-сервер "слушает" 80-й порт, в то же время принято, что приложения, для исходящих пакетов, не используют порты ниже 1024 (а лучше не ниже 6000), т.е., в нормальных условиях, web-сервер никак не может получить пакет, отправленный клиентом.
Другое дело, озадачиться вопросом: как в ардуине tcp-сессия сохраняется между циклами loop, или просто стоим на месте и ждем ответа...
В принципе, не беда. Набросал код - приду домой - проверю :)