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

时间:2019-05-10 13:05:13

标签: esp32

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

我当时正在考虑使用“ 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地址,该变量将具有另一个STA的mac地址,而不是触发事件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;
}

2 个答案:

答案 0 :(得分:0)

考虑到可以在tcpip_adapter/tcpip_adapter_lwip.c中找到以下代码的事实

datetime.datetime

我认为处理IP_EVENT_AP_STAIPASSIGNED / SYSTEM_EVENT_AP_STAIPASSIGNED  并阅读event-> event_info.ap_staipassigned.ip.addr应该适合您的情况。

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

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);
}

已通过主版6fd535c测试。

答案 1 :(得分:0)

我最近下载了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);
}