Определение IP клиента или его "идентификатора"
- Войдите на сайт для отправки комментариев
Всем привет!
Проблема такая... Ардуино работает в режиме web-сервера, к нему конектится клиент (любой ПК). После соединения с сервером, клиент получает web-страницу, с этим все впорядке.
Нужно узнать IP-адрес клиента, который подключился к web-серверу на ардуине, как это сделать? Сервер может показать только свой собственный адрес, команда Serial.println(Ethernet.localIP()); Если на сервере отслеживать подключение клиента определив его как EthernetClient client, то можно как-то через это определение client получить его IP? Например, что-то типа этого client.remoteIP()...
Вопрос тупо стал с авторизацие пользователей на сервере. Если сделать простую авторизацию на ардуино логин/пароль, через веб морду для клента. То после такой авторизации, мы должны ставить некий флаг в TRUE, для разрешения этому клиенту доступа ко всем страницам сервера. Но если конкретного пользователя не отслеживать по уникальному идентификатору клиента, то после одной такой успешной авторизации, остальные тупо тоже получают доступ к серверу без всякой авторизации... Как быть?
Для протокола UDP в библиотеке реализовоно получение udp.RemoteIP(), а вот в HTTP как-то нет.. :(
Вопрос интересный, для внешних ип есть скрипты, пользующиеся сторонним сервисом. Как определить адрес клиента в локалке внутренними возможностями не нашел.
ну народ! первая ссылка http://bfy.tw/2xIJ
цитата:
To make it work, I did the following:
I added the following lines to the end of the EthernetClient.cpp file:
uint8_t *EthernetClient::getRemoteIP(uint8_t remoteIP[])
{
W5100.readSnDIPR(_sock, remoteIP);
return remoteIP;
}
I then added the following line (under the virtual void stop(); line)to the EthernetClient.h file:
uint8_t *getRemoteIP(uint8_t RemoteIP[]);//adds remote ip address
Finally I used the following code in my sketch to access the remote IP:
client.getRemoteIP(rip); // where rip is defined as byte rip[] = {0,0,0,0 };
to display the IP in the serial monitor, I used:
for (int bcount= 0; bcount < 4; bcount++)
{
Serial.print(rip[bcount], DEC);
if (bcount<3) Serial.print(".");
}
toc - Спасибо! =)
Только не очень понятно куда все вставлять...
В конец файла EthernetClient.cpp вставляем:
uint8_t *EthernetClient::getRemoteIP(uint8_t remoteIP[])
{
W5100.readSnDIPR(_sock, remoteIP);
return remoteIP;
}
Далее в файл EthernetClient.h , видимо до оператора #EndIf объявляем:
uint8_t *getRemoteIP(uint8_t RemoteIP[]);//adds remote ip address
Остальное размещаем в скетче:
client.getRemoteIP(rip); // where rip is defined as byte rip[] = {0,0,0,0 };
to display the IP in the serial monitor, I used:
for (int bcount= 0; bcount < 4; bcount++)
{
Serial.print(rip[bcount], DEC);
if (bcount<3) Serial.print(".");
}
Выдает ошибку при компиляции: 'class EthernetClient' has no member named 'getRemoteIP'
Видимо что-то не так ставлю...
С определением имени функции getRemoteIP разобрался. :)
Теперь новую ошибку выдает, связана с возвратом параметра. Пока не разобрался...
exit status 1
Ошибка компиляции.
Разобрался в чем была проблема... :) У меня Ардуино почему-то продублировал некоторые папки с библиотеками в папку "Документы" пользователя. Наверное осталась от предыдущей установки, я обновлял версию ардуино. По умолчанию почему-то натыкалась на те файлы, а правил я те, что в директории Programm Files. Отсюда и не понятки с ошибками... ;)
Откомпилил без ошибок, все прекрасно работает!
TOC - ОГРОМНОЕ ТЕБЕ СПАСИБО!!! ))))) Действительно долго искал хоть что нибудь похожее, но никак не мог найти. Спасибо! :)
А выложить итоговый рецепт: код и железо , как работающий пример скромность не позволяет ?
Фрагмент кода по существу вопроса полностью изложен TOC. Выкладывать все файлы, включая дописанные файлы библиотеки с изменениями особого смысла нет. Все написано выше, даже с комментариями, немного потыкаться и готово.. Возможно будут ляпы как у меня с дублирование библиотек в разных директориях, но это скорее из-за невнимательности. :) Код полностью рабочий!
Отслеживать авторизацию более 4х клиентов на ардуине не вижу смысла, вполне хватает подключений. Тем более по описанию W5100 он аппаратно поддерживает не более 4х подключений одновременно.
От себя... мне это нужно для сборки девайса по управлению силовой нагрузки в серверной. Помещу все железо в старый корпус от коммутатора и буду управлять розетками питания, для перезагрузки модемов в серверной стойке. Просто бывает, что на работе приходится с 3-го на 1-ый этаж время от времени бегать и вручную питание дергать, т.к. виснет иногда оборудование, напрягает... Авторизация клиетов (меня + напарника) средствами ардуино по IP клиента, хоть маленькая, но гарантия от ряда глупостей к конекту устройства сторонними лицами. Ничего сверх естественного в этом нет. ;) Думал еще делать программную авторизацию путем связки Java+PHP, но много дыр + обязательное наличие связи со вторым сервером, где PHP поднят. Зачем извращаться, когда должно быть простое решение на уровне библиотек Ардуино. ))) Просто в библиотеках и аппаратной составляющей шилда я пока не силен, что бы самому спокойно такое лепить. Но тем неменее решение есть и очень простое, без всяких заморочек. А материала по проверки IP клиента ВЕБ-сервером средствами Ардуина, крайне мало... почти нет.
работает
главное правит актуальную библиотеку, я тоже повозился, пока нашел где править.
Ага... ))) У меня тоже все прекрасно работает. ;)
П.С. Обычно компилятор пишет внизу окна пути директорий нахождения библиотек. Там же указывает какую в настоящий момент использует, какая про запас... Одну из них надо удалить.
... кто нибудь пробовал эту фичу запускать с новой библиотекой Ethernet 1.1.2 от новой IDE 1.6.12 ???
указанным способом у меня не получилось. с 1.0.4 работает замечательно.
dbf-334, спасибо вам огромное!
А возможно ли в ардино определить все айпи адреса, компьютеров, назходящихся в локальной сети?
Возможно.
ICMP ping.
прям с ардуино?
прям с ардуино?
Если твоя "ардуина" умеет подключаться к сети и работать в ней, то почему бы и нет? Но ведь модель ардуины и схема в целом засекречены. Как тут дашь утвердительный ответ? Вон sadman41 ответил утвердительно, а ты ему - А у меня Arduino Nano. И все, приплыли....
))))
Не прямо, а через провод.
через RJ-45 или BNC?
через RJ-45 или BNC?
в рамках вопроса без разницы абсолютно