我想获取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;
}
答案 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);
}