ESP8266调用socket.getaddrinfo持续返回OSError: -2问题求助
解决ESP8266上socket.getaddrinfo()报OSError: -2的问题
这个OSError: -2在MicroPython的ESP8266环境里,本质就是DNS解析失败——你的板子没法把域名smart-socket-bdcc5.firebaseio.com转换成对应的IP地址。PC上的Python能正常运行,是因为电脑的网络配置完全正常,但ESP8266这边存在网络相关的配置漏洞,我给你一步步排查解决:
- 第一步:先确认ESP8266真的连上WiFi了
很多时候我们以为连接成功,但实际可能密码错误、信号太弱或者没获取到有效IP。先跑这段代码验证:
import network wlan = network.WLAN(network.STA_IF) # 打印连接状态和网络配置 print("WiFi连接状态:", wlan.isconnected()) print("网络配置:", wlan.ifconfig())
如果isconnected()返回False,优先解决WiFi连接问题:确保SSID和密码正确,靠近路由器增强信号,用wlan.connect("你的WiFi名称", "你的WiFi密码")重新连接,直到返回True。
如果isconnected()是True,但ifconfig()里的最后一项(DNS地址)是0.0.0.0,说明设备没获取到DNS服务,这时候需要手动指定。
- 第二步:手动指定公共DNS服务器
DHCP自动分配的DNS可能无法解析Firebase的域名,我们直接换成公共DNS,比如谷歌的8.8.8.8或者国内的114.114.114.114:
# 格式:(静态IP, 子网掩码, 网关, DNS),需匹配你的局域网网段 wlan.ifconfig(('192.168.1.105', '255.255.255.0', '192.168.1.1', '8.8.8.8'))
注意:静态IP要选你局域网内未被占用的地址,网关填路由器的IP(比如大部分路由器是192.168.1.1或192.168.3.1)。
- 第三步:用IP地址直接测试(锁定问题根源)
先在你的PC上用nslookup smart-socket-bdcc5.firebaseio.com获取这个域名的实际IP,然后在ESP8266里用IP调用getaddrinfo:
import socket addr = socket.getaddrinfo('xxx.xxx.xxx.xxx', 443) # 替换成你查到的真实IP print(addr)
如果这能成功返回结果,就坐实了是DNS解析的问题,回到第二步优化配置即可;如果还是报错,可能是ESP8266的网络硬件或固件存在问题。
- 第四步:更新MicroPython固件(终极方案)
如果以上方法都无效,大概率是你使用的MicroPython固件版本过旧,存在DNS解析的已知bug。去MicroPython官网下载对应ESP8266的最新稳定版固件,重新刷入板子后再测试。
内容的提问来源于stack exchange,提问作者Alex Zaitsev
相关产品推荐
相关产品推荐

