• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266 - Узнать IP клиента, подключенного к SoftAP на самой станции (точке доступа)

Paul_B

Member
Когда создается точка доступа и е ней подключаются клиенты, то я передаю IP- адреса по HTTP-протоколу через организованные HTTP-сервера на клиенте и станции (точке доступа). И все работает. По WiFi.getStationNum() я могу видеть сколько подключенных клиентов.
Но если станция (точка доступа перегружается), а на клиентах я не успеваю отследить повторное подключение, т.к. произвожу опрос подключения раз в 10 секунд (не хочется это делать чаще), то повторное подключение клиентов происходит автоматически, точка доступа знает по WiFi.getStationNum() сколько подключено клиентов но!!! Но она не знает с какими IP адресами эти клиенты подключены.
Можно ли как-то победить этот недуг (не увеличивая частоту выявления подключений на клиентах, т.е. получить список подключенных клиентов с их новыми IP-адресами?

Понятно, что через какое-то время при очередном разрыве связи я это отслежу на клиенте и отправлю на станцию на IP (gateway=WiFi.gatewayIP();) свой IP адрес клиента, полученного по команде ip=WiFi.localIP();
Но хотелось бы осознанного управления процессом.
 

Paul_B

Member
Отвечу сам себе...
Код:
extern "C" {
#include<user_interface.h>
}

void client_status()  /// This works, ty sohialsadiq!
{

unsigned char number_client;
struct station_info *stat_info;

struct ip_addr *IPaddress;
IPAddress address;
int i=1;

number_client= wifi_softap_get_station_num(); // Count of stations which are connected to ESP8266 soft-AP
stat_info = wifi_softap_get_station_info();

Serial.print(" Total connected_client are = ");
Serial.println(number_client);

while (stat_info != NULL) {

IPaddress = &stat_info->ip;
address = IPaddress->addr;

Serial.print("client= ");

Serial.print(i);
Serial.print(" ip adress is = ");
Serial.print((address));
Serial.print(" with mac adress is = ");

Serial.print(stat_info->bssid[0],HEX);
Serial.print(stat_info->bssid[1],HEX);
Serial.print(stat_info->bssid[2],HEX);
Serial.print(stat_info->bssid[3],HEX);
Serial.print(stat_info->bssid[4],HEX);
Serial.print(stat_info->bssid[5],HEX);

stat_info = STAILQ_NEXT(stat_info, next);
i++;
Serial.println();

}
delay(500);
}
 

pvvx

Активный участник сообщества
О` опять полинг :)
Правильно только так:
Код:
void wifi_handle_event_cb(System_Event_t *evt)
{
  os_printf("event %x\n", evt->event);
  switch (evt->event) {
    case EVENT_STAMODE_CONNECTED:
      os_printf("connect to ssid %s, channel %d\n",
                evt->event_info.connected.ssid,
                evt->event_info.connected.channel);
      break;
    case EVENT_STAMODE_DISCONNECTED:
      os_printf("disconnect from ssid %s, reason %d\n",
                evt->event_info.disconnected.ssid,
                evt->event_info.disconnected.reason);
      break;
    case EVENT_STAMODE_AUTHMODE_CHANGE:
      os_printf("mode: %d -> %d\n",
                evt->event_info.auth_change.old_mode,
                evt->event_info.auth_change.new_mode);
      break;
    case EVENT_STAMODE_GOT_IP:
      os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
                IP2STR(&evt->event_info.got_ip.ip),
                IP2STR(&evt->event_info.got_ip.mask),
                IP2STR(&evt->event_info.got_ip.gw));
      os_printf("\n");
      break;
    case EVENT_SOFTAPMODE_STACONNECTED:
      os_printf("station: " MACSTR "join, AID = %d\n",
                MAC2STR(evt->event_info.sta_connected.mac),
                evt->event_info.sta_connected.aid);
      break;
    case EVENT_SOFTAPMODE_STADISCONNECTED:
      os_printf("station: " MACSTR "leave, AID = %d\n",
                MAC2STR(evt->event_info.sta_disconnected.mac),
                evt->event_info.sta_disconnected.aid);
      break;
    default:
      break;
  }
}
void user_init(void)
{
  // TODO: add your own code here....
  wifi_set_event_hander_cb(wifi_handle_event_cb);
}
Пример из __esp8266_non_os_sdk_api_reference___.pdf

В EVENT_SOFTAPMODE_STADISCONNECTED или EVENT_SOFTAPMODE_STACONNECTED можно узнать сразу сколько станций подключено:
int i = wifi_softap_get_station_num(); // Number count of stations which connected to ESP8266 soft-AP
C IP - аналогично...
 
Последнее редактирование:

Paul_B

Member
int i = wifi_softap_get_station_num(); // Number count of stations which connected to ESP8266 soft-AP
C IP - аналогично...
Проблем узнать сколько станций-клиентов подключено нет - это легко делается и при штатной
Код:
byte i=WiFi.getStationNum();
Проблема с тем как узнать IP-адреса этих подключенный станций. Приведенной мною процедурой это можно сделать, а вот как выйти на
Код:
case EVENT_STAMODE_GOT_IP:
      os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
                IP2STR(&evt->event_info.got_ip.ip),
                IP2STR(&evt->event_info.got_ip.mask),
                IP2STR(&evt->event_info.got_ip.gw));
      os_printf("\n");
      break;
т.е. какой параметр задать при вызове функции
Код:
void wifi_handle_event_cb(System_Event_t *evt)
не могу сообразить.
 

pvvx

Активный участник сообщества
Проблема с тем как узнать IP-адреса этих подключенный станций.
А никак :)
Представьте, что клиент соединился с фиксированным IP и у него уже всё прописано в netif, с прошлого соединения и вообще отключен DHCP. :)
IP клиента узнается по событию работы с/в DHCP. А его нет :)
Кто в данном случае запрещает слать клиенту broadcast пакеты?
 
Сверху Снизу