Определение IP клиента или его "идентификатора"

dbf-334
Offline
Зарегистрирован: 13.11.2015

Всем привет!

Проблема такая... Ардуино работает в режиме web-сервера, к нему конектится клиент (любой ПК). После соединения с сервером, клиент получает web-страницу, с этим все впорядке.

Нужно узнать IP-адрес клиента, который подключился к web-серверу на ардуине, как это сделать? Сервер может показать только свой собственный адрес, команда Serial.println(Ethernet.localIP()); Если на сервере отслеживать подключение клиента определив его как EthernetClient client, то можно как-то через это определение client получить его IP? Например, что-то типа этого client.remoteIP()...

Вопрос тупо стал с авторизацие пользователей на сервере. Если сделать простую авторизацию на ардуино логин/пароль, через веб морду для клента. То после такой авторизации, мы должны ставить некий флаг в TRUE, для разрешения этому клиенту доступа ко всем страницам сервера. Но если конкретного пользователя не отслеживать по уникальному идентификатору клиента, то после одной такой успешной авторизации, остальные тупо тоже получают доступ к серверу без всякой авторизации... Как быть?

Для протокола UDP в библиотеке реализовоно получение udp.RemoteIP(), а вот в HTTP как-то нет.. :(

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вопрос интересный, для внешних ип есть скрипты, пользующиеся сторонним сервисом. Как определить адрес клиента в локалке внутренними возможностями не нашел.

toc
Offline
Зарегистрирован: 09.02.2013

ну народ! первая ссылка http://bfy.tw/2xIJ

toc
Offline
Зарегистрирован: 09.02.2013

цитата:

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(".");
}

dbf-334
Offline
Зарегистрирован: 13.11.2015

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'

Видимо что-то не так ставлю...

dbf-334
Offline
Зарегистрирован: 13.11.2015

С определением имени функции getRemoteIP разобрался. :)

Теперь новую ошибку выдает, связана с возвратом параметра. Пока не разобрался...

exit status 1
Ошибка компиляции.

dbf-334
Offline
Зарегистрирован: 13.11.2015

Разобрался в чем была проблема... :) У меня Ардуино почему-то продублировал некоторые папки с библиотеками в папку "Документы" пользователя. Наверное осталась от предыдущей установки, я обновлял версию ардуино. По умолчанию почему-то натыкалась на те файлы, а правил я те, что в директории Programm Files. Отсюда и не понятки с ошибками... ;)

Откомпилил без ошибок, все прекрасно работает!

TOC - ОГРОМНОЕ ТЕБЕ СПАСИБО!!! ))))) Действительно долго искал хоть что нибудь похожее, но никак не мог найти. Спасибо! :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

А выложить итоговый рецепт: код и железо , как работающий пример скромность не позволяет ?

dbf-334
Offline
Зарегистрирован: 13.11.2015

Фрагмент кода по существу вопроса полностью изложен TOC. Выкладывать все файлы, включая дописанные файлы библиотеки с изменениями особого смысла нет. Все написано выше, даже с комментариями, немного потыкаться и готово.. Возможно будут ляпы как у меня с дублирование библиотек в разных директориях, но это скорее из-за невнимательности. :) Код полностью рабочий!

Отслеживать авторизацию более 4х клиентов на ардуине не вижу смысла, вполне хватает подключений. Тем более по описанию W5100 он аппаратно поддерживает не более 4х подключений одновременно.

От себя... мне это нужно для сборки девайса по управлению силовой нагрузки в серверной. Помещу все железо в старый корпус от коммутатора и буду управлять розетками питания, для перезагрузки модемов в серверной стойке. Просто бывает, что на работе приходится с 3-го на 1-ый этаж время от времени бегать и вручную питание дергать, т.к. виснет иногда оборудование, напрягает... Авторизация клиетов (меня + напарника) средствами ардуино по IP клиента, хоть маленькая, но гарантия от ряда глупостей к конекту устройства сторонними лицами. Ничего сверх естественного в этом нет. ;) Думал еще делать программную авторизацию путем связки Java+PHP, но много дыр + обязательное наличие связи со вторым сервером, где PHP поднят. Зачем извращаться, когда должно быть простое решение на уровне библиотек Ардуино. ))) Просто в библиотеках и аппаратной составляющей шилда я пока не силен, что бы самому спокойно такое лепить. Но тем неменее решение есть и очень простое, без всяких заморочек. А материала по проверки IP клиента ВЕБ-сервером средствами Ардуина, крайне мало... почти нет.

inspiritus
Offline
Зарегистрирован: 17.12.2012

работает

главное правит актуальную библиотеку, я тоже повозился, пока нашел где править.

dbf-334
Offline
Зарегистрирован: 13.11.2015

Ага... ))) У меня тоже все прекрасно работает. ;)

П.С. Обычно компилятор пишет внизу окна пути директорий нахождения библиотек. Там же указывает какую в настоящий момент использует, какая про запас... Одну из них надо удалить.

inspiritus
Offline
Зарегистрирован: 17.12.2012

... кто нибудь пробовал эту фичу запускать с новой библиотекой Ethernet 1.1.2  от новой IDE 1.6.12 ???

указанным способом у меня не получилось. с 1.0.4 работает замечательно.

ivpo
Offline
Зарегистрирован: 07.01.2014

dbf-334, спасибо вам огромное!

hulitolku
hulitolku аватар
Offline
Зарегистрирован: 23.02.2020

А возможно ли в ардино определить все айпи адреса, компьютеров, назходящихся в локальной сети?

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

Возможно.
ICMP ping.

hulitolku
hulitolku аватар
Offline
Зарегистрирован: 23.02.2020

sadman41 пишет:
Возможно. ICMP ping.

прям с ардуино?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

hulitolku пишет:

sadman41 пишет:
Возможно. ICMP ping.

прям с ардуино?

Если твоя "ардуина" умеет подключаться к сети и работать в ней, то почему бы и нет? Но ведь модель ардуины и схема в целом засекречены. Как тут дашь утвердительный ответ? Вон sadman41 ответил утвердительно, а ты ему - А у меня Arduino Nano. И все, приплыли....

))))

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

Не прямо, а через провод.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Не прямо, а через провод.

через RJ-45 или BNC?

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

ua6em пишет:

sadman41 пишет:
Не прямо, а через провод.

через RJ-45 или BNC?

в рамках вопроса без разницы абсолютно