ESP8266组网通信问题:客户端发送'alarm'出现ECONNABORTED错误
ESP8266客户端发送消息报错[Errno 103] ECONNABORTED的解决方法
使用两块ESP8266,一块创建AP无线网络,另一块作为客户端连接后发送"alarm"消息。AP端代码运行正常,客户端能成功连网,但发送消息时始终触发[Errno 103] ECONNABORTED错误。两端代码如下:
AP端代码
import network import socket from machine import Pin import time # LED引脚定义 led_pin = Pin(0, Pin.OUT) led_pin.on() led_pin2 = Pin(2, Pin.OUT) led_pin2.off() time.sleep(2) led_pin.off() led_pin2.on() # 关闭已激活的AP接口(如果存在) ap = network.WLAN(network.AP_IF) ap.active(False) # 初始化新的AP接口并配置参数 ap = network.WLAN(network.AP_IF) ap.active(True) ap.config(essid="Active", password="") print("AP热点配置完成。AP的IP地址:", ap.ifconfig()[0]) # 接收消息函数 def odbierz_dane(): print("等待客户端连接...") server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 初始化服务器套接字 server_socket.bind(('0.0.0.0', 8080)) # 绑定IP和端口 server_socket.listen(10) # 监听连接请求 print("服务器在8080端口监听") while True: conn, addr = server_socket.accept() # 接受连接 print('来自客户端的连接: %s' % str(addr)) request = conn.recv(1024) # 接收数据 received_data = request.decode('utf-8') print('收到数据: %s' % received_data) if received_data == "alarm": print("需要帮助") led_pin.on() conn.close() # 关闭连接 # 启动接收函数 print("启动数据接收函数...") odbierz_dane()
客户端代码
import network import socket import time # 发送告警消息函数 def wyslij_alarm(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) addr = ('192.168.4.1', 8080) # AP端的IP和端口 try: client_socket.connect(addr) # 尝试连接AP端 except OSError as e: print("连接服务器失败: %s" % str(e)) return try: message = "alarm" client_socket.send(message.encode('utf-8')) # 发送消息 print("已发送消息: %s" % message) except Exception as e: print("发送消息失败: %s" % str(e)) finally: client_socket.close() # 关闭套接字 # 连接AP热点 sta = network.WLAN(network.STA_IF) sta.active(True) sta.connect("Active", "") # AP的SSID和密码 while not sta.isconnected(): time.sleep(1) print("已连接到AP热点。客户端IP地址:", sta.ifconfig()[0]) # 发送"alarm"消息到AP端 wyslij_alarm()
错误原因及解决办法
错误原因
ECONNABORTED表示连接被AP端主动终止,核心问题是AP端在接收数据后立即关闭连接,而客户端的send操作可能还未完成网络传输,导致连接中断报错。
解决办法
方法1:AP端发送确认响应后再关闭连接
修改AP端odbierz_dane函数,在处理完数据后添加响应发送逻辑,确保客户端收到确认后再关闭连接:
# 在AP端的if判断后添加 conn.send("已接收消息".encode('utf-8')) conn.close()
同时在客户端wyslij_alarm函数的send之后添加接收响应的代码:
# 发送消息后添加 response = client_socket.recv(1024) print("服务器响应:", response.decode('utf-8'))
方法2:客户端发送后延时再关闭连接
修改客户端的finally块,增加短暂延时,给数据传输留出时间:
finally: time.sleep(0.1) # 延时100毫秒确保数据发送完成 client_socket.close()
方法3:验证AP端IP地址正确性
确保客户端代码中填写的AP端IP与AP端启动时打印的IP一致,部分场景下AP的IP可能不是默认的192.168.4.1。
内容的提问来源于stack exchange,提问作者Mateusznr 7
相关产品推荐
相关产品推荐

