ESP8266修改AP模式下IP地址
修改IP地址
方法一:tcpip_adapter_init
在ESP8266_RTOS下初始化wifi时需要调用初始化tcpip函数tcpip_adapter_init()
AP模式下的IP地址就是在这个函数中设置的,所以修改ESP8266下AP模式的IP的第一个方法是直接在该函数中修改IP地址。
注意:如果在这里修改IP,会导致所有工程的IP都被修改,因为这是全局的组件
void tcpip_adapter_init(void)
{
if (tcpip_inited == false) {
tcpip_inited = true;
tcpip_init(NULL, NULL);
memset(esp_ip, 0, sizeof(tcpip_adapter_ip_info_t)*TCPIP_ADAPTER_IF_MAX);
memset(esp_ip_old, 0, sizeof(tcpip_adapter_ip_info_t)*TCPIP_ADAPTER_IF_MAX);
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].ip, 192, 168 , 4, 1);
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].gw, 192, 168 , 4, 1);
IP4_ADDR(&esp_ip[TCPIP_ADAPTER_IF_AP].netmask, 255, 255 , 255, 0);
dhcp_check_timer = xTimerCreate("check_dhcp", 500 / portTICK_RATE_MS, true, NULL, tcpip_adapter_dhcpc_done);
if (!dhcp_check_timer) {
ESP_LOGI(TAG, "TCPIP adapter timer create error");
}
}
}
方法二:IP4_ADDR
在 tcpip_adapter_init() 中可以看到,SDK是通过宏定义的IP4_ADDR设置IP地址,所以参考调用即可修改IP地址。
在设置IP前需要先停止DHCP服务器,在设置完毕后再开启,才会使用新设置的IP网段进行分配。
注意:IP地址的修改要在tcpip_adapter_init()调用后执行,否则会被函数中设置的默认地址覆盖
static void set_ipv4_address(){
tcpip_adapter_ip_info_t local_ip;
tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP);
IP4_ADDR(&local_ip.ip, 10, 10 , 100, 254);
IP4_ADDR(&local_ip.gw, 10, 10 , 100, 254);
IP4_ADDR(&local_ip.netmask, 255, 255 , 255, 0);
tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_AP, &local_ip);
tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_AP);
}
修改主机名
调用 tcpip_adapter_set_hostname即可修改AP模式下的主机名
函数定义如下
esp_err_t tcpip_adapter_set_hostname(tcpip_adapter_if_t tcpip_if, const char *hostname)
{
#if LWIP_NETIF_HOSTNAME
struct netif *p_netif;
static char hostinfo[TCPIP_ADAPTER_IF_MAX][TCPIP_HOSTNAME_MAX_SIZE + 1];
if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || hostname == NULL) {
return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
}
if (strlen(hostname) > TCPIP_HOSTNAME_MAX_SIZE) {
return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
}
p_netif = esp_netif[tcpip_if];
if (p_netif != NULL) {
memset(hostinfo[tcpip_if], 0, sizeof(hostinfo[tcpip_if]));
strlcpy(hostinfo[tcpip_if], hostname, sizeof(hostinfo[tcpip_if]));
p_netif->hostname = hostinfo[tcpip_if];
return ESP_OK;
} else {
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
}
#else
return ESP_ERR_TCPIP_ADAPTER_IF_NOT_READY;
#endif
}
参考链接
https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/tcpip/tcpip_adapter.html