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 mdnsAT+CWHOSTNAME=my_test→ 回复:ERRORAT+CWHOSTNAME?→ 回复:ERROR
问题分析
出现上述报错的核心原因通常有两个:
- ESP8266的AT固件版本不支持对应指令:旧版AT固件可能没有
CWHOSTNAME和MDNS相关指令,或者指令格式与使用的不符。 - 指令执行顺序错误: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
相关产品推荐
相关产品推荐

