有没有办法获取分配给连接到 ESP32 的新 STA 的 IP 地址及其 MAC 地址?

Is there a way to get the IP address that assigned to the new STA that connected to ESP32 along with its MAC address?

我想获取刚刚由 DHCP 分配给刚刚连接到 ESP32 的新 STA 的 IP 地址及其 MAC 地址。

我正在考虑使用 "dhcp_search_ip_on_mac()" 函数将参数“&event->event_info.sta_connected.mac”传递给它,但问题是 "SYSTEM_EVENT_AP_STAIPASSIGNED" 事件 ID 没有事件数据结构并且sta_connected.mac 变量来自 "SYSTEM_EVENT_AP_STACONNECTED" 事件 ID。但我在想如果我同时面对多个连接会怎样,如果此时 ESP 使用 sta_connected.mac 从 DHCP 搜索功能获取 ip 地址,该变量将具有 mac 地址另一个 STA 而不是触发事件 id "SYSTEM_EVENT_AP_STACONNECTED".

的那个
esp_err_t eventHandler(void *ctx, system_event_t *event){
 switch (event->event_id)
 {
   case SYSTEM_EVENT_AP_STACONNECTED:
    printf("STA just connected.\n");
    printf("STA MAC@: %s\n", ip4addr_ntoa(&event->event_info.sta_connected.mac));
    break;
   case SYSTEM_EVENT_AP_STAIPASSIGNED:
    ip4_addr_t staAddr;
    dhcp_search_ip_on_mac(&event->event_info.sta_connected.mac, &staAddr);
    printf("STA ip address maybe %s\n", ip4addr_ntoa(&staAddr));
    break;
   default:
    break;
 }
 return ESP_OK;
}

考虑到以下代码可以在 tcpip_adapter/tcpip_adapter_lwip.c

中找到
static void tcpip_adapter_dhcps_cb(u8_t client_ip[4])
{
    ESP_LOGI(TAG,"softAP assign IP to station,IP is: %d.%d.%d.%d",
                client_ip[0],client_ip[1],client_ip[2],client_ip[3]);
    system_event_t evt;
    memset(&evt, 0, sizeof(system_event_t));
    evt.event_id = SYSTEM_EVENT_AP_STAIPASSIGNED;
    memcpy((char *)&evt.event_info.ap_staipassigned.ip.addr, (char *)client_ip, sizeof(evt.event_info.ap_staipassigned.ip.addr));
    esp_event_send(&evt);
}

我假设处理 IP_EVENT_AP_STAIPASSIGNED / SYSTEM_EVENT_AP_STAIPASSIGNED 阅读 event->event_info.ap_staipassigned.ip.addr 应该适合你的情况。

编辑: 以下编译对我来说很好。但是需要最新版本的 esp-idf,因为最近似乎添加了此功能。

case IP_EVENT_AP_STAIPASSIGNED:
    {
        int addr = event->event_info.ap_staipassigned.ip.addr;
        ESP_LOGI(TAG0, "%d",addr);
    }break;

已使用主版本 6fd535c 进行测试。

我最近下载的 ESP8266_RTOS_SDK 也遇到了同样的问题。 去了 tcpip_adapter_lwip.c 并且刚刚将 ip 添加到 event_info.got_ip.ip_info.ip.addr 字段:

static void tcpip_adapter_dhcps_cb(u8_t client_ip[4])
{
    ESP_LOGI(TAG,"softAP assign IP to station,IP is: %d.%d.%d.%d", client_ip[0],client_ip[1],client_ip[2],client_ip[3]);
    system_event_t evt;
    evt.event_id = SYSTEM_EVENT_AP_STAIPASSIGNED;
    evt.event_info.got_ip.ip_info.ip.addr = (client_ip[3] << 24) | (client_ip[2] << 16) | (client_ip[1] << 8) | client_ip[0];
    esp_event_send(&evt);
}