• Система автоматизации с открытым исходным кодом на базе 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 пакеты?
 
Сверху Снизу