You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32通过AT指令为ESP8266设置主机名遇阻求助

ESP8266通过AT指令设置主机名实现无IP访问问题解决

问题背景

STM32通过UART与ESP8266通信正常,可切换STA/AP模式并完成WiFi连接,但每次访问ESP8266的网页服务都需要手动查询IP并输入,操作繁琐。尝试过相关AT指令均失败,具体报错如下:

  • AT+MDNS=1, my_test, iot, 80 → 回复:get hostname fail when mdns
  • AT+CWHOSTNAME=my_test → 回复:ERROR
  • AT+CWHOSTNAME? → 回复:ERROR

问题分析

出现上述报错的核心原因通常有两个:

  1. ESP8266的AT固件版本不支持对应指令:旧版AT固件可能没有CWHOSTNAME和MDNS相关指令,或者指令格式与使用的不符。
  2. 指令执行顺序错误:MDNS和主机名设置需要在WiFi模式配置完成后执行,且部分指令需要特定前置条件(比如MDNS需要先启用多连接模式)。

解决方案

步骤1:确认并升级ESP8266的AT固件

优先使用官方最新版的AT固件(需包含MDNS和主机名支持),通过ESP官方烧录工具完成固件升级。

步骤2:修正AT指令执行顺序与格式

以下是调整后的指令流程,适用于STA和AP模式:

通用前置步骤

Uart_sendstring("AT+RST\r\n", wifi_uart);
HAL_Delay(5000); // 重启后等待5秒

Uart_flush(wifi_uart);
Uart_sendstring("AT\r\n", wifi_uart);
while(!(Wait_for("OK\r\n", wifi_uart)));

STA模式(连接WiFi)流程

if (AP == CONNECT_AP)
{
    // 1. 设置WiFi模式为STA
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CWMODE=1\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 2. 连接目标WiFi
    Uart_flush(wifi_uart);
    sprintf (data, "AT+CWJAP=\"%s\",\"%s\"\r\n", SSID, PASSWD);
    Uart_sendstring(data, wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 3. 设置主机名(部分固件需在连接WiFi后执行)
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CWHOSTNAME=\"my_test\"\r\n", wifi_uart); // 主机名需用双引号包裹
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 4. 启用MDNS服务
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+MDNS=1,\"my_test\",\"iot\",80\r\n", wifi_uart); // 参数需加双引号
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 5. 开启多连接模式与服务器
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CIPMUX=1\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CIPSERVER=1,80\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));
}

AP模式(开启热点)流程

else if (AP == OPEN_AP)
{
    // 1. 设置WiFi模式为AP
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CWMODE=2\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 2. 配置AP参数
    Uart_flush(wifi_uart);
    sprintf (data, "AT+CWSAP=\"%s\",\"%s\",%d,%d\r\n", SSID, PASSWD, 11, 3);
    Uart_sendstring(data, wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 3. 设置主机名
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CWHOSTNAME=\"my_test\"\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 4. 启用MDNS服务
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+MDNS=1,\"my_test\",\"iot\",80\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    // 5. 开启多连接模式与服务器
    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CIPMUX=1\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));

    Uart_flush(wifi_uart);
    Uart_sendstring("AT+CIPSERVER=1,80\r\n", wifi_uart);
    while (!(Wait_for("OK\r\n", wifi_uart)));
}

关键注意点

  • 指令格式:AT+CWHOSTNAME和AT+MDNS的参数必须用双引号包裹,旧版固件对格式要求严格。
  • 执行顺序:主机名和MDNS必须在WiFi模式配置完成(STA连接成功/AP启动完成)后设置,否则会触发报错。
  • 固件兼容性:若仍报错,需确认固件是否支持MDNS功能,部分精简版AT固件会移除该功能,需刷入完整功能版固件。

验证方法

设置完成后,在同一局域网内的浏览器输入http://my_test.local即可访问ESP8266的网页服务。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:44:56